diff --git a/generated/googleapis/lib/abusiveexperiencereport/v1.dart b/generated/googleapis/lib/abusiveexperiencereport/v1.dart
index f4bebe3..bab3604 100644
--- a/generated/googleapis/lib/abusiveexperiencereport/v1.dart
+++ b/generated/googleapis/lib/abusiveexperiencereport/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -204,7 +203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (abusiveStatus != null) 'abusiveStatus': abusiveStatus!,
         if (enforcementTime != null) 'enforcementTime': enforcementTime!,
         if (filterStatus != null) 'filterStatus': filterStatus!,
@@ -231,7 +230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (violatingSites != null)
           'violatingSites':
               violatingSites!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/acceleratedmobilepageurl/v1.dart b/generated/googleapis/lib/acceleratedmobilepageurl/v1.dart
index 3541be5..9bca1ac 100644
--- a/generated/googleapis/lib/acceleratedmobilepageurl/v1.dart
+++ b/generated/googleapis/lib/acceleratedmobilepageurl/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -122,7 +121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ampUrl != null) 'ampUrl': ampUrl!,
         if (cdnAmpUrl != null) 'cdnAmpUrl': cdnAmpUrl!,
         if (originalUrl != null) 'originalUrl': originalUrl!,
@@ -168,7 +167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorCode != null) 'errorCode': errorCode!,
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (originalUrl != null) 'originalUrl': originalUrl!,
@@ -209,7 +208,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lookupStrategy != null) 'lookupStrategy': lookupStrategy!,
         if (urls != null) 'urls': urls!,
       };
@@ -244,7 +243,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ampUrls != null)
           'ampUrls': ampUrls!.map((value) => value.toJson()).toList(),
         if (urlErrors != null)
diff --git a/generated/googleapis/lib/accessapproval/v1.dart b/generated/googleapis/lib/accessapproval/v1.dart
index d1ce4b9..b5c9415 100644
--- a/generated/googleapis/lib/accessapproval/v1.dart
+++ b/generated/googleapis/lib/accessapproval/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1155,7 +1154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enrolledAncestor != null) 'enrolledAncestor': enrolledAncestor!,
         if (enrolledServices != null)
           'enrolledServices':
@@ -1198,7 +1197,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (principalOfficeCountry != null)
           'principalOfficeCountry': principalOfficeCountry!,
         if (principalPhysicalLocationCountry != null)
@@ -1240,7 +1239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detail != null) 'detail': detail!,
         if (type != null) 'type': type!,
       };
@@ -1326,7 +1325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approve != null) 'approve': approve!.toJson(),
         if (dismiss != null) 'dismiss': dismiss!.toJson(),
         if (name != null) 'name': name!,
@@ -1357,7 +1356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expireTime != null) 'expireTime': expireTime!,
       };
 }
@@ -1381,7 +1380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approveTime != null) 'approveTime': approveTime!,
         if (expireTime != null) 'expireTime': expireTime!,
       };
@@ -1395,7 +1394,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A decision that has been made to dismiss an approval request.
@@ -1419,7 +1418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dismissTime != null) 'dismissTime': dismissTime!,
         if (implicit != null) 'implicit': implicit!,
       };
@@ -1439,7 +1438,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents the enrollment of a cloud resource into a specific service.
@@ -1480,7 +1479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudProduct != null) 'cloudProduct': cloudProduct!,
         if (enrollmentLevel != null) 'enrollmentLevel': enrollmentLevel!,
       };
@@ -1508,7 +1507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approvalRequests != null)
           'approvalRequests':
               approvalRequests!.map((value) => value.toJson()).toList(),
@@ -1530,7 +1529,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludesDescendants != null)
           'excludesDescendants': excludesDescendants!,
       };
diff --git a/generated/googleapis/lib/accesscontextmanager/v1.dart b/generated/googleapis/lib/accesscontextmanager/v1.dart
index 2bc1417..bbab178 100644
--- a/generated/googleapis/lib/accesscontextmanager/v1.dart
+++ b/generated/googleapis/lib/accesscontextmanager/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1434,7 +1433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basic != null) 'basic': basic!.toJson(),
         if (custom != null) 'custom': custom!.toJson(),
         if (description != null) 'description': description!,
@@ -1498,7 +1497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (name != null) 'name': name!,
         if (parent != null) 'parent': parent!,
@@ -1537,7 +1536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (methodSelectors != null)
           'methodSelectors':
               methodSelectors!.map((value) => value.toJson()).toList(),
@@ -1579,7 +1578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (combiningFunction != null) 'combiningFunction': combiningFunction!,
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
@@ -1594,7 +1593,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A request to commit dry-run specs in all Service Perimeters belonging to an
@@ -1620,7 +1619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
       };
 }
@@ -1643,7 +1642,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (servicePerimeters != null)
           'servicePerimeters':
               servicePerimeters!.map((value) => value.toJson()).toList(),
@@ -1734,7 +1733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devicePolicy != null) 'devicePolicy': devicePolicy!.toJson(),
         if (ipSubnetworks != null) 'ipSubnetworks': ipSubnetworks!,
         if (members != null) 'members': members!,
@@ -1764,7 +1763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expr != null) 'expr': expr!.toJson(),
       };
 }
@@ -1834,7 +1833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedDeviceManagementLevels != null)
           'allowedDeviceManagementLevels': allowedDeviceManagementLevels!,
         if (allowedEncryptionStatuses != null)
@@ -1891,7 +1890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identities != null) 'identities': identities!,
         if (identityType != null) 'identityType': identityType!,
       };
@@ -1933,7 +1932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (egressFrom != null) 'egressFrom': egressFrom!.toJson(),
         if (egressTo != null) 'egressTo': egressTo!.toJson(),
       };
@@ -1976,7 +1975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
         if (resources != null) 'resources': resources!,
@@ -1997,7 +1996,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -2061,7 +2060,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2119,7 +2118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevels != null) 'accessLevels': accessLevels!,
         if (groupKey != null) 'groupKey': groupKey!,
         if (name != null) 'name': name!,
@@ -2173,7 +2172,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identities != null) 'identities': identities!,
         if (identityType != null) 'identityType': identityType!,
         if (sources != null)
@@ -2215,7 +2214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingressFrom != null) 'ingressFrom': ingressFrom!.toJson(),
         if (ingressTo != null) 'ingressTo': ingressTo!.toJson(),
       };
@@ -2254,7 +2253,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevel != null) 'accessLevel': accessLevel!,
         if (resource != null) 'resource': resource!,
       };
@@ -2295,7 +2294,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
         if (resources != null) 'resources': resources!,
@@ -2326,7 +2325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevels != null)
           'accessLevels': accessLevels!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2357,7 +2356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessPolicies != null)
           'accessPolicies':
               accessPolicies!.map((value) => value.toJson()).toList(),
@@ -2389,7 +2388,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcpUserAccessBindings != null)
           'gcpUserAccessBindings':
               gcpUserAccessBindings!.map((value) => value.toJson()).toList(),
@@ -2419,7 +2418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -2450,7 +2449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (servicePerimeters != null)
           'servicePerimeters':
@@ -2482,7 +2481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (method != null) 'method': method!,
         if (permission != null) 'permission': permission!,
       };
@@ -2542,29 +2541,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2616,7 +2613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minimumVersion != null) 'minimumVersion': minimumVersion!,
         if (osType != null) 'osType': osType!,
         if (requireVerifiedChromeOs != null)
@@ -2661,7 +2658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevels != null)
           'accessLevels': accessLevels!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -2686,7 +2683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevels != null)
           'accessLevels': accessLevels!.map((value) => value.toJson()).toList(),
       };
@@ -2729,7 +2726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (servicePerimeters != null)
           'servicePerimeters':
@@ -2755,7 +2752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (servicePerimeters != null)
           'servicePerimeters':
               servicePerimeters!.map((value) => value.toJson()).toList(),
@@ -2861,7 +2858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (name != null) 'name': name!,
         if (perimeterType != null) 'perimeterType': perimeterType!,
@@ -2955,7 +2952,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevels != null) 'accessLevels': accessLevels!,
         if (egressPolicies != null)
           'egressPolicies':
@@ -3004,8 +3001,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3018,7 +3015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -3052,7 +3049,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedServices != null) 'allowedServices': allowedServices!,
         if (enableRestriction != null) 'enableRestriction': enableRestriction!,
       };
diff --git a/generated/googleapis/lib/adexchangebuyer/v1_3.dart b/generated/googleapis/lib/adexchangebuyer/v1_3.dart
index 665c993..6f23f03 100644
--- a/generated/googleapis/lib/adexchangebuyer/v1_3.dart
+++ b/generated/googleapis/lib/adexchangebuyer/v1_3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1011,7 +1010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maximumQps != null) 'maximumQps': maximumQps!,
         if (region != null) 'region': region!,
         if (url != null) 'url': url!,
@@ -1084,7 +1083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidderLocation != null)
           'bidderLocation':
               bidderLocation!.map((value) => value.toJson()).toList(),
@@ -1125,7 +1124,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -1168,7 +1167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (accountName != null) 'accountName': accountName!,
         if (billingId != null) 'billingId': billingId!,
@@ -1201,7 +1200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -1261,7 +1260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (billingId != null) 'billingId': billingId!,
         if (budgetAmount != null) 'budgetAmount': budgetAmount!,
@@ -1308,7 +1307,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedProviderIds != null)
           'detectedProviderIds': detectedProviderIds!,
         if (hasUnidentifiedProvider != null)
@@ -1336,7 +1335,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!,
         if (reason != null) 'reason': reason!,
       };
@@ -1362,7 +1361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!,
         if (reason != null) 'reason': reason!,
       };
@@ -1390,7 +1389,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filteringCount != null) 'filteringCount': filteringCount!,
         if (filteringStatus != null) 'filteringStatus': filteringStatus!,
       };
@@ -1423,7 +1422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!,
         if (reasons != null)
           'reasons': reasons!.map((value) => value.toJson()).toList(),
@@ -1450,7 +1449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (url != null) 'url': url!,
         if (width != null) 'width': width!,
@@ -1477,7 +1476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (url != null) 'url': url!,
         if (width != null) 'width': width!,
@@ -1504,7 +1503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (url != null) 'url': url!,
         if (width != null) 'width': width!,
@@ -1590,7 +1589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiser != null) 'advertiser': advertiser!,
         if (appIcon != null) 'appIcon': appIcon!.toJson(),
         if (body != null) 'body': body!,
@@ -1816,7 +1815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (HTMLSnippet != null) 'HTMLSnippet': HTMLSnippet!,
         if (accountId != null) 'accountId': accountId!,
         if (adTechnologyProviders != null)
@@ -1888,7 +1887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -2013,7 +2012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiser != null) 'advertiser': advertiser!,
         if (allowsAlcohol != null) 'allowsAlcohol': allowsAlcohol!,
@@ -2060,7 +2059,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directDeals != null)
           'directDeals': directDeals!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -2244,7 +2243,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidRate != null) 'bidRate': bidRate!,
         if (bidRequestRate != null) 'bidRequestRate': bidRequestRate!,
         if (calloutStatusRate != null) 'calloutStatusRate': calloutStatusRate!,
@@ -2305,7 +2304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (performanceReport != null)
           'performanceReport':
@@ -2331,7 +2330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (width != null) 'width': width!,
       };
@@ -2359,7 +2358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (token != null) 'token': token!,
         if (type != null) 'type': type!,
       };
@@ -2387,7 +2386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (token != null) 'token': token!,
         if (type != null) 'type': type!,
       };
@@ -2625,7 +2624,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingId != null) 'billingId': billingId!,
         if (configId != null) 'configId': configId!,
         if (configName != null) 'configName': configName!,
@@ -2682,7 +2681,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
diff --git a/generated/googleapis/lib/adexchangebuyer/v1_4.dart b/generated/googleapis/lib/adexchangebuyer/v1_4.dart
index 258e152..406e72c 100644
--- a/generated/googleapis/lib/adexchangebuyer/v1_4.dart
+++ b/generated/googleapis/lib/adexchangebuyer/v1_4.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1825,7 +1824,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidProtocol != null) 'bidProtocol': bidProtocol!,
         if (maximumQps != null) 'maximumQps': maximumQps!,
         if (region != null) 'region': region!,
@@ -1911,7 +1910,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applyPretargetingToNonGuaranteedDeals != null)
           'applyPretargetingToNonGuaranteedDeals':
               applyPretargetingToNonGuaranteedDeals!,
@@ -1955,7 +1954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -1989,7 +1988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deals != null)
           'deals': deals!.map((value) => value.toJson()).toList(),
         if (proposalRevisionNumber != null)
@@ -2019,7 +2018,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deals != null)
           'deals': deals!.map((value) => value.toJson()).toList(),
         if (proposalRevisionNumber != null)
@@ -2042,7 +2041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notes != null)
           'notes': notes!.map((value) => value.toJson()).toList(),
       };
@@ -2062,7 +2061,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notes != null)
           'notes': notes!.map((value) => value.toJson()).toList(),
       };
@@ -2104,7 +2103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (accountName != null) 'accountName': accountName!,
         if (billingId != null) 'billingId': billingId!,
@@ -2137,7 +2136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -2197,7 +2196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (billingId != null) 'billingId': billingId!,
         if (budgetAmount != null) 'budgetAmount': budgetAmount!,
@@ -2219,7 +2218,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
       };
 }
@@ -2242,7 +2241,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (name != null) 'name': name!,
       };
@@ -2269,7 +2268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (proposals != null)
           'proposals': proposals!.map((value) => value.toJson()).toList(),
         if (webPropertyCode != null) 'webPropertyCode': webPropertyCode!,
@@ -2291,7 +2290,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (proposals != null)
           'proposals': proposals!.map((value) => value.toJson()).toList(),
       };
@@ -2334,7 +2333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedProviderIds != null)
           'detectedProviderIds': detectedProviderIds!,
         if (hasUnidentifiedProvider != null)
@@ -2384,7 +2383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auctionType != null) 'auctionType': auctionType!,
         if (contextType != null) 'contextType': contextType!,
         if (geoCriteriaId != null) 'geoCriteriaId': geoCriteriaId!,
@@ -2422,7 +2421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contexts != null)
           'contexts': contexts!.map((value) => value.toJson()).toList(),
         if (details != null) 'details': details!,
@@ -2450,7 +2449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filteringCount != null) 'filteringCount': filteringCount!,
         if (filteringStatus != null) 'filteringStatus': filteringStatus!,
       };
@@ -2483,7 +2482,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!,
         if (reasons != null)
           'reasons': reasons!.map((value) => value.toJson()).toList(),
@@ -2510,7 +2509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (url != null) 'url': url!,
         if (width != null) 'width': width!,
@@ -2537,7 +2536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (url != null) 'url': url!,
         if (width != null) 'width': width!,
@@ -2564,7 +2563,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (url != null) 'url': url!,
         if (width != null) 'width': width!,
@@ -2667,7 +2666,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiser != null) 'advertiser': advertiser!,
         if (appIcon != null) 'appIcon': appIcon!.toJson(),
         if (body != null) 'body': body!,
@@ -2729,7 +2728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auctionType != null) 'auctionType': auctionType!,
         if (contextType != null) 'contextType': contextType!,
         if (geoCriteriaId != null) 'geoCriteriaId': geoCriteriaId!,
@@ -2757,7 +2756,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!,
         if (reason != null) 'reason': reason!,
       };
@@ -2801,7 +2800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contexts != null)
           'contexts': contexts!.map((value) => value.toJson()).toList(),
         if (disapprovalReasons != null)
@@ -3107,7 +3106,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (HTMLSnippet != null) 'HTMLSnippet': HTMLSnippet!,
         if (accountId != null) 'accountId': accountId!,
         if (adChoicesDestinationUrl != null)
@@ -3177,7 +3176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arcStatus != null) 'arcStatus': arcStatus!,
         if (dealId != null) 'dealId': dealId!,
         if (webPropertyId != null) 'webPropertyId': webPropertyId!,
@@ -3207,7 +3206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dealStatuses != null)
           'dealStatuses': dealStatuses!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3248,7 +3247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3280,7 +3279,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alcoholAdsAllowed != null) 'alcoholAdsAllowed': alcoholAdsAllowed!,
         if (dealPauseStatus != null)
           'dealPauseStatus': dealPauseStatus!.toJson(),
@@ -3321,7 +3320,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buyerPauseReason != null) 'buyerPauseReason': buyerPauseReason!,
         if (firstPausedBy != null) 'firstPausedBy': firstPausedBy!,
         if (hasBuyerPaused != null) 'hasBuyerPaused': hasBuyerPaused!,
@@ -3415,7 +3414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (brandingType != null) 'brandingType': brandingType!,
         if (crossListedExternalDealIdType != null)
           'crossListedExternalDealIdType': crossListedExternalDealIdType!,
@@ -3489,7 +3488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingInfo != null) 'billingInfo': billingInfo!.toJson(),
         if (fixedPrices != null)
           'fixedPrices': fixedPrices!.map((value) => value.toJson()).toList(),
@@ -3546,7 +3545,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyConversionTimeMs != null)
           'currencyConversionTimeMs': currencyConversionTimeMs!,
         if (dfpLineItemId != null) 'dfpLineItemId': dfpLineItemId!,
@@ -3579,7 +3578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoOptimizePrivateAuction != null)
           'autoOptimizePrivateAuction': autoOptimizePrivateAuction!,
         if (reservePricePerBuyers != null)
@@ -3603,7 +3602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixedPrices != null)
           'fixedPrices': fixedPrices!.map((value) => value.toJson()).toList(),
       };
@@ -3629,7 +3628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (priorityPrice != null) 'priorityPrice': priorityPrice!.toJson(),
         if (standardPrice != null) 'standardPrice': standardPrice!.toJson(),
       };
@@ -3661,7 +3660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dealIds != null) 'dealIds': dealIds!,
         if (proposalRevisionNumber != null)
           'proposalRevisionNumber': proposalRevisionNumber!,
@@ -3690,7 +3689,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deals != null)
           'deals': deals!.map((value) => value.toJson()).toList(),
         if (proposalRevisionNumber != null)
@@ -3721,7 +3720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeBlockingLevel != null)
           'creativeBlockingLevel': creativeBlockingLevel!,
         if (deliveryRateType != null) 'deliveryRateType': deliveryRateType!,
@@ -3750,7 +3749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxImpressions != null) 'maxImpressions': maxImpressions!,
         if (numTimeUnits != null) 'numTimeUnits': numTimeUnits!,
         if (timeUnitType != null) 'timeUnitType': timeUnitType!,
@@ -3780,7 +3779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionType != null) 'dimensionType': dimensionType!,
         if (dimensionValues != null)
           'dimensionValues':
@@ -3820,7 +3819,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (percentage != null) 'percentage': percentage!,
@@ -3876,7 +3875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deals != null)
           'deals': deals!.map((value) => value.toJson()).toList(),
         if (proposal != null) 'proposal': proposal!.toJson(),
@@ -3907,7 +3906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deals != null)
           'deals': deals!.map((value) => value.toJson()).toList(),
         if (orderRevisionNumber != null)
@@ -3930,7 +3929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (products != null)
           'products': products!.map((value) => value.toJson()).toList(),
       };
@@ -3951,7 +3950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deals != null)
           'deals': deals!.map((value) => value.toJson()).toList(),
       };
@@ -3976,7 +3975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notes != null)
           'notes': notes!.map((value) => value.toJson()).toList(),
       };
@@ -3997,7 +3996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (proposals != null)
           'proposals': proposals!.map((value) => value.toJson()).toList(),
       };
@@ -4019,7 +4018,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (profiles != null)
           'profiles': profiles!.map((value) => value.toJson()).toList(),
       };
@@ -4238,7 +4237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buyerPrivateData != null)
           'buyerPrivateData': buyerPrivateData!.toJson(),
         if (creationTimeMs != null) 'creationTimeMs': creationTimeMs!,
@@ -4306,7 +4305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buyer != null) 'buyer': buyer!.toJson(),
         if (seller != null) 'seller': seller!.toJson(),
       };
@@ -4344,7 +4343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (createTimeMs != null) 'createTimeMs': createTimeMs!,
         if (deprecatedMarketplaceDealParty != null)
@@ -4427,7 +4426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creatorRole != null) 'creatorRole': creatorRole!,
         if (dealId != null) 'dealId': dealId!,
         if (kind != null) 'kind': kind!,
@@ -4455,7 +4454,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appStore != null) 'appStore': appStore!,
         if (externalAppId != null) 'externalAppId': externalAppId!,
       };
@@ -4638,7 +4637,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidRate != null) 'bidRate': bidRate!,
         if (bidRequestRate != null) 'bidRequestRate': bidRequestRate!,
         if (calloutStatusRate != null) 'calloutStatusRate': calloutStatusRate!,
@@ -4699,7 +4698,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (performanceReport != null)
           'performanceReport':
@@ -4725,7 +4724,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (width != null) 'width': width!,
       };
@@ -4753,7 +4752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (token != null) 'token': token!,
         if (type != null) 'type': type!,
       };
@@ -4781,7 +4780,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (token != null) 'token': token!,
         if (type != null) 'type': type!,
       };
@@ -4817,7 +4816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aspectRatio != null) 'aspectRatio': aspectRatio!,
         if (minHeight != null) 'minHeight': minHeight!,
         if (minWidth != null) 'minWidth': minWidth!,
@@ -5091,7 +5090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingId != null) 'billingId': billingId!,
         if (configId != null) 'configId': configId!,
         if (configName != null) 'configName': configName!,
@@ -5155,7 +5154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5192,7 +5191,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amountMicros != null) 'amountMicros': amountMicros!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (expectedCpmMicros != null) 'expectedCpmMicros': expectedCpmMicros!,
@@ -5242,7 +5241,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auctionTier != null) 'auctionTier': auctionTier!,
         if (billedBuyer != null) 'billedBuyer': billedBuyer!.toJson(),
         if (buyer != null) 'buyer': buyer!.toJson(),
@@ -5272,7 +5271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (referenceId != null) 'referenceId': referenceId!,
         if (referencePayload != null) 'referencePayload': referencePayload!,
       };
@@ -5519,7 +5518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billedBuyer != null) 'billedBuyer': billedBuyer!.toJson(),
         if (buyer != null) 'buyer': buyer!.toJson(),
         if (creationTimeMs != null) 'creationTimeMs': creationTimeMs!,
@@ -5764,7 +5763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billedBuyer != null) 'billedBuyer': billedBuyer!.toJson(),
         if (buyer != null) 'buyer': buyer!.toJson(),
         if (buyerContacts != null)
@@ -5973,7 +5972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audience != null) 'audience': audience!,
         if (buyerPitchStatement != null)
           'buyerPitchStatement': buyerPitchStatement!,
@@ -6037,7 +6036,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null)
           'dimensions': dimensions!.map((value) => value.toJson()).toList(),
         if (weeklyImpressions != null) 'weeklyImpressions': weeklyImpressions!,
@@ -6066,7 +6065,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (subAccountId != null) 'subAccountId': subAccountId!,
       };
@@ -6106,7 +6105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclusions != null)
           'exclusions': exclusions!.map((value) => value.toJson()).toList(),
         if (inclusions != null)
@@ -6169,7 +6168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeSizeValue != null)
           'creativeSizeValue': creativeSizeValue!.toJson(),
         if (dayPartTargetingValue != null)
@@ -6236,7 +6235,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedFormats != null) 'allowedFormats': allowedFormats!,
         if (companionSizes != null)
           'companionSizes':
@@ -6267,7 +6266,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dayParts != null)
           'dayParts': dayParts!.map((value) => value.toJson()).toList(),
         if (timeZoneType != null) 'timeZoneType': timeZoneType!,
@@ -6301,7 +6300,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dayOfWeek != null) 'dayOfWeek': dayOfWeek!,
         if (endHour != null) 'endHour': endHour!,
         if (endMinute != null) 'endMinute': endMinute!,
@@ -6323,7 +6322,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (demogAgeCriteriaIds != null)
           'demogAgeCriteriaIds': demogAgeCriteriaIds!,
       };
@@ -6342,7 +6341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (demogGenderCriteriaIds != null)
           'demogGenderCriteriaIds': demogGenderCriteriaIds!,
       };
@@ -6361,7 +6360,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestPlatforms != null) 'requestPlatforms': requestPlatforms!,
       };
 }
@@ -6384,7 +6383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (width != null) 'width': width!,
       };
@@ -6421,7 +6420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (externalDealId != null) 'externalDealId': externalDealId!,
         if (note != null) 'note': note!.toJson(),
         if (proposalRevisionNumber != null)
diff --git a/generated/googleapis/lib/adexperiencereport/v1.dart b/generated/googleapis/lib/adexperiencereport/v1.dart
index 56cef53..381b7f6 100644
--- a/generated/googleapis/lib/adexperiencereport/v1.dart
+++ b/generated/googleapis/lib/adexperiencereport/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -211,7 +210,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (betterAdsStatus != null) 'betterAdsStatus': betterAdsStatus!,
         if (enforcementTime != null) 'enforcementTime': enforcementTime!,
         if (filterStatus != null) 'filterStatus': filterStatus!,
@@ -249,7 +248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (desktopSummary != null) 'desktopSummary': desktopSummary!.toJson(),
         if (mobileSummary != null) 'mobileSummary': mobileSummary!.toJson(),
         if (reviewedSite != null) 'reviewedSite': reviewedSite!,
@@ -272,7 +271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (violatingSites != null)
           'violatingSites':
               violatingSites!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/admin/datatransfer_v1.dart b/generated/googleapis/lib/admin/datatransfer_v1.dart
index 90417f7..79a9983 100644
--- a/generated/googleapis/lib/admin/datatransfer_v1.dart
+++ b/generated/googleapis/lib/admin/datatransfer_v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -334,7 +333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -381,7 +380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicationId != null) 'applicationId': applicationId!,
         if (applicationTransferParams != null)
           'applicationTransferParams': applicationTransferParams!
@@ -417,7 +416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -458,7 +457,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applications != null)
           'applications': applications!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -534,7 +533,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicationDataTransfers != null)
           'applicationDataTransfers':
               applicationDataTransfers!.map((value) => value.toJson()).toList(),
@@ -583,7 +582,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataTransfers != null)
           'dataTransfers':
               dataTransfers!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/admin/directory_v1.dart b/generated/googleapis/lib/admin/directory_v1.dart
index d34171c..1005cf6 100644
--- a/generated/googleapis/lib/admin/directory_v1.dart
+++ b/generated/googleapis/lib/admin/directory_v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -5566,7 +5565,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alias != null) 'alias': alias!,
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -5601,7 +5600,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliases != null) 'aliases': aliases!,
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
@@ -5671,7 +5670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (codeId != null) 'codeId': codeId!,
         if (creationTime != null) 'creationTime': creationTime!,
         if (etag != null) 'etag': etag!,
@@ -5711,7 +5710,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -5794,7 +5793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!.toJson(),
         if (buildingId != null) 'buildingId': buildingId!,
         if (buildingName != null) 'buildingName': buildingName!,
@@ -5874,7 +5873,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressLines != null) 'addressLines': addressLines!,
         if (administrativeArea != null)
           'administrativeArea': administrativeArea!,
@@ -5905,7 +5904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
@@ -5948,7 +5947,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buildings != null)
           'buildings': buildings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -6069,7 +6068,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buildingId != null) 'buildingId': buildingId!,
         if (capacity != null) 'capacity': capacity!,
         if (etags != null) 'etags': etags!,
@@ -6131,7 +6130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -6201,13 +6200,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('payload')) {
       payload = _json['payload'] as core.bool;
@@ -6226,7 +6224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (expiration != null) 'expiration': expiration!,
         if (id != null) 'id': id!,
@@ -6258,7 +6256,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeTime != null) 'activeTime': activeTime!,
         if (date != null)
           'date':
@@ -6284,7 +6282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
         if (temperature != null) 'temperature': temperature!,
       };
@@ -6320,7 +6318,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpuTemperatureInfo != null)
           'cpuTemperatureInfo':
               cpuTemperatureInfo!.map((value) => value.toJson()).toList(),
@@ -6360,7 +6358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!.toIso8601String(),
         if (downloadUrl != null) 'downloadUrl': downloadUrl!,
         if (name != null) 'name': name!,
@@ -6392,7 +6390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (storageFree != null) 'storageFree': storageFree!,
         if (storageTotal != null) 'storageTotal': storageTotal!,
         if (volumeId != null) 'volumeId': volumeId!,
@@ -6415,7 +6413,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (volumeInfo != null)
           'volumeInfo': volumeInfo!.map((value) => value.toJson()).toList(),
       };
@@ -6440,7 +6438,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (wanIpAddress != null) 'wanIpAddress': wanIpAddress!,
       };
@@ -6464,7 +6462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reportTime != null) 'reportTime': reportTime!.toIso8601String(),
         if (systemRamFreeInfo != null) 'systemRamFreeInfo': systemRamFreeInfo!,
       };
@@ -6518,7 +6516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (family != null) 'family': family!,
         if (firmwareVersion != null) 'firmwareVersion': firmwareVersion!,
         if (manufacturer != null) 'manufacturer': manufacturer!,
@@ -6847,7 +6845,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeTimeRanges != null)
           'activeTimeRanges':
               activeTimeRanges!.map((value) => value.toJson()).toList(),
@@ -6926,7 +6924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (deprovisionReason != null) 'deprovisionReason': deprovisionReason!,
       };
@@ -6968,7 +6966,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chromeosdevices != null)
           'chromeosdevices':
               chromeosdevices!.map((value) => value.toJson()).toList(),
@@ -6992,7 +6990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceIds != null) 'deviceIds': deviceIds!,
       };
 }
@@ -7073,7 +7071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateEmail != null) 'alternateEmail': alternateEmail!,
         if (customerCreationTime != null)
           'customerCreationTime': customerCreationTime!.toIso8601String(),
@@ -7160,7 +7158,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressLine1 != null) 'addressLine1': addressLine1!,
         if (addressLine2 != null) 'addressLine2': addressLine2!,
         if (addressLine3 != null) 'addressLine3': addressLine3!,
@@ -7254,7 +7252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commandExpireTime != null) 'commandExpireTime': commandExpireTime!,
         if (commandId != null) 'commandId': commandId!,
         if (commandResult != null) 'commandResult': commandResult!.toJson(),
@@ -7297,7 +7295,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (executeTime != null) 'executeTime': executeTime!,
         if (result != null) 'result': result!,
@@ -7344,7 +7342,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commandType != null) 'commandType': commandType!,
         if (payload != null) 'payload': payload!,
       };
@@ -7363,7 +7361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commandId != null) 'commandId': commandId!,
       };
 }
@@ -7416,7 +7414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (domainAliasName != null) 'domainAliasName': domainAliasName!,
         if (etag != null) 'etag': etag!,
@@ -7453,7 +7451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domainAliases != null)
           'domainAliases':
               domainAliases!.map((value) => value.toJson()).toList(),
@@ -7520,7 +7518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (domainAliases != null)
           'domainAliases':
@@ -7560,7 +7558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domains != null)
           'domains': domains!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -7593,7 +7591,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etags != null) 'etags': etags!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -7616,7 +7614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feature != null) 'feature': feature!.toJson(),
       };
 }
@@ -7633,7 +7631,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newName != null) 'newName': newName!,
       };
 }
@@ -7675,7 +7673,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (features != null)
           'features': features!.map((value) => value.toJson()).toList(),
@@ -7783,7 +7781,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminCreated != null) 'adminCreated': adminCreated!,
         if (aliases != null) 'aliases': aliases!,
         if (description != null) 'description': description!,
@@ -7832,7 +7830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (groups != null)
           'groups': groups!.map((value) => value.toJson()).toList(),
@@ -7916,7 +7914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deliverySettings != null) 'delivery_settings': deliverySettings!,
         if (email != null) 'email': email!,
         if (etag != null) 'etag': etag!,
@@ -7961,7 +7959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (members != null)
@@ -7987,7 +7985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isMember != null) 'isMember': isMember!,
       };
 }
@@ -8044,7 +8042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (packageName != null) 'packageName': packageName!,
         if (permission != null) 'permission': permission!,
@@ -8361,7 +8359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adbStatus != null) 'adbStatus': adbStatus!,
         if (applications != null)
           'applications': applications!.map((value) => value.toJson()).toList(),
@@ -8425,7 +8423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
       };
 }
@@ -8463,7 +8461,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (mobiledevices != null)
@@ -8568,7 +8566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockInheritance != null) 'blockInheritance': blockInheritance!,
         if (description != null) 'description': description!,
         if (etag != null) 'etag': etag!,
@@ -8610,7 +8608,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (organizationUnits != null)
@@ -8678,7 +8676,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childPrivileges != null)
           'childPrivileges':
               childPrivileges!.map((value) => value.toJson()).toList(),
@@ -8720,7 +8718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -8749,7 +8747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (type != null) 'type': type!,
       };
@@ -8776,7 +8774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (privilegeName != null) 'privilegeName': privilegeName!,
         if (serviceId != null) 'serviceId': serviceId!,
       };
@@ -8841,7 +8839,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (isSuperAdminRole != null) 'isSuperAdminRole': isSuperAdminRole!,
         if (isSystemRole != null) 'isSystemRole': isSystemRole!,
@@ -8906,7 +8904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedTo != null) 'assignedTo': assignedTo!,
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
@@ -8950,7 +8948,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -8992,7 +8990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -9049,7 +9047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (etag != null) 'etag': etag!,
         if (fields != null)
@@ -9088,7 +9086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxValue != null) 'maxValue': maxValue!,
         if (minValue != null) 'minValue': minValue!,
       };
@@ -9181,7 +9179,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (etag != null) 'etag': etag!,
         if (fieldId != null) 'fieldId': fieldId!,
@@ -9224,7 +9222,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (schemas != null)
@@ -9296,7 +9294,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (anonymous != null) 'anonymous': anonymous!,
         if (clientId != null) 'clientId': clientId!,
         if (displayText != null) 'displayText': displayText!,
@@ -9338,7 +9336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -9685,15 +9683,14 @@
       creationTime = core.DateTime.parse(_json['creationTime'] as core.String);
     }
     if (_json.containsKey('customSchemas')) {
-      customSchemas = (_json['customSchemas'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              UserCustomProperties.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      customSchemas =
+          (_json['customSchemas'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          UserCustomProperties.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('customerId')) {
       customerId = _json['customerId'] as core.String;
@@ -9819,7 +9816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addresses != null) 'addresses': addresses!,
         if (agreedToTerms != null) 'agreedToTerms': agreedToTerms!,
         if (aliases != null) 'aliases': aliases!,
@@ -9898,7 +9895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (value != null) 'value': value!,
       };
@@ -9998,7 +9995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (countryCode != null) 'countryCode': countryCode!,
         if (customType != null) 'customType': customType!,
@@ -10090,7 +10087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (customType != null) 'customType': customType!,
         if (primary != null) 'primary': primary!,
@@ -10123,7 +10120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customType != null) 'customType': customType!,
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
@@ -10157,7 +10154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressMeAs != null) 'addressMeAs': addressMeAs!,
         if (customGender != null) 'customGender': customGender!,
         if (type != null) 'type': type!,
@@ -10218,7 +10215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customProtocol != null) 'customProtocol': customProtocol!,
         if (customType != null) 'customType': customType!,
         if (im != null) 'im': im!,
@@ -10258,7 +10255,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customType != null) 'customType': customType!,
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
@@ -10290,7 +10287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customLanguage != null) 'customLanguage': customLanguage!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -10357,7 +10354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (area != null) 'area': area!,
         if (buildingId != null) 'buildingId': buildingId!,
         if (customType != null) 'customType': customType!,
@@ -10380,7 +10377,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!,
       };
 }
@@ -10414,7 +10411,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (familyName != null) 'familyName': familyName!,
         if (fullName != null) 'fullName': fullName!,
         if (givenName != null) 'givenName': givenName!,
@@ -10508,7 +10505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (costCenter != null) 'costCenter': costCenter!,
         if (customType != null) 'customType': customType!,
         if (department != null) 'department': department!,
@@ -10561,7 +10558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customType != null) 'customType': customType!,
         if (primary != null) 'primary': primary!,
         if (type != null) 'type': type!,
@@ -10644,7 +10641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (height != null) 'height': height!,
         if (id != null) 'id': id!,
@@ -10723,7 +10720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (gecos != null) 'gecos': gecos!,
         if (gid != null) 'gid': gid!,
@@ -10766,7 +10763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customType != null) 'customType': customType!,
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
@@ -10800,7 +10797,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expirationTimeUsec != null)
           'expirationTimeUsec': expirationTimeUsec!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
@@ -10820,7 +10817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (orgUnitPath != null) 'orgUnitPath': orgUnitPath!,
       };
 }
@@ -10861,7 +10858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customType != null) 'customType': customType!,
         if (primary != null) 'primary': primary!,
         if (type != null) 'type': type!,
@@ -10908,7 +10905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -10955,7 +10952,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (userId != null) 'userId': userId!,
@@ -10994,7 +10991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/admin/reports_v1.dart b/generated/googleapis/lib/admin/reports_v1.dart
index adf9274..12956fe 100644
--- a/generated/googleapis/lib/admin/reports_v1.dart
+++ b/generated/googleapis/lib/admin/reports_v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -952,7 +951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -999,7 +998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (callerType != null) 'callerType': callerType!,
         if (email != null) 'email': email!,
         if (key != null) 'key': key!,
@@ -1027,7 +1026,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameter != null)
           'parameter': parameter!.map((value) => value.toJson()).toList(),
       };
@@ -1048,7 +1047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameter != null)
           'parameter': parameter!.map((value) => value.toJson()).toList(),
       };
@@ -1121,7 +1120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (intValue != null) 'intValue': intValue!,
         if (messageValue != null) 'messageValue': messageValue!.toJson(),
@@ -1182,7 +1181,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
@@ -1226,7 +1225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicationName != null) 'applicationName': applicationName!,
         if (customerId != null) 'customerId': customerId!,
         if (time != null) 'time': time!.toIso8601String(),
@@ -1298,7 +1297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actor != null) 'actor': actor!.toJson(),
         if (etag != null) 'etag': etag!,
         if (events != null)
@@ -1373,13 +1372,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('payload')) {
       payload = _json['payload'] as core.bool;
@@ -1398,7 +1396,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (expiration != null) 'expiration': expiration!,
         if (id != null) 'id': id!,
@@ -1467,7 +1465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (intValue != null) 'intValue': intValue!,
         if (multiBoolValue != null) 'multiBoolValue': multiBoolValue!,
@@ -1534,7 +1532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerId != null) 'customerId': customerId!,
         if (entityId != null) 'entityId': entityId!,
         if (profileId != null) 'profileId': profileId!,
@@ -1592,8 +1590,8 @@
     }
     if (_json.containsKey('msgValue')) {
       msgValue = (_json['msgValue'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1609,7 +1607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (datetimeValue != null)
           'datetimeValue': datetimeValue!.toIso8601String(),
@@ -1673,7 +1671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!,
         if (entity != null) 'entity': entity!.toJson(),
         if (etag != null) 'etag': etag!,
@@ -1703,7 +1701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -1745,7 +1743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -1800,7 +1798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
diff --git a/generated/googleapis/lib/admob/v1.dart b/generated/googleapis/lib/admob/v1.dart
index c9a9208..a5e47e5 100644
--- a/generated/googleapis/lib/admob/v1.dart
+++ b/generated/googleapis/lib/admob/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -304,7 +303,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -338,7 +337,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!.toJson(),
         if (startDate != null) 'startDate': startDate!.toJson(),
       };
@@ -358,7 +357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reportSpec != null) 'reportSpec': reportSpec!.toJson(),
       };
 }
@@ -404,7 +403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (footer != null) 'footer': footer!.toJson(),
         if (header != null) 'header': header!.toJson(),
         if (row != null) 'row': row!.toJson(),
@@ -425,7 +424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reportSpec != null) 'reportSpec': reportSpec!.toJson(),
       };
 }
@@ -470,7 +469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (footer != null) 'footer': footer!.toJson(),
         if (header != null) 'header': header!.toJson(),
         if (row != null) 'row': row!.toJson(),
@@ -500,7 +499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null)
           'account': account!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -536,7 +535,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -644,7 +643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dateRange != null) 'dateRange': dateRange!.toJson(),
         if (dimensionFilters != null)
           'dimensionFilters':
@@ -709,7 +708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!,
         if (matchesAny != null) 'matchesAny': matchesAny!.toJson(),
       };
@@ -798,7 +797,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!,
         if (metric != null) 'metric': metric!,
         if (order != null) 'order': order!,
@@ -908,7 +907,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dateRange != null) 'dateRange': dateRange!.toJson(),
         if (dimensionFilters != null)
           'dimensionFilters':
@@ -971,7 +970,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!,
         if (matchesAny != null) 'matchesAny': matchesAny!.toJson(),
       };
@@ -1059,7 +1058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!,
         if (metric != null) 'metric': metric!,
         if (order != null) 'order': order!,
@@ -1107,7 +1106,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (name != null) 'name': name!,
         if (publisherId != null) 'publisherId': publisherId!,
@@ -1143,7 +1142,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matchingRowCount != null) 'matchingRowCount': matchingRowCount!,
         if (warnings != null)
           'warnings': warnings!.map((value) => value.toJson()).toList(),
@@ -1186,7 +1185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dateRange != null) 'dateRange': dateRange!.toJson(),
         if (localizationSettings != null)
           'localizationSettings': localizationSettings!.toJson(),
@@ -1210,30 +1209,28 @@
 
   ReportRow.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionValues')) {
-      dimensionValues = (_json['dimensionValues'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ReportRowDimensionValue.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      dimensionValues =
+          (_json['dimensionValues'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ReportRowDimensionValue.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('metricValues')) {
-      metricValues = (_json['metricValues'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ReportRowMetricValue.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      metricValues =
+          (_json['metricValues'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ReportRowMetricValue.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionValues != null)
           'dimensionValues': dimensionValues!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -1265,7 +1262,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayLabel != null) 'displayLabel': displayLabel!,
         if (value != null) 'value': value!,
       };
@@ -1302,7 +1299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (doubleValue != null) 'doubleValue': doubleValue!,
         if (integerValue != null) 'integerValue': integerValue!,
         if (microsValue != null) 'microsValue': microsValue!,
@@ -1345,7 +1342,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (type != null) 'type': type!,
       };
@@ -1366,7 +1363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
diff --git a/generated/googleapis/lib/adsense/v1_4.dart b/generated/googleapis/lib/adsense/v1_4.dart
index 798cd0e..dd1b68b 100644
--- a/generated/googleapis/lib/adsense/v1_4.dart
+++ b/generated/googleapis/lib/adsense/v1_4.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2265,7 +2264,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creation_time': creationTime!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -2313,7 +2312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -2359,7 +2358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arcOptIn != null) 'arcOptIn': arcOptIn!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -2404,7 +2403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -2445,7 +2444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adCode != null) 'adCode': adCode!,
         if (ampBody != null) 'ampBody': ampBody!,
         if (ampHead != null) 'ampHead': ampHead!,
@@ -2493,7 +2492,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (background != null) 'background': background!,
         if (border != null) 'border': border!,
         if (text != null) 'text': text!,
@@ -2521,7 +2520,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (family != null) 'family': family!,
         if (size != null) 'size': size!,
       };
@@ -2562,7 +2561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colors != null) 'colors': colors!.toJson(),
         if (corners != null) 'corners': corners!,
         if (font != null) 'font': font!.toJson(),
@@ -2597,7 +2596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!,
         if (type != null) 'type': type!,
         if (url != null) 'url': url!,
@@ -2631,7 +2630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupOption != null) 'backupOption': backupOption!.toJson(),
         if (size != null) 'size': size!,
         if (type != null) 'type': type!,
@@ -2670,7 +2669,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adPosition != null) 'adPosition': adPosition!,
         if (frequency != null) 'frequency': frequency!,
         if (minimumWordCount != null) 'minimumWordCount': minimumWordCount!,
@@ -2709,7 +2708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (markupLanguage != null) 'markupLanguage': markupLanguage!,
         if (scriptingLanguage != null) 'scriptingLanguage': scriptingLanguage!,
         if (size != null) 'size': size!,
@@ -2802,7 +2801,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (contentAdsSettings != null)
           'contentAdsSettings': contentAdsSettings!.toJson(),
@@ -2855,7 +2854,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -2891,7 +2890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currency != null) 'currency': currency!,
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
@@ -2988,7 +2987,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (averages != null) 'averages': averages!,
         if (endDate != null) 'endDate': endDate!,
         if (headers != null)
@@ -3053,7 +3052,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (isDismissible != null) 'isDismissible': isDismissible!,
         if (kind != null) 'kind': kind!,
@@ -3084,7 +3083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3128,7 +3127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adsAppearOn != null) 'adsAppearOn': adsAppearOn!,
         if (description != null) 'description': description!,
         if (location != null) 'location': location!,
@@ -3176,7 +3175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -3221,7 +3220,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -3251,7 +3250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3296,7 +3295,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (paymentAmount != null) 'paymentAmount': paymentAmount!,
@@ -3330,7 +3329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3410,7 +3409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compatibleDimensions != null)
           'compatibleDimensions': compatibleDimensions!,
         if (compatibleMetrics != null) 'compatibleMetrics': compatibleMetrics!,
@@ -3457,7 +3456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adStyle != null) 'adStyle': adStyle!.toJson(),
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -3501,7 +3500,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -3534,7 +3533,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -3577,7 +3576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -3615,7 +3614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (urlPattern != null) 'urlPattern': urlPattern!,
@@ -3658,7 +3657,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/adsensehost/v4_1.dart b/generated/googleapis/lib/adsensehost/v4_1.dart
index 22cd983..51623c4 100644
--- a/generated/googleapis/lib/adsensehost/v4_1.dart
+++ b/generated/googleapis/lib/adsensehost/v4_1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1410,7 +1409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -1445,7 +1444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -1490,7 +1489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arcOptIn != null) 'arcOptIn': arcOptIn!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -1535,7 +1534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -1562,7 +1561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adCode != null) 'adCode': adCode!,
         if (kind != null) 'kind': kind!,
       };
@@ -1608,7 +1607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (background != null) 'background': background!,
         if (border != null) 'border': border!,
         if (text != null) 'text': text!,
@@ -1642,7 +1641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (family != null) 'family': family!,
         if (size != null) 'size': size!,
       };
@@ -1683,7 +1682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colors != null) 'colors': colors!.toJson(),
         if (corners != null) 'corners': corners!,
         if (font != null) 'font': font!.toJson(),
@@ -1721,7 +1720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!,
         if (type != null) 'type': type!,
         if (url != null) 'url': url!,
@@ -1759,7 +1758,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupOption != null) 'backupOption': backupOption!.toJson(),
         if (size != null) 'size': size!,
         if (type != null) 'type': type!,
@@ -1797,7 +1796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (markupLanguage != null) 'markupLanguage': markupLanguage!,
         if (scriptingLanguage != null) 'scriptingLanguage': scriptingLanguage!,
         if (size != null) 'size': size!,
@@ -1877,7 +1876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (contentAdsSettings != null)
           'contentAdsSettings': contentAdsSettings!.toJson(),
@@ -1927,7 +1926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -2008,7 +2007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -2054,7 +2053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -2098,7 +2097,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -2134,7 +2133,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currency != null) 'currency': currency!,
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
@@ -2218,7 +2217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (averages != null) 'averages': averages!,
         if (headers != null)
           'headers': headers!.map((value) => value.toJson()).toList(),
@@ -2259,7 +2258,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (urlPattern != null) 'urlPattern': urlPattern!,
@@ -2302,7 +2301,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/analytics/v3.dart b/generated/googleapis/lib/analytics/v3.dart
index 1244c6f..8949686 100644
--- a/generated/googleapis/lib/analytics/v3.dart
+++ b/generated/googleapis/lib/analytics/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -4921,7 +4920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -4944,7 +4943,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (effective != null) 'effective': effective!,
       };
 }
@@ -5014,7 +5013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childLink != null) 'childLink': childLink!.toJson(),
         if (created != null) 'created': created!.toIso8601String(),
         if (id != null) 'id': id!,
@@ -5058,7 +5057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -5133,7 +5132,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -5188,7 +5187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -5250,7 +5249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!.toJson(),
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -5298,7 +5297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountName != null) 'accountName': accountName!,
         if (kind != null) 'kind': kind!,
         if (profileName != null) 'profileName': profileName!,
@@ -5345,7 +5344,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!.toJson(),
         if (kind != null) 'kind': kind!,
         if (profile != null) 'profile': profile!.toJson(),
@@ -5421,7 +5420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -5463,7 +5462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoTaggingEnabled != null)
           'autoTaggingEnabled': autoTaggingEnabled!,
         if (customerId != null) 'customerId': customerId!,
@@ -5486,7 +5485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customDataImportUids != null)
           'customDataImportUids': customDataImportUids!,
       };
@@ -5507,14 +5506,13 @@
 
   Column.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = (_json['attributes'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      attributes =
+          (_json['attributes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -5524,7 +5522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -5576,7 +5574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeNames != null) 'attributeNames': attributeNames!,
         if (etag != null) 'etag': etag!,
         if (items != null)
@@ -5608,7 +5606,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -5635,7 +5633,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -5749,7 +5747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (childLink != null) 'childLink': childLink!.toJson(),
         if (created != null) 'created': created!.toIso8601String(),
@@ -5836,7 +5834,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -5872,7 +5870,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -5962,7 +5960,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (active != null) 'active': active!,
         if (created != null) 'created': created!.toIso8601String(),
@@ -6046,7 +6044,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -6082,7 +6080,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -6190,7 +6188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (active != null) 'active': active!,
         if (created != null) 'created': created!.toIso8601String(),
@@ -6277,7 +6275,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -6303,7 +6301,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (webPropertyRef != null) 'webPropertyRef': webPropertyRef!.toJson(),
       };
 }
@@ -6368,7 +6366,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adWordsAccounts != null)
           'adWordsAccounts':
               adWordsAccounts!.map((value) => value.toJson()).toList(),
@@ -6440,7 +6438,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -6482,7 +6480,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountRef != null) 'accountRef': accountRef!.toJson(),
         if (profileRef != null) 'profileRef': profileRef!.toJson(),
         if (webPropertyRef != null) 'webPropertyRef': webPropertyRef!.toJson(),
@@ -6520,7 +6518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (effective != null) 'effective': effective!,
         if (local != null) 'local': local!,
       };
@@ -6576,7 +6574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!.toJson(),
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -6645,7 +6643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -6682,7 +6680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -6738,7 +6736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (status != null) 'status': status!,
         if (url != null) 'url': url!,
@@ -7020,7 +7018,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (created != null) 'created': created!.toIso8601String(),
         if (description != null) 'description': description!,
@@ -7126,7 +7124,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -7231,7 +7229,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseSensitive != null) 'caseSensitive': caseSensitive!,
         if (extractA != null) 'extractA': extractA!,
         if (extractB != null) 'extractB': extractB!,
@@ -7271,7 +7269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!,
         if (fieldIndex != null) 'fieldIndex': fieldIndex!,
       };
@@ -7298,7 +7296,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -7343,7 +7341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseSensitive != null) 'caseSensitive': caseSensitive!,
         if (field != null) 'field': field!,
         if (fieldIndex != null) 'fieldIndex': fieldIndex!,
@@ -7373,7 +7371,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!,
         if (fieldIndex != null) 'fieldIndex': fieldIndex!,
       };
@@ -7489,7 +7487,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advancedDetails != null)
           'advancedDetails': advancedDetails!.toJson(),
@@ -7649,7 +7647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseSensitive != null) 'caseSensitive': caseSensitive!,
         if (expressionValue != null) 'expressionValue': expressionValue!,
         if (field != null) 'field': field!,
@@ -7696,7 +7694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (href != null) 'href': href!,
         if (id != null) 'id': id!,
@@ -7771,7 +7769,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -7814,7 +7812,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnType != null) 'columnType': columnType!,
         if (dataType != null) 'dataType': dataType!,
         if (name != null) 'name': name!,
@@ -7840,7 +7838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (label != null) 'label': label!,
         if (type != null) 'type': type!,
@@ -7858,7 +7856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (v != null) 'v': v!,
       };
 }
@@ -7877,7 +7875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (c != null) 'c': c!.map((value) => value.toJson()).toList(),
       };
 }
@@ -7903,7 +7901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cols != null) 'cols': cols!.map((value) => value.toJson()).toList(),
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
       };
@@ -7953,7 +7951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (internalWebPropertyId != null)
           'internalWebPropertyId': internalWebPropertyId!,
@@ -8041,7 +8039,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null) 'dimensions': dimensions!,
         if (endDate != null) 'end-date': endDate!,
         if (filters != null) 'filters': filters!,
@@ -8184,18 +8182,18 @@
       totalResults = _json['totalResults'] as core.int;
     }
     if (_json.containsKey('totalsForAllResults')) {
-      totalsForAllResults = (_json['totalsForAllResults'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      totalsForAllResults =
+          (_json['totalsForAllResults'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnHeaders != null)
           'columnHeaders':
               columnHeaders!.map((value) => value.toJson()).toList(),
@@ -8262,7 +8260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comparisonType != null) 'comparisonType': comparisonType!,
         if (comparisonValue != null) 'comparisonValue': comparisonValue!,
         if (expression != null) 'expression': expression!,
@@ -8294,7 +8292,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventConditions != null)
           'eventConditions':
               eventConditions!.map((value) => value.toJson()).toList(),
@@ -8323,7 +8321,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -8353,7 +8351,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (number != null) 'number': number!,
         if (url != null) 'url': url!,
@@ -8404,7 +8402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseSensitive != null) 'caseSensitive': caseSensitive!,
         if (firstStepRequired != null) 'firstStepRequired': firstStepRequired!,
         if (matchType != null) 'matchType': matchType!,
@@ -8435,7 +8433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comparisonType != null) 'comparisonType': comparisonType!,
         if (comparisonValue != null) 'comparisonValue': comparisonValue!,
       };
@@ -8462,7 +8460,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comparisonType != null) 'comparisonType': comparisonType!,
         if (comparisonValue != null) 'comparisonValue': comparisonValue!,
       };
@@ -8597,7 +8595,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (active != null) 'active': active!,
         if (created != null) 'created': created!.toIso8601String(),
@@ -8690,7 +8688,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -8723,7 +8721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientId != null) 'clientId': clientId!,
         if (kind != null) 'kind': kind!,
         if (webPropertyId != null) 'webPropertyId': webPropertyId!,
@@ -8754,7 +8752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientId != null) 'clientId': clientId!,
         if (hashedClientId != null) 'hashedClientId': hashedClientId!,
         if (kind != null) 'kind': kind!,
@@ -8807,7 +8805,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (daysToLookBack != null) 'daysToLookBack': daysToLookBack!,
         if (isSmartList != null) 'isSmartList': isSmartList!,
         if (kind != null) 'kind': kind!,
@@ -8891,7 +8889,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (eligibleForSearch != null) 'eligibleForSearch': eligibleForSearch!,
         if (id != null) 'id': id!,
@@ -8936,7 +8934,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnType != null) 'columnType': columnType!,
         if (dataType != null) 'dataType': dataType!,
         if (name != null) 'name': name!,
@@ -8987,7 +8985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (internalWebPropertyId != null)
           'internalWebPropertyId': internalWebPropertyId!,
@@ -9075,7 +9073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null) 'dimensions': dimensions!,
         if (endDate != null) 'end-date': endDate!,
         if (filters != null) 'filters': filters!,
@@ -9112,7 +9110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (interactionType != null) 'interactionType': interactionType!,
         if (nodeValue != null) 'nodeValue': nodeValue!,
       };
@@ -9147,7 +9145,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversionPathValue != null)
           'conversionPathValue':
               conversionPathValue!.map((value) => value.toJson()).toList(),
@@ -9273,18 +9271,18 @@
       totalResults = _json['totalResults'] as core.int;
     }
     if (_json.containsKey('totalsForAllResults')) {
-      totalsForAllResults = (_json['totalsForAllResults'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      totalsForAllResults =
+          (_json['totalsForAllResults'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnHeaders != null)
           'columnHeaders':
               columnHeaders!.map((value) => value.toJson()).toList(),
@@ -9331,7 +9329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -9358,7 +9356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -9382,7 +9380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (effective != null) 'effective': effective!,
       };
 }
@@ -9578,7 +9576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (botFilteringEnabled != null)
           'botFilteringEnabled': botFilteringEnabled!,
@@ -9674,7 +9672,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filterRef != null) 'filterRef': filterRef!.toJson(),
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -9751,7 +9749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -9814,7 +9812,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (href != null) 'href': href!,
         if (id != null) 'id': id!,
@@ -9867,7 +9865,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -9944,7 +9942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -9987,7 +9985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnType != null) 'columnType': columnType!,
         if (dataType != null) 'dataType': dataType!,
         if (name != null) 'name': name!,
@@ -10038,7 +10036,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (internalWebPropertyId != null)
           'internalWebPropertyId': internalWebPropertyId!,
@@ -10096,7 +10094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null) 'dimensions': dimensions!,
         if (filters != null) 'filters': filters!,
         if (ids != null) 'ids': ids!,
@@ -10184,18 +10182,18 @@
       totalResults = _json['totalResults'] as core.int;
     }
     if (_json.containsKey('totalsForAllResults')) {
-      totalsForAllResults = (_json['totalsForAllResults'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      totalsForAllResults =
+          (_json['totalsForAllResults'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnHeaders != null)
           'columnHeaders':
               columnHeaders!.map((value) => value.toJson()).toList(),
@@ -10226,7 +10224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeConditions != null)
           'includeConditions': includeConditions!.toJson(),
       };
@@ -10253,7 +10251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclusionDuration != null) 'exclusionDuration': exclusionDuration!,
         if (segment != null) 'segment': segment!,
       };
@@ -10284,7 +10282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludeConditions != null)
           'excludeConditions': excludeConditions!.toJson(),
         if (includeConditions != null)
@@ -10398,7 +10396,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (audienceDefinition != null)
           'audienceDefinition': audienceDefinition!.toJson(),
@@ -10490,7 +10488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -10568,7 +10566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (created != null) 'created': created!.toIso8601String(),
         if (definition != null) 'definition': definition!,
         if (id != null) 'id': id!,
@@ -10647,7 +10645,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -10679,7 +10677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketId != null) 'bucketId': bucketId!,
         if (objectId != null) 'objectId': objectId!,
       };
@@ -10698,7 +10696,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentId != null) 'documentId': documentId!,
       };
 }
@@ -10837,7 +10835,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (cloudStorageDownloadDetails != null)
           'cloudStorageDownloadDetails': cloudStorageDownloadDetails!.toJson(),
@@ -10931,7 +10929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -10997,7 +10995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (customDataSourceId != null)
           'customDataSourceId': customDataSourceId!,
@@ -11070,7 +11068,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -11101,7 +11099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (userId != null) 'userId': userId!,
       };
@@ -11153,7 +11151,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deletionRequestTime != null)
           'deletionRequestTime': deletionRequestTime!.toIso8601String(),
         if (firebaseProjectId != null) 'firebaseProjectId': firebaseProjectId!,
@@ -11187,7 +11185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -11237,7 +11235,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (href != null) 'href': href!,
         if (id != null) 'id': id!,
@@ -11311,7 +11309,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (internalWebPropertyId != null)
           'internalWebPropertyId': internalWebPropertyId!,
@@ -11393,7 +11391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (itemsPerPage != null) 'itemsPerPage': itemsPerPage!,
@@ -11429,7 +11427,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -11458,7 +11456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (type != null) 'type': type!,
       };
@@ -11482,7 +11480,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (effective != null) 'effective': effective!,
       };
 }
@@ -11624,7 +11622,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (childLink != null) 'childLink': childLink!.toJson(),
         if (created != null) 'created': created!.toIso8601String(),
diff --git a/generated/googleapis/lib/analyticsreporting/v4.dart b/generated/googleapis/lib/analyticsreporting/v4.dart
index b2760a4..e67bae9 100644
--- a/generated/googleapis/lib/analyticsreporting/v4.dart
+++ b/generated/googleapis/lib/analyticsreporting/v4.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -305,7 +304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activityTime != null) 'activityTime': activityTime!,
         if (activityType != null) 'activityType': activityType!,
         if (appview != null) 'appview': appview!.toJson(),
@@ -376,7 +375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dateRange != null) 'dateRange': dateRange!.toJson(),
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
@@ -430,7 +429,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cohorts != null)
           'cohorts': cohorts!.map((value) => value.toJson()).toList(),
         if (lifetimeValue != null) 'lifetimeValue': lifetimeValue!,
@@ -459,7 +458,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null) 'dimensions': dimensions!,
         if (metricHeader != null) 'metricHeader': metricHeader!.toJson(),
       };
@@ -487,7 +486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (index != null) 'index': index!,
         if (value != null) 'value': value!,
       };
@@ -515,7 +514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!,
         if (startDate != null) 'startDate': startDate!,
       };
@@ -546,7 +545,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pivotValueRegions != null)
           'pivotValueRegions':
               pivotValueRegions!.map((value) => value.toJson()).toList(),
@@ -600,7 +599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (histogramBuckets != null) 'histogramBuckets': histogramBuckets!,
         if (name != null) 'name': name!,
       };
@@ -685,7 +684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseSensitive != null) 'caseSensitive': caseSensitive!,
         if (dimensionName != null) 'dimensionName': dimensionName!,
         if (expressions != null) 'expressions': expressions!,
@@ -726,7 +725,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filters != null)
           'filters': filters!.map((value) => value.toJson()).toList(),
         if (operator != null) 'operator': operator!,
@@ -762,7 +761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (sessionSegment != null) 'sessionSegment': sessionSegment!.toJson(),
         if (userSegment != null) 'userSegment': userSegment!.toJson(),
@@ -820,7 +819,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionType != null) 'actionType': actionType!,
         if (ecommerceType != null) 'ecommerceType': ecommerceType!,
         if (products != null)
@@ -870,7 +869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventAction != null) 'eventAction': eventAction!,
         if (eventCategory != null) 'eventCategory': eventCategory!,
         if (eventCount != null) 'eventCount': eventCount!,
@@ -913,7 +912,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reportRequests != null)
           'reportRequests':
               reportRequests!.map((value) => value.toJson()).toList(),
@@ -954,7 +953,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queryCost != null) 'queryCost': queryCost!,
         if (reports != null)
           'reports': reports!.map((value) => value.toJson()).toList(),
@@ -1018,7 +1017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (goalCompletionLocation != null)
           'goalCompletionLocation': goalCompletionLocation!,
         if (goalCompletions != null) 'goalCompletions': goalCompletions!,
@@ -1047,7 +1046,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (goals != null)
           'goals': goals!.map((value) => value.toJson()).toList(),
       };
@@ -1104,7 +1103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alias != null) 'alias': alias!,
         if (expression != null) 'expression': expression!,
         if (formattingType != null) 'formattingType': formattingType!,
@@ -1163,7 +1162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comparisonValue != null) 'comparisonValue': comparisonValue!,
         if (metricName != null) 'metricName': metricName!,
         if (not != null) 'not': not!,
@@ -1203,7 +1202,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filters != null)
           'filters': filters!.map((value) => value.toJson()).toList(),
         if (operator != null) 'operator': operator!,
@@ -1235,7 +1234,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricHeaderEntries != null)
           'metricHeaderEntries':
               metricHeaderEntries!.map((value) => value.toJson()).toList(),
@@ -1270,7 +1269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
       };
@@ -1293,7 +1292,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segmentFilterClauses != null)
           'segmentFilterClauses':
               segmentFilterClauses!.map((value) => value.toJson()).toList(),
@@ -1355,7 +1354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldName != null) 'fieldName': fieldName!,
         if (orderType != null) 'orderType': orderType!,
         if (sortOrder != null) 'sortOrder': sortOrder!,
@@ -1381,7 +1380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pagePath != null) 'pagePath': pagePath!,
         if (pageTitle != null) 'pageTitle': pageTitle!,
       };
@@ -1463,7 +1462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionFilterClauses != null)
           'dimensionFilterClauses':
               dimensionFilterClauses!.map((value) => value.toJson()).toList(),
@@ -1498,7 +1497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pivotHeaderEntries != null)
           'pivotHeaderEntries':
               pivotHeaderEntries!.map((value) => value.toJson()).toList(),
@@ -1538,7 +1537,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionNames != null) 'dimensionNames': dimensionNames!,
         if (dimensionValues != null) 'dimensionValues': dimensionValues!,
         if (metric != null) 'metric': metric!.toJson(),
@@ -1560,7 +1559,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -1597,7 +1596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (itemRevenue != null) 'itemRevenue': itemRevenue!,
         if (productName != null) 'productName': productName!,
         if (productQuantity != null) 'productQuantity': productQuantity!,
@@ -1632,7 +1631,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnHeader != null) 'columnHeader': columnHeader!.toJson(),
         if (data != null) 'data': data!.toJson(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1749,7 +1748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataLastRefreshed != null) 'dataLastRefreshed': dataLastRefreshed!,
         if (isDataGolden != null) 'isDataGolden': isDataGolden!,
         if (maximums != null)
@@ -1987,7 +1986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cohortGroup != null) 'cohortGroup': cohortGroup!.toJson(),
         if (dateRanges != null)
           'dateRanges': dateRanges!.map((value) => value.toJson()).toList(),
@@ -2042,7 +2041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null) 'dimensions': dimensions!,
         if (metrics != null)
           'metrics': metrics!.map((value) => value.toJson()).toList(),
@@ -2071,7 +2070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dailyQuotaTokensRemaining != null)
           'dailyQuotaTokensRemaining': dailyQuotaTokensRemaining!,
         if (hourlyQuotaTokensRemaining != null)
@@ -2113,7 +2112,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appName != null) 'appName': appName!,
         if (mobileDeviceBranding != null)
           'mobileDeviceBranding': mobileDeviceBranding!,
@@ -2195,7 +2194,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activityTypes != null) 'activityTypes': activityTypes!,
         if (dateRange != null) 'dateRange': dateRange!.toJson(),
         if (pageSize != null) 'pageSize': pageSize!,
@@ -2247,7 +2246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sampleRate != null) 'sampleRate': sampleRate!,
         if (sessions != null)
@@ -2279,7 +2278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dynamicSegment != null) 'dynamicSegment': dynamicSegment!.toJson(),
         if (segmentId != null) 'segmentId': segmentId!,
       };
@@ -2303,7 +2302,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segmentFilters != null)
           'segmentFilters':
               segmentFilters!.map((value) => value.toJson()).toList(),
@@ -2382,7 +2381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseSensitive != null) 'caseSensitive': caseSensitive!,
         if (dimensionName != null) 'dimensionName': dimensionName!,
         if (expressions != null) 'expressions': expressions!,
@@ -2436,7 +2435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (not != null) 'not': not!,
         if (sequenceSegment != null)
           'sequenceSegment': sequenceSegment!.toJson(),
@@ -2472,7 +2471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionFilter != null)
           'dimensionFilter': dimensionFilter!.toJson(),
         if (metricFilter != null) 'metricFilter': metricFilter!.toJson(),
@@ -2545,7 +2544,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comparisonValue != null) 'comparisonValue': comparisonValue!,
         if (maxComparisonValue != null)
           'maxComparisonValue': maxComparisonValue!,
@@ -2586,7 +2585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matchType != null) 'matchType': matchType!,
         if (orFiltersForSegment != null)
           'orFiltersForSegment':
@@ -2621,7 +2620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firstStepShouldMatchFirstHit != null)
           'firstStepShouldMatchFirstHit': firstStepShouldMatchFirstHit!,
         if (segmentSequenceSteps != null)
@@ -2648,7 +2647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (orFiltersForSegment != null)
           'orFiltersForSegment':
               orFiltersForSegment!.map((value) => value.toJson()).toList(),
@@ -2689,7 +2688,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transactionId != null) 'transactionId': transactionId!,
         if (transactionRevenue != null)
           'transactionRevenue': transactionRevenue!,
@@ -2727,7 +2726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (userId != null) 'userId': userId!,
       };
@@ -2784,7 +2783,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activities != null)
           'activities': activities!.map((value) => value.toJson()).toList(),
         if (dataSource != null) 'dataSource': dataSource!,
diff --git a/generated/googleapis/lib/androiddeviceprovisioning/v1.dart b/generated/googleapis/lib/androiddeviceprovisioning/v1.dart
index fcabaf1..dbbdc02 100644
--- a/generated/googleapis/lib/androiddeviceprovisioning/v1.dart
+++ b/generated/googleapis/lib/androiddeviceprovisioning/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1331,7 +1330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerId != null) 'customerId': customerId!,
         if (deviceIdentifier != null)
           'deviceIdentifier': deviceIdentifier!.toJson(),
@@ -1360,7 +1359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (deviceName != null) 'deviceName': deviceName!,
       };
@@ -1387,7 +1386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (claims != null)
           'claims': claims!.map((value) => value.toJson()).toList(),
       };
@@ -1483,7 +1482,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminEmails != null) 'adminEmails': adminEmails!,
         if (companyId != null) 'companyId': companyId!,
         if (companyName != null) 'companyName': companyName!,
@@ -1613,7 +1612,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (companyName != null) 'companyName': companyName!,
         if (configurationId != null) 'configurationId': configurationId!,
         if (configurationName != null) 'configurationName': configurationName!,
@@ -1647,7 +1646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customer != null) 'customer': customer!.toJson(),
       };
 }
@@ -1677,7 +1676,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configuration != null) 'configuration': configuration!,
         if (device != null) 'device': device!.toJson(),
       };
@@ -1699,7 +1698,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configurations != null)
           'configurations':
               configurations!.map((value) => value.toJson()).toList(),
@@ -1730,7 +1729,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customers != null)
           'customers': customers!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1761,7 +1760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1785,7 +1784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dpcs != null) 'dpcs': dpcs!.map((value) => value.toJson()).toList(),
       };
 }
@@ -1806,7 +1805,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (device != null) 'device': device!.toJson(),
       };
 }
@@ -1827,7 +1826,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (device != null) 'device': device!.toJson(),
       };
 }
@@ -1902,7 +1901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (claims != null)
           'claims': claims!.map((value) => value.toJson()).toList(),
         if (configuration != null) 'configuration': configuration!,
@@ -1965,7 +1964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ownerCompanyId != null) 'ownerCompanyId': ownerCompanyId!,
         if (resellerId != null) 'resellerId': resellerId!,
         if (sectionType != null) 'sectionType': sectionType!,
@@ -2028,7 +2027,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imei != null) 'imei': imei!,
         if (manufacturer != null) 'manufacturer': manufacturer!,
         if (meid != null) 'meid': meid!,
@@ -2049,17 +2048,16 @@
 
   DeviceMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
-      entries =
-          (_json['entries'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      entries = (_json['entries'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null) 'entries': entries!,
       };
 }
@@ -2092,7 +2090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (deviceIdentifier != null)
           'deviceIdentifier': deviceIdentifier!.toJson(),
@@ -2141,7 +2139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devicesCount != null) 'devicesCount': devicesCount!,
         if (processingStatus != null) 'processingStatus': processingStatus!,
         if (progress != null) 'progress': progress!,
@@ -2180,7 +2178,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (perDeviceStatus != null)
           'perDeviceStatus':
               perDeviceStatus!.map((value) => value.toJson()).toList(),
@@ -2234,7 +2232,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dpcName != null) 'dpcName': dpcName!,
         if (name != null) 'name': name!,
         if (packageName != null) 'packageName': packageName!,
@@ -2255,7 +2253,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to find devices.
@@ -2290,7 +2288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceIdentifier != null)
           'deviceIdentifier': deviceIdentifier!.toJson(),
         if (limit != null) 'limit': limit!,
@@ -2328,7 +2326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2381,7 +2379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerId != null) 'customerId': customerId!,
         if (limit != null) 'limit': limit!,
         if (pageToken != null) 'pageToken': pageToken!,
@@ -2419,7 +2417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2457,7 +2455,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customers != null)
           'customers': customers!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2495,7 +2493,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customers != null)
           'customers': customers!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2536,7 +2534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (totalSize != null) 'totalSize': totalSize!,
         if (vendors != null)
@@ -2594,29 +2592,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2662,7 +2658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (claim != null) 'claim': claim!.toJson(),
         if (result != null) 'result': result!.toJson(),
         if (unclaim != null) 'unclaim': unclaim!.toJson(),
@@ -2715,7 +2711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerId != null) 'customerId': customerId!,
         if (deviceIdentifier != null)
           'deviceIdentifier': deviceIdentifier!.toJson(),
@@ -2779,7 +2775,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (deviceIdentifier != null)
           'deviceIdentifier': deviceIdentifier!.toJson(),
@@ -2834,7 +2830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (errorIdentifier != null) 'errorIdentifier': errorIdentifier!,
         if (errorMessage != null) 'errorMessage': errorMessage!,
@@ -2875,8 +2871,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2889,7 +2885,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2947,7 +2943,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (deviceIdentifier != null)
           'deviceIdentifier': deviceIdentifier!.toJson(),
@@ -2976,7 +2972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unclaims != null)
           'unclaims': unclaims!.map((value) => value.toJson()).toList(),
       };
@@ -3001,7 +2997,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (updates != null)
           'updates': updates!.map((value) => value.toJson()).toList(),
       };
@@ -3023,7 +3019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceMetadata != null) 'deviceMetadata': deviceMetadata!.toJson(),
       };
 }
@@ -3061,7 +3057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (deviceIdentifier != null)
           'deviceIdentifier': deviceIdentifier!.toJson(),
diff --git a/generated/googleapis/lib/androidenterprise/v1.dart b/generated/googleapis/lib/androidenterprise/v1.dart
index d254326..4316d75 100644
--- a/generated/googleapis/lib/androidenterprise/v1.dart
+++ b/generated/googleapis/lib/androidenterprise/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3665,7 +3664,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
       };
 }
@@ -3683,7 +3682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (token != null) 'token': token!,
       };
 }
@@ -3754,7 +3753,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (managedConfigurations != null)
           'managedConfigurations': managedConfigurations!.toJson(),
         if (parent != null) 'parent': parent!,
@@ -3780,7 +3779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -3807,7 +3806,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approveApps != null) 'approveApps': approveApps!,
         if (enabled != null) 'enabled': enabled!,
       };
@@ -3827,7 +3826,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -3846,7 +3845,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -3865,7 +3864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -3894,7 +3893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (restrictions != null)
           'restrictions': restrictions!.map((value) => value.toJson()).toList(),
@@ -3921,7 +3920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (productId != null) 'productId': productId!,
       };
 }
@@ -4015,7 +4014,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultValue != null) 'defaultValue': defaultValue!.toJson(),
         if (description != null) 'description': description!,
         if (entry != null) 'entry': entry!,
@@ -4081,7 +4080,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (valueBool != null) 'valueBool': valueBool!,
         if (valueInteger != null) 'valueInteger': valueInteger!,
@@ -4116,7 +4115,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyedAppState != null)
           'keyedAppState':
               keyedAppState!.map((value) => value.toJson()).toList(),
@@ -4143,7 +4142,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (productId != null) 'productId': productId!,
       };
 }
@@ -4199,7 +4198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isProduction != null) 'isProduction': isProduction!,
         if (track != null) 'track': track!,
         if (trackId != null) 'trackId': trackId!,
@@ -4222,7 +4221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approvalUrl != null) 'approvalUrl': approvalUrl!,
       };
 }
@@ -4243,7 +4242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (token != null) 'token': token!,
       };
 }
@@ -4290,7 +4289,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chargingStateConstraint != null)
           'chargingStateConstraint': chargingStateConstraint!,
         if (deviceIdleStateConstraint != null)
@@ -4353,7 +4352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoInstallConstraint != null)
           'autoInstallConstraint':
               autoInstallConstraint!.map((value) => value.toJson()).toList(),
@@ -4392,7 +4391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mcmId != null) 'mcmId': mcmId!,
         if (variableSet != null)
           'variableSet': variableSet!.map((value) => value.toJson()).toList(),
@@ -4451,7 +4450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidId != null) 'androidId': androidId!,
         if (managementType != null) 'managementType': managementType!,
         if (policy != null) 'policy': policy!.toJson(),
@@ -4488,7 +4487,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appState != null)
           'appState': appState!.map((value) => value.toJson()).toList(),
         if (lastUpdatedTimestampMillis != null)
@@ -4528,7 +4527,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (report != null) 'report': report!.toJson(),
         if (userId != null) 'userId': userId!,
@@ -4556,7 +4555,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountState != null) 'accountState': accountState!,
       };
 }
@@ -4576,7 +4575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (device != null)
           'device': device!.map((value) => value.toJson()).toList(),
       };
@@ -4631,7 +4630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (administrator != null)
           'administrator':
               administrator!.map((value) => value.toJson()).toList(),
@@ -4655,7 +4654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountEmail != null) 'accountEmail': accountEmail!,
       };
 }
@@ -4675,7 +4674,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enterprise != null)
           'enterprise': enterprise!.map((value) => value.toJson()).toList(),
       };
@@ -4700,7 +4699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (messageId != null) 'messageId': messageId!,
         if (topicName != null) 'topicName': topicName!,
       };
@@ -4753,7 +4752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (productId != null) 'productId': productId!,
         if (reason != null) 'reason': reason!,
       };
@@ -4777,7 +4776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entitlement != null)
           'entitlement': entitlement!.map((value) => value.toJson()).toList(),
       };
@@ -4878,7 +4877,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acquisitionKind != null) 'acquisitionKind': acquisitionKind!,
         if (approval != null) 'approval': approval!,
         if (numProvisioned != null) 'numProvisioned': numProvisioned!,
@@ -4903,7 +4902,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (user != null) 'user': user!.map((value) => value.toJson()).toList(),
       };
 }
@@ -4923,7 +4922,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupLicense != null)
           'groupLicense': groupLicense!.map((value) => value.toJson()).toList(),
       };
@@ -4983,7 +4982,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (installState != null) 'installState': installState!,
         if (productId != null) 'productId': productId!,
         if (versionCode != null) 'versionCode': versionCode!,
@@ -5042,7 +5041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (failureDetails != null) 'failureDetails': failureDetails!,
         if (failureReason != null) 'failureReason': failureReason!,
@@ -5069,7 +5068,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (install != null)
           'install': install!.map((value) => value.toJson()).toList(),
       };
@@ -5131,7 +5130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
         if (key != null) 'key': key!,
         if (message != null) 'message': message!,
@@ -5162,7 +5161,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locale != null) 'locale': locale!,
         if (text != null) 'text': text!,
       };
@@ -5196,7 +5195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (durationMs != null) 'durationMs': durationMs!,
         if (startTimeAfterMidnightMs != null)
           'startTimeAfterMidnightMs': startTimeAfterMidnightMs!,
@@ -5243,7 +5242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configurationVariables != null)
           'configurationVariables': configurationVariables!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -5270,7 +5269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (managedConfigurationForDevice != null)
           'managedConfigurationForDevice': managedConfigurationForDevice!
               .map((value) => value.toJson())
@@ -5294,7 +5293,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (managedConfigurationForUser != null)
           'managedConfigurationForUser': managedConfigurationForUser!
               .map((value) => value.toJson())
@@ -5334,7 +5333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastUpdatedTimestampMillis != null)
           'lastUpdatedTimestampMillis': lastUpdatedTimestampMillis!,
         if (mcmId != null) 'mcmId': mcmId!,
@@ -5360,7 +5359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (managedConfigurationsSettings != null)
           'managedConfigurationsSettings': managedConfigurationsSettings!
               .map((value) => value.toJson())
@@ -5433,7 +5432,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (valueBool != null) 'valueBool': valueBool!,
         if (valueBundle != null) 'valueBundle': valueBundle!.toJson(),
@@ -5462,7 +5461,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (managedProperty != null)
           'managedProperty':
               managedProperty!.map((value) => value.toJson()).toList(),
@@ -5512,7 +5511,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (dpcPackageName != null) 'dpcPackageName': dpcPackageName!,
         if (managementType != null) 'managementType': managementType!,
@@ -5559,7 +5558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approvedPermissions != null)
           'approvedPermissions': approvedPermissions!,
         if (productId != null) 'productId': productId!,
@@ -5672,7 +5671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appRestrictionsSchemaChangeEvent != null)
           'appRestrictionsSchemaChangeEvent':
               appRestrictionsSchemaChangeEvent!.toJson(),
@@ -5722,7 +5721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notification != null)
           'notification': notification!.map((value) => value.toJson()).toList(),
         if (notificationSetId != null) 'notificationSetId': notificationSetId!,
@@ -5760,7 +5759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resultPerPage != null) 'resultPerPage': resultPerPage!,
         if (startIndex != null) 'startIndex': startIndex!,
         if (totalResults != null) 'totalResults': totalResults!,
@@ -5800,7 +5799,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (name != null) 'name': name!,
         if (permissionId != null) 'permissionId': permissionId!,
@@ -5884,7 +5883,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoUpdatePolicy != null) 'autoUpdatePolicy': autoUpdatePolicy!,
         if (deviceReportPolicy != null)
           'deviceReportPolicy': deviceReportPolicy!,
@@ -6111,7 +6110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appTracks != null)
           'appTracks': appTracks!.map((value) => value.toJson()).toList(),
         if (appVersion != null)
@@ -6176,7 +6175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approved != null) 'approved': approved!,
         if (productId != null) 'productId': productId!,
       };
@@ -6212,7 +6211,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availabilityStatus != null)
           'availabilityStatus': availabilityStatus!,
         if (productId != null) 'productId': productId!,
@@ -6247,7 +6246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissionId != null) 'permissionId': permissionId!,
         if (state != null) 'state': state!,
       };
@@ -6277,7 +6276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permission != null)
           'permission': permission!.map((value) => value.toJson()).toList(),
         if (productId != null) 'productId': productId!,
@@ -6362,7 +6361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoInstallPolicy != null)
           'autoInstallPolicy': autoInstallPolicy!.toJson(),
         if (autoUpdateMode != null) 'autoUpdateMode': autoUpdateMode!,
@@ -6431,7 +6430,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (productId != null) 'productId': productId!,
         if (productSetBehavior != null)
           'productSetBehavior': productSetBehavior!,
@@ -6462,7 +6461,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificateHashSha1 != null)
           'certificateHashSha1': certificateHashSha1!,
         if (certificateHashSha256 != null)
@@ -6504,7 +6503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (productId != null) 'productId': productId!,
         if (trackIds != null) 'trackIds': trackIds!,
         if (tracks != null) 'tracks': tracks!,
@@ -6549,7 +6548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approvalUrlInfo != null)
           'approvalUrlInfo': approvalUrlInfo!.toJson(),
         if (approvedPermissions != null)
@@ -6578,7 +6577,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -6613,7 +6612,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageInfo != null) 'pageInfo': pageInfo!.toJson(),
         if (product != null)
           'product': product!.map((value) => value.toJson()).toList(),
@@ -6645,7 +6644,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!.toJson(),
         if (name != null) 'name': name!,
       };
@@ -6698,7 +6697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
         if (id != null) 'id': id!,
         if (publicData != null) 'publicData': publicData!,
@@ -6721,7 +6720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (serviceAccountKey != null)
           'serviceAccountKey':
               serviceAccountKey!.map((value) => value.toJson()).toList(),
@@ -6757,7 +6756,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completionToken != null) 'completionToken': completionToken!,
         if (kind != null) 'kind': kind!,
         if (url != null) 'url': url!,
@@ -6816,7 +6815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!.map((value) => value.toJson()).toList(),
         if (orderInPage != null) 'orderInPage': orderInPage!,
@@ -6856,7 +6855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (homepageId != null) 'homepageId': homepageId!,
         if (storeLayoutType != null) 'storeLayoutType': storeLayoutType!,
       };
@@ -6877,7 +6876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cluster != null)
           'cluster': cluster!.map((value) => value.toJson()).toList(),
       };
@@ -6898,7 +6897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (page != null) 'page': page!.map((value) => value.toJson()).toList(),
       };
 }
@@ -6946,7 +6945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (link != null) 'link': link!,
         if (name != null) 'name': name!.map((value) => value.toJson()).toList(),
@@ -6981,7 +6980,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (previousPageToken != null) 'previousPageToken': previousPageToken!,
       };
@@ -7011,7 +7010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (trackAlias != null) 'trackAlias': trackAlias!,
         if (trackId != null) 'trackId': trackId!,
       };
@@ -7097,7 +7096,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountIdentifier != null) 'accountIdentifier': accountIdentifier!,
         if (accountType != null) 'accountType': accountType!,
         if (displayName != null) 'displayName': displayName!,
@@ -7122,7 +7121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (user != null) 'user': user!.map((value) => value.toJson()).toList(),
       };
 }
@@ -7151,7 +7150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (placeholder != null) 'placeholder': placeholder!,
         if (userValue != null) 'userValue': userValue!,
       };
@@ -7245,7 +7244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayMode != null) 'displayMode': displayMode!,
         if (icons != null)
           'icons': icons!.map((value) => value.toJson()).toList(),
@@ -7274,7 +7273,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageData != null) 'imageData': imageData!,
       };
 }
@@ -7294,7 +7293,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (webApp != null)
           'webApp': webApp!.map((value) => value.toJson()).toList(),
       };
diff --git a/generated/googleapis/lib/androidmanagement/v1.dart b/generated/googleapis/lib/androidmanagement/v1.dart
index 3ace307..1047e1f 100644
--- a/generated/googleapis/lib/androidmanagement/v1.dart
+++ b/generated/googleapis/lib/androidmanagement/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1427,7 +1426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonCriteriaMode != null)
           'commonCriteriaMode': commonCriteriaMode!,
         if (untrustedAppsPolicy != null)
@@ -1454,7 +1453,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lockdownEnabled != null) 'lockdownEnabled': lockdownEnabled!,
         if (packageName != null) 'packageName': packageName!,
       };
@@ -1479,7 +1478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minApiLevel != null) 'minApiLevel': minApiLevel!,
       };
 }
@@ -1507,7 +1506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (trackAlias != null) 'trackAlias': trackAlias!,
         if (trackId != null) 'trackId': trackId!,
       };
@@ -1562,7 +1561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appTracks != null)
           'appTracks': appTracks!.map((value) => value.toJson()).toList(),
         if (managedProperties != null)
@@ -1606,7 +1605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (eventType != null) 'eventType': eventType!,
       };
@@ -1644,7 +1643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (name != null) 'name': name!,
         if (permissionId != null) 'permissionId': permissionId!,
@@ -1805,14 +1804,14 @@
       lockTaskAllowed = _json['lockTaskAllowed'] as core.bool;
     }
     if (_json.containsKey('managedConfiguration')) {
-      managedConfiguration = (_json['managedConfiguration'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      managedConfiguration =
+          (_json['managedConfiguration'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('managedConfigurationTemplate')) {
       managedConfigurationTemplate = ManagedConfigurationTemplate.fromJson(
@@ -1833,7 +1832,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessibleTrackIds != null)
           'accessibleTrackIds': accessibleTrackIds!,
         if (autoUpdateMode != null) 'autoUpdateMode': autoUpdateMode!,
@@ -1965,7 +1964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicationSource != null) 'applicationSource': applicationSource!,
         if (displayName != null) 'displayName': displayName!,
         if (events != null)
@@ -1998,7 +1997,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeRemovedApps != null)
           'includeRemovedApps': includeRemovedApps!,
       };
@@ -2041,7 +2040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockAfterDays != null) 'blockAfterDays': blockAfterDays!,
         if (blockScope != null) 'blockScope': blockScope!,
       };
@@ -2084,7 +2083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (packageNames != null) 'packageNames': packageNames!,
         if (privateKeyAlias != null) 'privateKeyAlias': privateKeyAlias!,
         if (urlPattern != null) 'urlPattern': urlPattern!,
@@ -2175,7 +2174,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (duration != null) 'duration': duration!,
         if (errorCode != null) 'errorCode': errorCode!,
@@ -2211,7 +2210,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonCriteriaModeStatus != null)
           'commonCriteriaModeStatus': commonCriteriaModeStatus!,
       };
@@ -2267,7 +2266,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiLevelCondition != null)
           'apiLevelCondition': apiLevelCondition!.toJson(),
         if (disableApps != null) 'disableApps': disableApps!,
@@ -2339,7 +2338,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactEmail != null) 'contactEmail': contactEmail!,
         if (dataProtectionOfficerEmail != null)
           'dataProtectionOfficerEmail': dataProtectionOfficerEmail!,
@@ -2396,7 +2395,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -2724,14 +2723,14 @@
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('systemProperties')) {
-      systemProperties = (_json['systemProperties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      systemProperties =
+          (_json['systemProperties'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('user')) {
       user =
@@ -2742,7 +2741,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiLevel != null) 'apiLevel': apiLevel!,
         if (applicationReports != null)
           'applicationReports':
@@ -2865,7 +2864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adbEnabled != null) 'adbEnabled': adbEnabled!,
         if (developmentSettingsEnabled != null)
           'developmentSettingsEnabled': developmentSettingsEnabled!,
@@ -2933,7 +2932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (density != null) 'density': density!,
         if (displayId != null) 'displayId': displayId!,
         if (height != null) 'height': height!,
@@ -2958,7 +2957,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An enrollment token.
@@ -3077,7 +3076,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalData != null) 'additionalData': additionalData!,
         if (allowPersonalUsage != null)
           'allowPersonalUsage': allowPersonalUsage!,
@@ -3187,7 +3186,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appAutoApprovalEnabled != null)
           'appAutoApprovalEnabled': appAutoApprovalEnabled!,
         if (contactInfo != null) 'contactInfo': contactInfo!.toJson(),
@@ -3238,7 +3237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sha256Hash != null) 'sha256Hash': sha256Hash!,
         if (url != null) 'url': url!,
       };
@@ -3282,7 +3281,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!.toJson(),
         if (startDate != null) 'startDate': startDate!.toJson(),
       };
@@ -3418,7 +3417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batteryShutdownTemperatures != null)
           'batteryShutdownTemperatures': batteryShutdownTemperatures!,
         if (batteryThrottlingTemperatures != null)
@@ -3515,7 +3514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batteryTemperatures != null)
           'batteryTemperatures': batteryTemperatures!,
         if (cpuTemperatures != null) 'cpuTemperatures': cpuTemperatures!,
@@ -3586,7 +3585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (data != null) 'data': data!,
         if (key != null) 'key': key!,
@@ -3683,7 +3682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceSettings != null) 'deviceSettings': deviceSettings!,
         if (powerButtonActions != null)
           'powerButtonActions': powerButtonActions!,
@@ -3707,7 +3706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (packageName != null) 'packageName': packageName!,
       };
 }
@@ -3734,7 +3733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3769,7 +3768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enterprises != null)
           'enterprises': enterprises!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3798,7 +3797,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -3827,7 +3826,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (policies != null)
           'policies': policies!.map((value) => value.toJson()).toList(),
@@ -3856,7 +3855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (webApps != null)
           'webApps': webApps!.map((value) => value.toJson()).toList(),
@@ -3877,21 +3876,21 @@
 
   ManagedConfigurationTemplate.fromJson(core.Map _json) {
     if (_json.containsKey('configurationVariables')) {
-      configurationVariables = (_json['configurationVariables'] as core.Map)
-          .cast<core.String, core.String>()
+      configurationVariables = (_json['configurationVariables']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('templateId')) {
       templateId = _json['templateId'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configurationVariables != null)
           'configurationVariables': configurationVariables!,
         if (templateId != null) 'templateId': templateId!,
@@ -3978,7 +3977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (description != null) 'description': description!,
         if (entries != null)
@@ -4016,7 +4015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -4060,7 +4059,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (byteCount != null) 'byteCount': byteCount!,
         if (createTime != null) 'createTime': createTime!,
         if (eventType != null) 'eventType': eventType!,
@@ -4086,7 +4085,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (totalInternalStorage != null)
           'totalInternalStorage': totalInternalStorage!,
         if (totalRam != null) 'totalRam': totalRam!,
@@ -4145,7 +4144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imei != null) 'imei': imei!,
         if (meid != null) 'meid': meid!,
         if (networkOperatorName != null)
@@ -4261,7 +4260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentValue != null) 'currentValue': currentValue!,
         if (fieldPath != null) 'fieldPath': fieldPath!,
         if (installationFailureReason != null)
@@ -4331,7 +4330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nonComplianceReason != null)
           'nonComplianceReason': nonComplianceReason!,
         if (packageName != null) 'packageName': packageName!,
@@ -4393,29 +4392,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4439,7 +4436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (packageNames != null) 'packageNames': packageNames!,
       };
 }
@@ -4594,7 +4591,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maximumFailedPasswordsForWipe != null)
           'maximumFailedPasswordsForWipe': maximumFailedPasswordsForWipe!,
         if (passwordExpirationTimeout != null)
@@ -4649,7 +4646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permission != null) 'permission': permission!,
         if (policy != null) 'policy': policy!,
       };
@@ -4702,7 +4699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actions != null) 'actions': actions!,
         if (categories != null) 'categories': categories!,
         if (receiverActivity != null) 'receiverActivity': receiverActivity!,
@@ -4734,7 +4731,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (installType != null) 'installType': installType!,
         if (packageName != null) 'packageName': packageName!,
       };
@@ -4805,7 +4802,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountTypesWithManagementDisabled != null)
           'accountTypesWithManagementDisabled':
               accountTypesWithManagementDisabled!,
@@ -5416,14 +5413,14 @@
       networkResetDisabled = _json['networkResetDisabled'] as core.bool;
     }
     if (_json.containsKey('openNetworkConfiguration')) {
-      openNetworkConfiguration = (_json['openNetworkConfiguration'] as core.Map)
-          .cast<core.String, core.Object>()
+      openNetworkConfiguration = (_json['openNetworkConfiguration']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('outgoingBeamDisabled')) {
       outgoingBeamDisabled = _json['outgoingBeamDisabled'] as core.bool;
@@ -5569,7 +5566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountTypesWithManagementDisabled != null)
           'accountTypesWithManagementDisabled':
               accountTypesWithManagementDisabled!,
@@ -5764,7 +5761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockAction != null) 'blockAction': blockAction!.toJson(),
         if (settingName != null) 'settingName': settingName!,
         if (wipeAction != null) 'wipeAction': wipeAction!.toJson(),
@@ -5801,7 +5798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advice != null)
           'advice': advice!.map((value) => value.toJson()).toList(),
         if (securityRisk != null) 'securityRisk': securityRisk!,
@@ -5843,7 +5840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batteryLevel != null) 'batteryLevel': batteryLevel!,
         if (createTime != null) 'createTime': createTime!,
         if (eventType != null) 'eventType': eventType!,
@@ -5888,7 +5885,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedHosts != null) 'excludedHosts': excludedHosts!,
         if (host != null) 'host': host!,
         if (pacUri != null) 'pacUri': pacUri!,
@@ -5927,7 +5924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devicePosture != null) 'devicePosture': devicePosture!,
         if (postureDetails != null)
           'postureDetails':
@@ -5963,7 +5960,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!.toJson(),
         if (launchApp != null) 'launchApp': launchApp!.toJson(),
         if (title != null) 'title': title!.toJson(),
@@ -6027,7 +6024,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPersonalUsage != null)
           'allowPersonalUsage': allowPersonalUsage!,
         if (qrCode != null) 'qrCode': qrCode!,
@@ -6061,7 +6058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (url != null) 'url': url!,
       };
@@ -6150,7 +6147,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidBuildNumber != null)
           'androidBuildNumber': androidBuildNumber!,
         if (androidBuildTime != null) 'androidBuildTime': androidBuildTime!,
@@ -6206,8 +6203,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -6220,7 +6217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -6316,7 +6313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicationReportingSettings != null)
           'applicationReportingSettings':
               applicationReportingSettings!.toJson(),
@@ -6399,7 +6396,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endMinutes != null) 'endMinutes': endMinutes!,
         if (freezePeriods != null)
           'freezePeriods':
@@ -6443,7 +6440,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (updateReceivedTime != null)
           'updateReceivedTime': updateReceivedTime!,
         if (updateStatus != null) 'updateStatus': updateStatus!,
@@ -6471,7 +6468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrierName != null) 'carrierName': carrierName!,
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
       };
@@ -6500,7 +6497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!.toJson(),
         if (header != null) 'header': header!.toJson(),
       };
@@ -6525,7 +6522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountIdentifier != null) 'accountIdentifier': accountIdentifier!,
       };
 }
@@ -6552,18 +6549,18 @@
       defaultMessage = _json['defaultMessage'] as core.String;
     }
     if (_json.containsKey('localizedMessages')) {
-      localizedMessages = (_json['localizedMessages'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      localizedMessages =
+          (_json['localizedMessages'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultMessage != null) 'defaultMessage': defaultMessage!,
         if (localizedMessages != null) 'localizedMessages': localizedMessages!,
       };
@@ -6633,7 +6630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayMode != null) 'displayMode': displayMode!,
         if (icons != null)
           'icons': icons!.map((value) => value.toJson()).toList(),
@@ -6663,7 +6660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageData != null) 'imageData': imageData!,
       };
 }
@@ -6726,7 +6723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabledFeatures != null) 'enabledFeatures': enabledFeatures!,
         if (name != null) 'name': name!,
         if (parentFrameUrl != null) 'parentFrameUrl': parentFrameUrl!,
@@ -6761,7 +6758,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (preserveFrp != null) 'preserveFrp': preserveFrp!,
         if (wipeAfterDays != null) 'wipeAfterDays': wipeAfterDays!,
       };
diff --git a/generated/googleapis/lib/androidpublisher/v3.dart b/generated/googleapis/lib/androidpublisher/v3.dart
index 70baf9a..bee478c 100644
--- a/generated/googleapis/lib/androidpublisher/v3.dart
+++ b/generated/googleapis/lib/androidpublisher/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3422,7 +3421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (binary != null) 'binary': binary!.toJson(),
         if (versionCode != null) 'versionCode': versionCode!,
       };
@@ -3449,7 +3448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sha1 != null) 'sha1': sha1!,
         if (sha256 != null) 'sha256': sha256!,
       };
@@ -3469,7 +3468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (externallyHostedApk != null)
           'externallyHostedApk': externallyHostedApk!.toJson(),
       };
@@ -3489,7 +3488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (externallyHostedApk != null)
           'externallyHostedApk': externallyHostedApk!.toJson(),
       };
@@ -3517,7 +3516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apks != null) 'apks': apks!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
       };
@@ -3556,7 +3555,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactEmail != null) 'contactEmail': contactEmail!,
         if (contactPhone != null) 'contactPhone': contactPhone!,
         if (contactWebsite != null) 'contactWebsite': contactWebsite!,
@@ -3592,7 +3591,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expiryTimeSeconds != null) 'expiryTimeSeconds': expiryTimeSeconds!,
         if (id != null) 'id': id!,
       };
@@ -3628,7 +3627,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sha1 != null) 'sha1': sha1!,
         if (sha256 != null) 'sha256': sha256!,
         if (versionCode != null) 'versionCode': versionCode!,
@@ -3657,7 +3656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bundles != null)
           'bundles': bundles!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3685,7 +3684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (developerComment != null)
           'developerComment': developerComment!.toJson(),
         if (userComment != null) 'userComment': userComment!.toJson(),
@@ -3714,7 +3713,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countries != null) 'countries': countries!,
         if (includeRestOfWorld != null)
           'includeRestOfWorld': includeRestOfWorld!,
@@ -3739,7 +3738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (symbolType != null) 'symbolType': symbolType!,
       };
 }
@@ -3758,7 +3757,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deobfuscationFile != null)
           'deobfuscationFile': deobfuscationFile!.toJson(),
       };
@@ -3784,7 +3783,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastModified != null) 'lastModified': lastModified!.toJson(),
         if (text != null) 'text': text!,
       };
@@ -3863,7 +3862,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpuMake != null) 'cpuMake': cpuMake!,
         if (cpuModel != null) 'cpuModel': cpuModel!,
         if (deviceClass != null) 'deviceClass': deviceClass!,
@@ -3910,7 +3909,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (screenDensity != null) 'screenDensity': screenDensity!,
         if (supportedAbis != null) 'supportedAbis': supportedAbis!,
         if (supportedLocales != null) 'supportedLocales': supportedLocales!,
@@ -3943,7 +3942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileSize != null) 'fileSize': fileSize!,
         if (referencesVersion != null) 'referencesVersion': referencesVersion!,
       };
@@ -3963,7 +3962,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expansionFile != null) 'expansionFile': expansionFile!.toJson(),
       };
 }
@@ -4082,7 +4081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicationLabel != null) 'applicationLabel': applicationLabel!,
         if (certificateBase64s != null)
           'certificateBase64s': certificateBase64s!,
@@ -4138,7 +4137,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (sha1 != null) 'sha1': sha1!,
         if (sha256 != null) 'sha256': sha256!,
@@ -4162,7 +4161,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deleted != null)
           'deleted': deleted!.map((value) => value.toJson()).toList(),
       };
@@ -4184,7 +4183,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (images != null)
           'images': images!.map((value) => value.toJson()).toList(),
       };
@@ -4204,7 +4203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (image != null) 'image': image!.toJson(),
       };
 }
@@ -4291,28 +4290,24 @@
       gracePeriod = _json['gracePeriod'] as core.String;
     }
     if (_json.containsKey('listings')) {
-      listings = (_json['listings'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              InAppProductListing.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      listings = (_json['listings'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          InAppProductListing.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('packageName')) {
       packageName = _json['packageName'] as core.String;
     }
     if (_json.containsKey('prices')) {
-      prices = (_json['prices'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Price.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      prices = (_json['prices'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Price.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('purchaseType')) {
       purchaseType = _json['purchaseType'] as core.String;
@@ -4331,7 +4326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultLanguage != null) 'defaultLanguage': defaultLanguage!,
         if (defaultPrice != null) 'defaultPrice': defaultPrice!.toJson(),
         if (gracePeriod != null) 'gracePeriod': gracePeriod!,
@@ -4378,7 +4373,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (benefits != null) 'benefits': benefits!,
         if (description != null) 'description': description!,
         if (title != null) 'title': title!,
@@ -4421,7 +4416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inappproduct != null)
           'inappproduct': inappproduct!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -4462,7 +4457,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificateFingerprint != null)
           'certificateFingerprint': certificateFingerprint!,
         if (downloadUrl != null) 'downloadUrl': downloadUrl!,
@@ -4514,7 +4509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (introductoryPriceAmountMicros != null)
           'introductoryPriceAmountMicros': introductoryPriceAmountMicros!,
         if (introductoryPriceCurrencyCode != null)
@@ -4566,7 +4561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullDescription != null) 'fullDescription': fullDescription!,
         if (language != null) 'language': language!,
         if (shortDescription != null) 'shortDescription': shortDescription!,
@@ -4597,7 +4592,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (listings != null)
           'listings': listings!.map((value) => value.toJson()).toList(),
@@ -4624,7 +4619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (language != null) 'language': language!,
         if (text != null) 'text': text!,
       };
@@ -4661,7 +4656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resultPerPage != null) 'resultPerPage': resultPerPage!,
         if (startIndex != null) 'startIndex': startIndex!,
         if (totalResults != null) 'totalResults': totalResults!,
@@ -4689,7 +4684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currency != null) 'currency': currency!,
         if (priceMicros != null) 'priceMicros': priceMicros!,
       };
@@ -4814,7 +4809,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acknowledgementState != null)
           'acknowledgementState': acknowledgementState!,
         if (consumptionState != null) 'consumptionState': consumptionState!,
@@ -4849,7 +4844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (developerPayload != null) 'developerPayload': developerPayload!,
       };
 }
@@ -4882,7 +4877,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorName != null) 'authorName': authorName!,
         if (comments != null)
           'comments': comments!.map((value) => value.toJson()).toList(),
@@ -4910,7 +4905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastEdited != null) 'lastEdited': lastEdited!.toJson(),
         if (replyText != null) 'replyText': replyText!,
       };
@@ -4946,7 +4941,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageInfo != null) 'pageInfo': pageInfo!.toJson(),
         if (reviews != null)
           'reviews': reviews!.map((value) => value.toJson()).toList(),
@@ -4971,7 +4966,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (replyText != null) 'replyText': replyText!,
       };
 }
@@ -4990,7 +4985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
       };
 }
@@ -5020,7 +5015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cancelSurveyReason != null)
           'cancelSurveyReason': cancelSurveyReason!,
         if (userInputCancelReason != null)
@@ -5056,7 +5051,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (desiredExpiryTimeMillis != null)
           'desiredExpiryTimeMillis': desiredExpiryTimeMillis!,
         if (expectedExpiryTimeMillis != null)
@@ -5097,7 +5092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newPrice != null) 'newPrice': newPrice!.toJson(),
         if (state != null) 'state': state!,
       };
@@ -5378,7 +5373,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acknowledgementState != null)
           'acknowledgementState': acknowledgementState!,
         if (autoRenewing != null) 'autoRenewing': autoRenewing!,
@@ -5432,7 +5427,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (developerPayload != null) 'developerPayload': developerPayload!,
       };
 }
@@ -5451,7 +5446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deferralInfo != null) 'deferralInfo': deferralInfo!.toJson(),
       };
 }
@@ -5469,7 +5464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newExpiryTimeMillis != null)
           'newExpiryTimeMillis': newExpiryTimeMillis!,
       };
@@ -5491,7 +5486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (variants != null)
           'variants': variants!.map((value) => value.toJson()).toList(),
       };
@@ -5514,7 +5509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (googleGroups != null) 'googleGroups': googleGroups!,
       };
 }
@@ -5544,7 +5539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nanos != null) 'nanos': nanos!,
         if (seconds != null) 'seconds': seconds!,
       };
@@ -5578,7 +5573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (previousPageToken != null) 'previousPageToken': previousPageToken!,
       };
@@ -5610,7 +5605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (releases != null)
           'releases': releases!.map((value) => value.toJson()).toList(),
         if (track != null) 'track': track!,
@@ -5696,7 +5691,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countryTargeting != null)
           'countryTargeting': countryTargeting!.toJson(),
         if (inAppUpdatePriority != null)
@@ -5732,7 +5727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
@@ -5840,7 +5835,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidOsVersion != null) 'androidOsVersion': androidOsVersion!,
         if (appVersionCode != null) 'appVersionCode': appVersionCode!,
         if (appVersionName != null) 'appVersionName': appVersionName!,
@@ -5875,7 +5870,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxSdkVersion != null) 'maxSdkVersion': maxSdkVersion!,
         if (name != null) 'name': name!,
       };
@@ -5905,7 +5900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceSpec != null) 'deviceSpec': deviceSpec!.toJson(),
         if (variantId != null) 'variantId': variantId!,
       };
@@ -5973,7 +5968,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (orderId != null) 'orderId': orderId!,
         if (purchaseTimeMillis != null)
@@ -6013,7 +6008,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageInfo != null) 'pageInfo': pageInfo!.toJson(),
         if (tokenPagination != null)
           'tokenPagination': tokenPagination!.toJson(),
diff --git a/generated/googleapis/lib/apigateway/v1.dart b/generated/googleapis/lib/apigateway/v1.dart
index 095d808..8a0a224 100644
--- a/generated/googleapis/lib/apigateway/v1.dart
+++ b/generated/googleapis/lib/apigateway/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1608,13 +1607,12 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('managedService')) {
       managedService = _json['managedService'] as core.String;
@@ -1630,7 +1628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
@@ -1756,13 +1754,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('managedServiceConfigs')) {
       managedServiceConfigs = (_json['managedServiceConfigs'] as core.List)
@@ -1792,7 +1789,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (displayName != null) 'displayName': displayName!,
         if (gatewayServiceAccount != null)
@@ -1840,7 +1837,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contents != null) 'contents': contents!,
         if (path != null) 'path': path!,
       };
@@ -1881,7 +1878,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileDescriptorSet != null)
           'fileDescriptorSet': fileDescriptorSet!.toJson(),
         if (source != null)
@@ -1903,7 +1900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
       };
 }
@@ -1950,7 +1947,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1992,7 +1989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -2064,7 +2061,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -2079,7 +2076,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -2143,7 +2140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2227,13 +2224,12 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2246,7 +2242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiConfig != null) 'apiConfig': apiConfig!,
         if (createTime != null) 'createTime': createTime!,
         if (defaultHostname != null) 'defaultHostname': defaultHostname!,
@@ -2288,7 +2284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiConfigs != null)
           'apiConfigs': apiConfigs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2327,7 +2323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apis != null) 'apis': apis!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (unreachableLocations != null)
@@ -2365,7 +2361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gateways != null)
           'gateways': gateways!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2396,7 +2392,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2425,7 +2421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -2469,32 +2465,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -2557,29 +2551,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2667,7 +2659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (diagnostics != null)
@@ -2700,7 +2692,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null) 'location': location!,
         if (message != null) 'message': message!,
       };
@@ -2810,7 +2802,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -2847,7 +2839,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -2886,8 +2878,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2900,7 +2892,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2926,7 +2918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2947,7 +2939,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2966,5 +2958,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis/lib/apigee/v1.dart b/generated/googleapis/lib/apigee/v1.dart
index 13a7200..e44e68c 100644
--- a/generated/googleapis/lib/apigee/v1.dart
+++ b/generated/googleapis/lib/apigee/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -10302,8 +10301,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -10313,7 +10312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (data != null) 'data': data!,
         if (extensions != null) 'extensions': extensions!,
@@ -10342,7 +10341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (Get != null) 'Get': Get!.toJson(),
         if (Remove != null) 'Remove': Remove!.toJson(),
         if (Set != null) 'Set': Set!.toJson(),
@@ -10367,7 +10366,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -10391,7 +10390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (success != null) 'success': success!,
       };
@@ -10420,7 +10419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (success != null) 'success': success!,
         if (value != null) 'value': value!,
@@ -10437,7 +10436,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Reference to a certificate or key/certificate pair.
@@ -10472,7 +10471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alias != null) 'alias': alias!,
         if (certsInfo != null) 'certsInfo': certsInfo!.toJson(),
         if (type != null) 'type': type!,
@@ -10511,7 +10510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null) 'location': location!,
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
@@ -10556,7 +10555,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!.toJson(),
         if (errorCode != null) 'errorCode': errorCode!,
         if (message != null) 'message': message!,
@@ -10596,7 +10595,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (siteId != null) 'siteId': siteId!,
@@ -10790,7 +10789,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiResources != null) 'apiResources': apiResources!,
         if (approvalType != null) 'approvalType': approvalType!,
         if (attributes != null)
@@ -10828,7 +10827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiproduct != null) 'apiproduct': apiproduct!,
         if (status != null) 'status': status!,
       };
@@ -10868,7 +10867,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latestRevisionId != null) 'latestRevisionId': latestRevisionId!,
         if (metaData != null) 'metaData': metaData!.toJson(),
         if (name != null) 'name': name!,
@@ -10993,15 +10992,14 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('entityMetaDataAsProperties')) {
-      entityMetaDataAsProperties =
-          (_json['entityMetaDataAsProperties'] as core.Map)
-              .cast<core.String, core.String>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      entityMetaDataAsProperties = (_json['entityMetaDataAsProperties']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lastModifiedAt')) {
       lastModifiedAt = _json['lastModifiedAt'] as core.String;
@@ -11069,7 +11067,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basepaths != null) 'basepaths': basepaths!,
         if (configurationVersion != null)
           'configurationVersion': configurationVersion!.toJson(),
@@ -11127,7 +11125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorCode != null) 'errorCode': errorCode!,
         if (message != null) 'message': message!,
         if (requestId != null) 'requestId': requestId!,
@@ -11249,7 +11247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiProducts != null)
           'apiProducts': apiProducts!.map((value) => value.toJson()).toList(),
         if (appId != null) 'appId': appId!,
@@ -11360,7 +11358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (created != null) 'created': created!,
         if (envgroupHostname != null) 'envgroupHostname': envgroupHostname!,
         if (error != null) 'error': error!,
@@ -11401,7 +11399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expires != null) 'expires': expires!,
         if (self != null) 'self': self!,
       };
@@ -11453,7 +11451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (error != null) 'error': error!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -11481,7 +11479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -11503,7 +11501,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribute != null)
           'attribute': attribute!.map((value) => value.toJson()).toList(),
       };
@@ -11599,7 +11597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (control != null) 'control': control!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -11643,7 +11641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (env != null) 'env': env!,
         if (instanceId != null) 'instance_id': instanceId!,
         if (location != null) 'location': location!,
@@ -11728,7 +11726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConstraints != null) 'basicConstraints': basicConstraints!,
         if (expiryDate != null) 'expiryDate': expiryDate!,
         if (isValid != null) 'isValid': isValid!,
@@ -11760,7 +11758,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certInfo != null)
           'certInfo': certInfo!.map((value) => value.toJson()).toList(),
       };
@@ -11781,7 +11779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matchWildCards != null) 'matchWildCards': matchWildCards!,
         if (name != null) 'name': name!,
       };
@@ -11808,7 +11806,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (majorVersion != null) 'majorVersion': majorVersion!,
         if (minorVersion != null) 'minorVersion': minorVersion!,
       };
@@ -11881,7 +11879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiProducts != null)
           'apiProducts': apiProducts!.map((value) => value.toJson()).toList(),
         if (attributes != null)
@@ -12083,7 +12081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chartType != null) 'chartType': chartType!,
         if (comments != null) 'comments': comments!,
         if (createdAt != null) 'createdAt': createdAt!,
@@ -12131,7 +12129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (function != null) 'function': function!,
         if (name != null) 'name': name!,
       };
@@ -12191,7 +12189,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAt != null) 'createdAt': createdAt!,
         if (description != null) 'description': description!,
         if (lastModifiedAt != null) 'lastModifiedAt': lastModifiedAt!,
@@ -12227,7 +12225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
       };
@@ -12301,7 +12299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (datastoreConfig != null)
           'datastoreConfig': datastoreConfig!.toJson(),
@@ -12354,7 +12352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketName != null) 'bucketName': bucketName!,
         if (datasetName != null) 'datasetName': datasetName!,
         if (path != null) 'path': path!,
@@ -12391,7 +12389,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (end != null) 'end': end!,
         if (start != null) 'start': start!,
       };
@@ -12448,14 +12446,13 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('namespaces')) {
-      namespaces = (_json['namespaces'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      namespaces =
+          (_json['namespaces'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('requestJSONPaths')) {
       requestJSONPaths = (_json['requestJSONPaths'] as core.List)
@@ -12484,7 +12481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (faultJSONPaths != null) 'faultJSONPaths': faultJSONPaths!,
         if (faultXPaths != null) 'faultXPaths': faultXPaths!,
         if (name != null) 'name': name!,
@@ -12561,7 +12558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (filter != null) 'filter': filter!,
         if (name != null) 'name': name!,
@@ -12599,7 +12596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completed != null) 'completed': completed!,
         if (point != null)
           'point': point!.map((value) => value.toJson()).toList(),
@@ -12618,7 +12615,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (message != null) 'message': message!,
       };
 }
@@ -12722,7 +12719,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiProxy != null) 'apiProxy': apiProxy!,
         if (deployStartTime != null) 'deployStartTime': deployStartTime!,
         if (environment != null) 'environment': environment!,
@@ -12789,7 +12786,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (routingChanges != null)
           'routingChanges':
               routingChanges!.map((value) => value.toJson()).toList(),
@@ -12849,7 +12846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (environmentGroup != null) 'environmentGroup': environmentGroup!,
         if (fromDeployment != null) 'fromDeployment': fromDeployment!.toJson(),
@@ -12890,7 +12887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conflictingDeployment != null)
           'conflictingDeployment': conflictingDeployment!.toJson(),
         if (description != null) 'description': description!,
@@ -12930,7 +12927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiProxy != null) 'apiProxy': apiProxy!,
         if (basepath != null) 'basepath': basepath!,
         if (environment != null) 'environment': environment!,
@@ -12967,14 +12964,13 @@
 
   GoogleCloudApigeeV1DeploymentConfig.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = (_json['attributes'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      attributes =
+          (_json['attributes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('basePath')) {
       basePath = _json['basePath'] as core.String;
@@ -12993,7 +12989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!,
         if (basePath != null) 'basePath': basePath!,
         if (location != null) 'location': location!,
@@ -13131,7 +13127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessType != null) 'accessType': accessType!,
         if (appFamily != null) 'appFamily': appFamily!,
         if (apps != null) 'apps': apps!,
@@ -13263,7 +13259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiProducts != null) 'apiProducts': apiProducts!,
         if (appFamily != null) 'appFamily': appFamily!,
         if (appId != null) 'appId': appId!,
@@ -13366,7 +13362,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiProducts != null) 'apiProducts': apiProducts!,
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
@@ -13403,7 +13399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null)
           'metrics': metrics!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -13436,7 +13432,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAt != null) 'createdAt': createdAt!,
         if (lastModifiedAt != null) 'lastModifiedAt': lastModifiedAt!,
         if (subType != null) 'subType': subType!,
@@ -13515,7 +13511,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAt != null) 'createdAt': createdAt!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -13614,14 +13610,13 @@
           .toList();
     }
     if (_json.containsKey('featureFlags')) {
-      featureFlags = (_json['featureFlags'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      featureFlags =
+          (_json['featureFlags'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('flowhooks')) {
       flowhooks = (_json['flowhooks'] as core.List)
@@ -13682,7 +13677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (dataCollectors != null)
           'dataCollectors':
@@ -13771,7 +13766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAt != null) 'createdAt': createdAt!,
         if (hostnames != null) 'hostnames': hostnames!,
         if (lastModifiedAt != null) 'lastModifiedAt': lastModifiedAt!,
@@ -13811,7 +13806,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAt != null) 'createdAt': createdAt!,
         if (environment != null) 'environment': environment!,
         if (name != null) 'name': name!,
@@ -13868,7 +13863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hostnames != null) 'hostnames': hostnames!,
         if (name != null) 'name': name!,
         if (revisionId != null) 'revisionId': revisionId!,
@@ -13961,7 +13956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (created != null) 'created': created!,
         if (datastoreName != null) 'datastoreName': datastoreName!,
         if (description != null) 'description': description!,
@@ -14036,7 +14031,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (csvDelimiter != null) 'csvDelimiter': csvDelimiter!,
         if (datastoreName != null) 'datastoreName': datastoreName!,
         if (dateRange != null) 'dateRange': dateRange!.toJson(),
@@ -14088,7 +14083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (continueOnError != null) 'continueOnError': continueOnError!,
         if (description != null) 'description': description!,
         if (flowHookPoint != null) 'flowHookPoint': flowHookPoint!,
@@ -14128,7 +14123,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (continueOnError != null) 'continueOnError': continueOnError!,
         if (name != null) 'name': name!,
         if (sharedFlowName != null) 'sharedFlowName': sharedFlowName!,
@@ -14143,7 +14138,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 class GoogleCloudApigeeV1IngressConfig {
@@ -14190,7 +14185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environmentGroups != null)
           'environmentGroups':
               environmentGroups!.map((value) => value.toJson()).toList(),
@@ -14315,7 +14310,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAt != null) 'createdAt': createdAt!,
         if (description != null) 'description': description!,
         if (diskEncryptionKeyName != null)
@@ -14361,7 +14356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAt != null) 'createdAt': createdAt!,
         if (environment != null) 'environment': environment!,
         if (name != null) 'name': name!,
@@ -14407,7 +14402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployedRevisions != null)
           'deployedRevisions':
               deployedRevisions!.map((value) => value.toJson()).toList(),
@@ -14438,7 +14433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (percentage != null) 'percentage': percentage!,
         if (revision != null) 'revision': revision!,
       };
@@ -14478,7 +14473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basepath != null) 'basepath': basepath!,
         if (envgroup != null) 'envgroup': envgroup!,
         if (environment != null) 'environment': environment!,
@@ -14507,7 +14502,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliasId != null) 'aliasId': aliasId!,
         if (reference != null) 'reference': reference!,
       };
@@ -14536,7 +14531,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encrypted != null) 'encrypted': encrypted!,
         if (name != null) 'name': name!,
       };
@@ -14569,7 +14564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliases != null) 'aliases': aliases!,
         if (name != null) 'name': name!,
       };
@@ -14598,7 +14593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliases != null)
           'aliases': aliases!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -14646,7 +14641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (errorCode != null) 'errorCode': errorCode!,
         if (message != null) 'message': message!,
@@ -14671,7 +14666,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiProduct != null)
           'apiProduct': apiProduct!.map((value) => value.toJson()).toList(),
       };
@@ -14692,7 +14687,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (proxies != null)
           'proxies': proxies!.map((value) => value.toJson()).toList(),
       };
@@ -14713,7 +14708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (app != null) 'app': app!.map((value) => value.toJson()).toList(),
       };
 }
@@ -14735,7 +14730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queries != null)
           'queries': queries!.map((value) => value.toJson()).toList(),
       };
@@ -14757,7 +14752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (qualifier != null)
           'qualifier': qualifier!.map((value) => value.toJson()).toList(),
       };
@@ -14789,7 +14784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataCollectors != null)
           'dataCollectors':
               dataCollectors!.map((value) => value.toJson()).toList(),
@@ -14814,7 +14809,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datastores != null)
           'datastores': datastores!.map((value) => value.toJson()).toList(),
       };
@@ -14846,7 +14841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sessions != null)
           'sessions': sessions!.map((value) => value.toJson()).toList(),
@@ -14869,7 +14864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployments != null)
           'deployments': deployments!.map((value) => value.toJson()).toList(),
       };
@@ -14891,7 +14886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (app != null) 'app': app!.map((value) => value.toJson()).toList(),
       };
 }
@@ -14925,7 +14920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environmentGroupAttachments != null)
           'environmentGroupAttachments': environmentGroupAttachments!
               .map((value) => value.toJson())
@@ -14960,7 +14955,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environmentGroups != null)
           'environmentGroups':
               environmentGroups!.map((value) => value.toJson()).toList(),
@@ -14985,7 +14980,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceFile != null)
           'resourceFile': resourceFile!.map((value) => value.toJson()).toList(),
       };
@@ -15008,7 +15003,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exports != null)
           'exports': exports!.map((value) => value.toJson()).toList(),
       };
@@ -15030,7 +15025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (issuers != null)
           'issuers': issuers!.map((value) => value.toJson()).toList(),
       };
@@ -15062,7 +15057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachments != null)
           'attachments': attachments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -15095,7 +15090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -15128,7 +15123,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (natAddresses != null)
           'natAddresses': natAddresses!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -15151,7 +15146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (developer != null)
           'developer': developer!.map((value) => value.toJson()).toList(),
       };
@@ -15173,7 +15168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (organizations != null)
           'organizations':
               organizations!.map((value) => value.toJson()).toList(),
@@ -15195,7 +15190,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sharedFlows != null)
           'sharedFlows': sharedFlows!.map((value) => value.toJson()).toList(),
       };
@@ -15229,7 +15224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null) 'errors': errors!,
         if (notices != null) 'notices': notices!,
       };
@@ -15266,7 +15261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (values != null) 'values': values!,
       };
@@ -15313,7 +15308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (name != null) 'name': name!,
         if (state != null) 'state': state!,
@@ -15348,7 +15343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (methods != null) 'methods': methods!,
         if (resource != null) 'resource': resource!,
       };
@@ -15405,7 +15400,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiSource != null) 'apiSource': apiSource!,
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
@@ -15450,7 +15445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationConfigType != null)
           'operationConfigType': operationConfigType!,
         if (operationConfigs != null)
@@ -15494,7 +15489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationType != null) 'operationType': operationType!,
         if (state != null) 'state': state!,
         if (targetResourceName != null)
@@ -15526,7 +15521,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (Response != null) 'Response': Response!.toJson(),
       };
 }
@@ -15555,7 +15550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
       };
 }
@@ -15598,7 +15593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (TimeUnit != null) 'TimeUnit': TimeUnit!,
         if (metaData != null) 'metaData': metaData!.toJson(),
         if (resultTruncated != null) 'resultTruncated': resultTruncated!,
@@ -15820,7 +15815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyticsRegion != null) 'analyticsRegion': analyticsRegion!,
         if (attributes != null) 'attributes': attributes!,
         if (authorizedNetwork != null) 'authorizedNetwork': authorizedNetwork!,
@@ -15864,7 +15859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (organization != null) 'organization': organization!,
         if (projectIds != null) 'projectIds': projectIds!,
       };
@@ -15937,7 +15932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appVersion != null) 'appVersion': appVersion!,
         if (deploymentStatus != null) 'deploymentStatus': deploymentStatus!,
         if (deploymentStatusTime != null)
@@ -15984,7 +15979,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
@@ -16009,7 +16004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (property != null)
           'property': property!.map((value) => value.toJson()).toList(),
       };
@@ -16034,7 +16029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -16075,7 +16070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyticsRegion != null) 'analyticsRegion': analyticsRegion!,
         if (authorizedNetwork != null) 'authorizedNetwork': authorizedNetwork!,
         if (runtimeLocation != null) 'runtimeLocation': runtimeLocation!,
@@ -16197,7 +16192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (csvDelimiter != null) 'csvDelimiter': csvDelimiter!,
         if (dimensions != null) 'dimensions': dimensions!,
         if (envgroupHostname != null) 'envgroupHostname': envgroupHostname!,
@@ -16262,7 +16257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null) 'dimensions': dimensions!,
         if (endTimestamp != null) 'endTimestamp': endTimestamp!,
         if (metrics != null) 'metrics': metrics!,
@@ -16314,7 +16309,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alias != null) 'alias': alias!,
         if (function != null) 'function': function!,
         if (name != null) 'name': name!,
@@ -16363,7 +16358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (interval != null) 'interval': interval!,
         if (limit != null) 'limit': limit!,
         if (timeUnit != null) 'timeUnit': timeUnit!,
@@ -16417,7 +16412,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (name != null) 'name': name!,
         if (refers != null) 'refers': refers!,
@@ -16446,7 +16441,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (resourceName != null) 'resourceName': resourceName!,
       };
@@ -16486,7 +16481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceUid != null) 'instanceUid': instanceUid!,
         if (reportTime != null) 'reportTime': reportTime!,
         if (resources != null)
@@ -16502,7 +16497,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 class GoogleCloudApigeeV1ReportProperty {
@@ -16527,7 +16522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (property != null) 'property': property!,
         if (value != null)
           'value': value!.map((value) => value.toJson()).toList(),
@@ -16554,7 +16549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null) 'location': location!,
         if (name != null) 'name': name!,
       };
@@ -16581,7 +16576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
       };
@@ -16604,7 +16599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceFile != null)
           'resourceFile': resourceFile!.map((value) => value.toJson()).toList(),
       };
@@ -16652,7 +16647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resource != null) 'resource': resource!,
         if (revisions != null)
           'revisions': revisions!.map((value) => value.toJson()).toList(),
@@ -16767,7 +16762,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ActionResult != null) 'ActionResult': ActionResult!,
         if (accessList != null)
           'accessList': accessList!.map((value) => value.toJson()).toList(),
@@ -16818,7 +16813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
         if (jsonSpec != null) 'jsonSpec': jsonSpec!,
@@ -16881,7 +16876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basepath != null) 'basepath': basepath!,
         if (envGroupRevision != null) 'envGroupRevision': envGroupRevision!,
         if (environment != null) 'environment': environment!,
@@ -16955,7 +16950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endpoint != null) 'endpoint': endpoint!,
         if (exporter != null) 'exporter': exporter!,
         if (name != null) 'name': name!,
@@ -17019,7 +17014,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiProxy != null) 'apiProxy': apiProxy!,
         if (name != null) 'name': name!,
         if (revisionCreateTime != null)
@@ -17065,7 +17060,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sampler != null) 'sampler': sampler!,
         if (samplingRate != null) 'samplingRate': samplingRate!,
       };
@@ -17111,7 +17106,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null)
           'dimensions': dimensions!.map((value) => value.toJson()).toList(),
         if (meta != null) 'meta': meta!,
@@ -17141,7 +17136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (properties != null) 'properties': properties!.toJson(),
       };
@@ -17173,7 +17168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (custom != null) 'custom': custom!,
         if (type != null) 'type': type!,
@@ -17200,7 +17195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emailIds != null) 'emailIds': emailIds!,
         if (service != null) 'service': service!,
       };
@@ -17225,7 +17220,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (timestampMs != null) 'timestampMs': timestampMs!,
       };
@@ -17265,7 +17260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latestRevisionId != null) 'latestRevisionId': latestRevisionId!,
         if (metaData != null) 'metaData': metaData!.toJson(),
         if (name != null) 'name': name!,
@@ -17345,15 +17340,14 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('entityMetaDataAsProperties')) {
-      entityMetaDataAsProperties =
-          (_json['entityMetaDataAsProperties'] as core.Map)
-              .cast<core.String, core.String>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      entityMetaDataAsProperties = (_json['entityMetaDataAsProperties']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lastModifiedAt')) {
       lastModifiedAt = _json['lastModifiedAt'] as core.String;
@@ -17388,7 +17382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configurationVersion != null)
           'configurationVersion': configurationVersion!.toJson(),
         if (contextInfo != null) 'contextInfo': contextInfo!,
@@ -17442,7 +17436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environments != null)
           'environments': environments!.map((value) => value.toJson()).toList(),
         if (hosts != null)
@@ -17495,7 +17489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null)
           'dimensions': dimensions!.map((value) => value.toJson()).toList(),
         if (metrics != null)
@@ -17549,7 +17543,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null)
           'dimensions': dimensions!.map((value) => value.toJson()).toList(),
         if (metrics != null)
@@ -17574,7 +17568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -17627,7 +17621,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (identities != null) 'identities': identities!,
       };
@@ -17706,7 +17700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (host != null) 'host': host!,
         if (isEnabled != null) 'isEnabled': isEnabled!,
@@ -17748,7 +17742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (name != null) 'name': name!,
         if (port != null) 'port': port!,
@@ -17779,7 +17773,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!,
         if (state != null) 'state': state!,
       };
@@ -17872,7 +17866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ciphers != null) 'ciphers': ciphers!,
         if (clientAuthEnabled != null) 'clientAuthEnabled': clientAuthEnabled!,
         if (commonName != null) 'commonName': commonName!.toJson(),
@@ -17904,7 +17898,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (value != null) 'value': value!,
         if (wildcardMatch != null) 'wildcardMatch': wildcardMatch!,
       };
@@ -17988,7 +17982,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ciphers != null) 'ciphers': ciphers!,
         if (clientAuthEnabled != null) 'clientAuthEnabled': clientAuthEnabled!,
         if (commonName != null) 'commonName': commonName!.toJson(),
@@ -18120,7 +18114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (message != null) 'message': message!,
         if (resource != null) 'resource': resource!,
@@ -18170,7 +18164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -18212,7 +18206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -18284,7 +18278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -18396,7 +18390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -18433,7 +18427,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -18458,7 +18452,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -18479,7 +18473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -18507,7 +18501,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -18568,29 +18562,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -18613,7 +18605,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Describes what preconditions have failed.
@@ -18637,7 +18629,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (violations != null)
           'violations': violations!.map((value) => value.toJson()).toList(),
       };
@@ -18678,7 +18670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (subject != null) 'subject': subject!,
         if (type != null) 'type': type!,
@@ -18718,8 +18710,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -18732,7 +18724,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -18800,7 +18792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
diff --git a/generated/googleapis/lib/appengine/v1.dart b/generated/googleapis/lib/appengine/v1.dart
index 7f855a0..494bb50 100644
--- a/generated/googleapis/lib/appengine/v1.dart
+++ b/generated/googleapis/lib/appengine/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2157,7 +2156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authFailAction != null) 'authFailAction': authFailAction!,
         if (login != null) 'login': login!,
         if (script != null) 'script': script!,
@@ -2179,7 +2178,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (scriptPath != null) 'scriptPath': scriptPath!,
       };
 }
@@ -2312,7 +2311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authDomain != null) 'authDomain': authDomain!,
         if (codeBucket != null) 'codeBucket': codeBucket!,
         if (databaseType != null) 'databaseType': databaseType!,
@@ -2438,7 +2437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificateRawData != null)
           'certificateRawData': certificateRawData!.toJson(),
         if (displayName != null) 'displayName': displayName!,
@@ -2481,7 +2480,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
       };
@@ -2595,7 +2594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coolDownPeriod != null) 'coolDownPeriod': coolDownPeriod!,
         if (cpuUtilization != null) 'cpuUtilization': cpuUtilization!.toJson(),
         if (diskUtilization != null)
@@ -2641,7 +2640,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (idleTimeout != null) 'idleTimeout': idleTimeout!,
         if (maxInstances != null) 'maxInstances': maxInstances!,
       };
@@ -2663,7 +2662,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingressRules != null)
           'ingressRules': ingressRules!.map((value) => value.toJson()).toList(),
       };
@@ -2685,7 +2684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingressRules != null)
           'ingressRules': ingressRules!.map((value) => value.toJson()).toList(),
       };
@@ -2718,7 +2717,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (privateKey != null) 'privateKey': privateKey!,
         if (publicCertificate != null) 'publicCertificate': publicCertificate!,
       };
@@ -2753,7 +2752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appYamlPath != null) 'appYamlPath': appYamlPath!,
         if (cloudBuildTimeout != null) 'cloudBuildTimeout': cloudBuildTimeout!,
       };
@@ -2779,7 +2778,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (image != null) 'image': image!,
       };
 }
@@ -2805,7 +2804,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregationWindowLength != null)
           'aggregationWindowLength': aggregationWindowLength!,
         if (targetUtilization != null) 'targetUtilization': targetUtilization!,
@@ -2828,7 +2827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudBuildId != null) 'cloudBuildId': cloudBuildId!,
       };
 }
@@ -2849,7 +2848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudBuildId != null) 'cloudBuildId': cloudBuildId!,
       };
 }
@@ -2870,7 +2869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudBuildId != null) 'cloudBuildId': cloudBuildId!,
       };
 }
@@ -2894,7 +2893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sshKey != null) 'sshKey': sshKey!,
       };
 }
@@ -2934,14 +2933,12 @@
           _json['container'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('files')) {
-      files = (_json['files'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              FileInfo.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      files = (_json['files'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          FileInfo.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('zip')) {
       zip =
@@ -2949,7 +2946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudBuildOptions != null)
           'cloudBuildOptions': cloudBuildOptions!.toJson(),
         if (container != null) 'container': container!.toJson(),
@@ -2993,7 +2990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetReadBytesPerSecond != null)
           'targetReadBytesPerSecond': targetReadBytesPerSecond!,
         if (targetReadOpsPerSecond != null)
@@ -3049,7 +3046,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (resourceRecords != null)
@@ -3073,7 +3070,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Cloud Endpoints (https://cloud.google.com/endpoints) configuration.
@@ -3137,7 +3134,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configId != null) 'configId': configId!,
         if (disableTraceSampling != null)
           'disableTraceSampling': disableTraceSampling!,
@@ -3159,7 +3156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (shell != null) 'shell': shell!,
       };
 }
@@ -3198,7 +3195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorCode != null) 'errorCode': errorCode!,
         if (mimeType != null) 'mimeType': mimeType!,
         if (staticFile != null) 'staticFile': staticFile!,
@@ -3234,7 +3231,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (splitHealthChecks != null) 'splitHealthChecks': splitHealthChecks!,
         if (useContainerOptimizedOs != null)
           'useContainerOptimizedOs': useContainerOptimizedOs!,
@@ -3271,7 +3268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mimeType != null) 'mimeType': mimeType!,
         if (sha1Sum != null) 'sha1Sum': sha1Sum!,
         if (sourceUrl != null) 'sourceUrl': sourceUrl!,
@@ -3330,7 +3327,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (description != null) 'description': description!,
         if (priority != null) 'priority': priority!,
@@ -3395,7 +3392,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checkInterval != null) 'checkInterval': checkInterval!,
         if (disableHealthCheck != null)
           'disableHealthCheck': disableHealthCheck!,
@@ -3446,7 +3443,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
         if (oauth2ClientId != null) 'oauth2ClientId': oauth2ClientId!,
         if (oauth2ClientSecret != null)
@@ -3638,7 +3635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appEngineRelease != null) 'appEngineRelease': appEngineRelease!,
         if (availability != null) 'availability': availability!,
         if (averageLatency != null) 'averageLatency': averageLatency!,
@@ -3680,7 +3677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (version != null) 'version': version!,
       };
@@ -3708,7 +3705,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificates != null)
           'certificates': certificates!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3737,7 +3734,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domains != null)
           'domains': domains!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3766,7 +3763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domainMappings != null)
           'domainMappings':
               domainMappings!.map((value) => value.toJson()).toList(),
@@ -3796,7 +3793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingressRules != null)
           'ingressRules': ingressRules!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3825,7 +3822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3854,7 +3851,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3883,7 +3880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -3912,7 +3909,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (services != null)
           'services': services!.map((value) => value.toJson()).toList(),
@@ -3941,7 +3938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (versions != null)
           'versions': versions!.map((value) => value.toJson()).toList(),
@@ -4003,7 +4000,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checkInterval != null) 'checkInterval': checkInterval!,
         if (failureThreshold != null) 'failureThreshold': failureThreshold!,
         if (host != null) 'host': host!,
@@ -4051,32 +4048,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -4118,7 +4113,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (flexibleEnvironmentAvailable != null)
           'flexibleEnvironmentAvailable': flexibleEnvironmentAvailable!,
         if (searchApiAvailable != null)
@@ -4176,7 +4171,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastRenewalTime != null) 'lastRenewalTime': lastRenewalTime!,
         if (status != null) 'status': status!,
       };
@@ -4200,7 +4195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null) 'instances': instances!,
       };
 }
@@ -4268,7 +4263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (forwardedPorts != null) 'forwardedPorts': forwardedPorts!,
         if (instanceTag != null) 'instanceTag': instanceTag!,
         if (name != null) 'name': name!,
@@ -4299,7 +4294,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingressTrafficAllowed != null)
           'ingressTrafficAllowed': ingressTrafficAllowed!,
       };
@@ -4341,7 +4336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetReceivedBytesPerSecond != null)
           'targetReceivedBytesPerSecond': targetReceivedBytesPerSecond!,
         if (targetReceivedPacketsPerSecond != null)
@@ -4407,29 +4402,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4504,7 +4497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createVersionMetadata != null)
           'createVersionMetadata': createVersionMetadata!.toJson(),
         if (endTime != null) 'endTime': endTime!,
@@ -4583,7 +4576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createVersionMetadata != null)
           'createVersionMetadata': createVersionMetadata!.toJson(),
         if (endTime != null) 'endTime': endTime!,
@@ -4662,7 +4655,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createVersionMetadata != null)
           'createVersionMetadata': createVersionMetadata!.toJson(),
         if (endTime != null) 'endTime': endTime!,
@@ -4730,7 +4723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appStartTimeout != null) 'appStartTimeout': appStartTimeout!,
         if (checkInterval != null) 'checkInterval': checkInterval!,
         if (failureThreshold != null) 'failureThreshold': failureThreshold!,
@@ -4749,7 +4742,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Target scaling by request utilization.
@@ -4774,7 +4767,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetConcurrentRequests != null)
           'targetConcurrentRequests': targetConcurrentRequests!,
         if (targetRequestCountPerSecond != null)
@@ -4819,7 +4812,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (rrdata != null) 'rrdata': rrdata!,
         if (type != null) 'type': type!,
@@ -4868,7 +4861,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpu != null) 'cpu': cpu!,
         if (diskGb != null) 'diskGb': diskGb!,
         if (kmsKeyReference != null) 'kmsKeyReference': kmsKeyReference!,
@@ -4891,7 +4884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (scriptPath != null) 'scriptPath': scriptPath!,
       };
 }
@@ -4943,7 +4936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (networkSettings != null)
@@ -5005,7 +4998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificateId != null) 'certificateId': certificateId!,
         if (pendingManagedCertificateId != null)
           'pendingManagedCertificateId': pendingManagedCertificateId!,
@@ -5050,7 +5043,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxInstances != null) 'maxInstances': maxInstances!,
         if (minInstances != null) 'minInstances': minInstances!,
         if (targetCpuUtilization != null)
@@ -5110,14 +5103,13 @@
       expiration = _json['expiration'] as core.String;
     }
     if (_json.containsKey('httpHeaders')) {
-      httpHeaders = (_json['httpHeaders'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      httpHeaders =
+          (_json['httpHeaders'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -5133,7 +5125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicationReadable != null)
           'applicationReadable': applicationReadable!,
         if (expiration != null) 'expiration': expiration!,
@@ -5179,8 +5171,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -5193,7 +5185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -5236,21 +5228,20 @@
 
   TrafficSplit.fromJson(core.Map _json) {
     if (_json.containsKey('allocations')) {
-      allocations = (_json['allocations'] as core.Map)
-          .cast<core.String, core.double>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              (item as core.num).toDouble(),
-            ),
-          );
+      allocations =
+          (_json['allocations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          (item as core.num).toDouble(),
+        ),
+      );
     }
     if (_json.containsKey('shardBy')) {
       shardBy = _json['shardBy'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allocations != null) 'allocations': allocations!,
         if (shardBy != null) 'shardBy': shardBy!,
       };
@@ -5291,7 +5282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domain != null) 'domain': domain!,
         if (path != null) 'path': path!,
         if (service != null) 'service': service!,
@@ -5411,7 +5402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiEndpoint != null) 'apiEndpoint': apiEndpoint!.toJson(),
         if (authFailAction != null) 'authFailAction': authFailAction!,
         if (login != null) 'login': login!,
@@ -5641,24 +5632,23 @@
           _json['basicScaling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('betaSettings')) {
-      betaSettings = (_json['betaSettings'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      betaSettings =
+          (_json['betaSettings'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('buildEnvVariables')) {
-      buildEnvVariables = (_json['buildEnvVariables'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      buildEnvVariables =
+          (_json['buildEnvVariables'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -5688,14 +5678,13 @@
       env = _json['env'] as core.String;
     }
     if (_json.containsKey('envVariables')) {
-      envVariables = (_json['envVariables'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      envVariables =
+          (_json['envVariables'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('errorHandlers')) {
       errorHandlers = (_json['errorHandlers'] as core.List)
@@ -5792,7 +5781,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiConfig != null) 'apiConfig': apiConfig!.toJson(),
         if (automaticScaling != null)
           'automaticScaling': automaticScaling!.toJson(),
@@ -5869,7 +5858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (sizeGb != null) 'sizeGb': sizeGb!,
         if (volumeType != null) 'volumeType': volumeType!,
@@ -5890,7 +5879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -5920,7 +5909,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filesCount != null) 'filesCount': filesCount!,
         if (sourceUrl != null) 'sourceUrl': sourceUrl!,
       };
diff --git a/generated/googleapis/lib/artifactregistry/v1.dart b/generated/googleapis/lib/artifactregistry/v1.dart
index 4ea5e24..25c4fe3 100644
--- a/generated/googleapis/lib/artifactregistry/v1.dart
+++ b/generated/googleapis/lib/artifactregistry/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -257,7 +256,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// DockerImage represents a docker artifact.
@@ -322,7 +321,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageSizeBytes != null) 'imageSizeBytes': imageSizeBytes!,
         if (mediaType != null) 'mediaType': mediaType!,
         if (name != null) 'name': name!,
@@ -346,7 +345,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Operations.ListOperations.
@@ -371,7 +370,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -432,29 +431,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -496,8 +493,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -510,7 +507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/assuredworkloads/v1.dart b/generated/googleapis/lib/assuredworkloads/v1.dart
index 7a147ca..7c58c4d 100644
--- a/generated/googleapis/lib/assuredworkloads/v1.dart
+++ b/generated/googleapis/lib/assuredworkloads/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -478,7 +477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (complianceRegime != null) 'complianceRegime': complianceRegime!,
         if (createTime != null) 'createTime': createTime!,
         if (displayName != null) 'displayName': displayName!,
@@ -511,7 +510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (workloads != null)
           'workloads': workloads!.map((value) => value.toJson()).toList(),
@@ -629,13 +628,12 @@
           _json['kmsSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -653,7 +651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingAccount != null) 'billingAccount': billingAccount!,
         if (complianceRegime != null) 'complianceRegime': complianceRegime!,
         if (createTime != null) 'createTime': createTime!,
@@ -699,7 +697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextRotationTime != null) 'nextRotationTime': nextRotationTime!,
         if (rotationPeriod != null) 'rotationPeriod': rotationPeriod!,
       };
@@ -730,7 +728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceId != null) 'resourceId': resourceId!,
         if (resourceType != null) 'resourceType': resourceType!,
       };
@@ -785,7 +783,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (complianceRegime != null) 'complianceRegime': complianceRegime!,
         if (createTime != null) 'createTime': createTime!,
         if (displayName != null) 'displayName': displayName!,
@@ -957,13 +955,12 @@
               _json['kmsSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -981,7 +978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingAccount != null) 'billingAccount': billingAccount!,
         if (cjisSettings != null) 'cjisSettings': cjisSettings!.toJson(),
         if (complianceRegime != null) 'complianceRegime': complianceRegime!,
@@ -1023,7 +1020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsSettings != null) 'kmsSettings': kmsSettings!.toJson(),
       };
 }
@@ -1048,7 +1045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsSettings != null) 'kmsSettings': kmsSettings!.toJson(),
       };
 }
@@ -1073,7 +1070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsSettings != null) 'kmsSettings': kmsSettings!.toJson(),
       };
 }
@@ -1098,7 +1095,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsSettings != null) 'kmsSettings': kmsSettings!.toJson(),
       };
 }
@@ -1134,7 +1131,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextRotationTime != null) 'nextRotationTime': nextRotationTime!,
         if (rotationPeriod != null) 'rotationPeriod': rotationPeriod!,
       };
@@ -1166,7 +1163,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceId != null) 'resourceId': resourceId!,
         if (resourceType != null) 'resourceType': resourceType!,
       };
@@ -1195,7 +1192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1256,29 +1253,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1301,7 +1296,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -1337,8 +1332,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1351,7 +1346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/bigquery/v2.dart b/generated/googleapis/lib/bigquery/v2.dart
index 0ecd9af..8b71132 100644
--- a/generated/googleapis/lib/bigquery/v2.dart
+++ b/generated/googleapis/lib/bigquery/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2194,7 +2193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accuracy != null) 'accuracy': accuracy!,
         if (f1Score != null) 'f1Score': f1Score!,
         if (logLoss != null) 'logLoss': logLoss!,
@@ -2258,7 +2257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (argumentKind != null) 'argumentKind': argumentKind!,
         if (dataType != null) 'dataType': dataType!.toJson(),
         if (mode != null) 'mode': mode!,
@@ -2298,7 +2297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoRegressiveCoefficients != null)
           'autoRegressiveCoefficients': autoRegressiveCoefficients!,
         if (interceptCoefficient != null)
@@ -2333,7 +2332,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aic != null) 'aic': aic!,
         if (logLikelihood != null) 'logLikelihood': logLikelihood!,
         if (variance != null) 'variance': variance!,
@@ -2406,7 +2405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arimaFittingMetrics != null)
           'arimaFittingMetrics':
               arimaFittingMetrics!.map((value) => value.toJson()).toList(),
@@ -2476,7 +2475,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arimaCoefficients != null)
           'arimaCoefficients': arimaCoefficients!.toJson(),
         if (arimaFittingMetrics != null)
@@ -2514,7 +2513,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (d != null) 'd': d!,
         if (p != null) 'p': p!,
         if (q != null) 'q': q!,
@@ -2553,7 +2552,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arimaModelInfo != null)
           'arimaModelInfo':
               arimaModelInfo!.map((value) => value.toJson()).toList(),
@@ -2606,7 +2605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arimaFittingMetrics != null)
           'arimaFittingMetrics': arimaFittingMetrics!.toJson(),
         if (hasDrift != null) 'hasDrift': hasDrift!,
@@ -2658,7 +2657,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -2700,7 +2699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -2730,7 +2729,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentIteration != null) 'currentIteration': currentIteration!,
         if (expectedTotalIterations != null)
           'expectedTotalIterations': expectedTotalIterations!,
@@ -2822,7 +2821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encoding != null) 'encoding': encoding!,
         if (fieldName != null) 'fieldName': fieldName!,
         if (onlyReadLatest != null) 'onlyReadLatest': onlyReadLatest!,
@@ -2900,7 +2899,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null)
           'columns': columns!.map((value) => value.toJson()).toList(),
         if (encoding != null) 'encoding': encoding!,
@@ -2960,7 +2959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnFamilies != null)
           'columnFamilies':
               columnFamilies!.map((value) => value.toJson()).toList(),
@@ -3008,7 +3007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregateClassificationMetrics != null)
           'aggregateClassificationMetrics':
               aggregateClassificationMetrics!.toJson(),
@@ -3085,7 +3084,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accuracy != null) 'accuracy': accuracy!,
         if (f1Score != null) 'f1Score': f1Score!,
         if (falseNegatives != null) 'falseNegatives': falseNegatives!,
@@ -3165,7 +3164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -3220,7 +3219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (durationMs != null) 'durationMs': durationMs!,
         if (evalLoss != null) 'evalLoss': evalLoss!,
         if (index != null) 'index': index!,
@@ -3279,7 +3278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (earlyStop != null) 'earlyStop': earlyStop!,
         if (l1Reg != null) 'l1Reg': l1Reg!,
         if (l2Reg != null) 'l2Reg': l2Reg!,
@@ -3338,7 +3337,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iterationResults != null)
           'iterationResults':
               iterationResults!.map((value) => value.toJson()).toList(),
@@ -3369,7 +3368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoryCounts != null)
           'categoryCounts':
               categoryCounts!.map((value) => value.toJson()).toList(),
@@ -3395,7 +3394,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (count != null) 'count': count!,
       };
@@ -3429,7 +3428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (centroidId != null) 'centroidId': centroidId!,
         if (count != null) 'count': count!,
         if (featureValues != null)
@@ -3464,7 +3463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (centroidId != null) 'centroidId': centroidId!,
         if (clusterRadius != null) 'clusterRadius': clusterRadius!,
         if (clusterSize != null) 'clusterSize': clusterSize!,
@@ -3490,7 +3489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
       };
 }
@@ -3524,7 +3523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusters != null)
           'clusters': clusters!.map((value) => value.toJson()).toList(),
         if (daviesBouldinIndex != null)
@@ -3558,7 +3557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidenceThreshold != null)
           'confidenceThreshold': confidenceThreshold!,
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
@@ -3587,7 +3586,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -3684,7 +3683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowJaggedRows != null) 'allowJaggedRows': allowJaggedRows!,
         if (allowQuotedNewlines != null)
           'allowQuotedNewlines': allowQuotedNewlines!,
@@ -3719,7 +3718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (evaluationTable != null)
           'evaluationTable': evaluationTable!.toJson(),
         if (trainingTable != null) 'trainingTable': trainingTable!.toJson(),
@@ -3829,7 +3828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!.toJson(),
         if (domain != null) 'domain': domain!,
         if (groupByEmail != null) 'groupByEmail': groupByEmail!,
@@ -3993,13 +3992,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lastModifiedTime')) {
       lastModifiedTime = _json['lastModifiedTime'] as core.String;
@@ -4015,7 +4013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (access != null)
           'access': access!.map((value) => value.toJson()).toList(),
         if (creationTime != null) 'creationTime': creationTime!,
@@ -4059,7 +4057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetType != null) 'targetType': targetType!,
       };
 }
@@ -4087,7 +4085,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!.toJson(),
         if (targetTypes != null)
           'target_types': targetTypes!.map((value) => value.toJson()).toList(),
@@ -4137,20 +4135,19 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetReference != null)
           'datasetReference': datasetReference!.toJson(),
         if (friendlyName != null) 'friendlyName': friendlyName!,
@@ -4205,7 +4202,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasets != null)
           'datasets': datasets!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -4239,7 +4236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetId != null) 'datasetId': datasetId!,
         if (projectId != null) 'projectId': projectId!,
       };
@@ -4284,17 +4281,16 @@
       friendlyName = _json['friendlyName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (friendlyName != null) 'friendlyName': friendlyName!,
         if (labels != null) 'labels': labels!,
@@ -4316,7 +4312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (totalExplainedVarianceRatio != null)
           'totalExplainedVarianceRatio': totalExplainedVarianceRatio!,
       };
@@ -4340,7 +4336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
       };
 }
@@ -4367,7 +4363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (itemCount != null) 'itemCount': itemCount!,
         if (predictedLabel != null) 'predictedLabel': predictedLabel!,
       };
@@ -4405,7 +4401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugInfo != null) 'debugInfo': debugInfo!,
         if (location != null) 'location': location!,
         if (message != null) 'message': message!,
@@ -4480,7 +4476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arimaForecastingMetrics != null)
           'arimaForecastingMetrics': arimaForecastingMetrics!.toJson(),
         if (binaryClassificationMetrics != null)
@@ -4692,7 +4688,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completedParallelInputs != null)
           'completedParallelInputs': completedParallelInputs!,
         if (computeMsAvg != null) 'computeMsAvg': computeMsAvg!,
@@ -4750,7 +4746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (substeps != null) 'substeps': substeps!,
       };
@@ -4778,7 +4774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribution != null) 'attribution': attribution!,
         if (featureName != null) 'featureName': featureName!,
       };
@@ -4845,7 +4841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -4996,7 +4992,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autodetect != null) 'autodetect': autodetect!,
         if (bigtableOptions != null)
           'bigtableOptions': bigtableOptions!.toJson(),
@@ -5044,7 +5040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoricalValue != null)
           'categoricalValue': categoricalValue!.toJson(),
         if (featureColumn != null) 'featureColumn': featureColumn!,
@@ -5067,7 +5063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -5094,7 +5090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -5211,7 +5207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheHit != null) 'cacheHit': cacheHit!,
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
@@ -5248,7 +5244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (kind != null) 'kind': kind!,
       };
@@ -5282,7 +5278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (classLabel != null) 'classLabel': classLabel!,
         if (explanations != null)
           'explanations': explanations!.map((value) => value.toJson()).toList(),
@@ -5327,7 +5323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!,
         if (skipLeadingRows != null) 'skipLeadingRows': skipLeadingRows!,
       };
@@ -5385,7 +5381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mode != null) 'mode': mode!,
         if (requirePartitionFilter != null)
           'requirePartitionFilter': requirePartitionFilter!,
@@ -5455,7 +5451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arimaResult != null) 'arimaResult': arimaResult!.toJson(),
         if (clusterInfos != null)
           'clusterInfos': clusterInfos!.map((value) => value.toJson()).toList(),
@@ -5542,7 +5538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configuration != null) 'configuration': configuration!.toJson(),
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -5573,7 +5569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (job != null) 'job': job!.toJson(),
         if (kind != null) 'kind': kind!,
       };
@@ -5643,13 +5639,12 @@
       jobType = _json['jobType'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('load')) {
       load = JobConfigurationLoad.fromJson(
@@ -5661,7 +5656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (copy != null) 'copy': copy!.toJson(),
         if (dryRun != null) 'dryRun': dryRun!,
         if (extract != null) 'extract': extract!.toJson(),
@@ -5770,7 +5765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compression != null) 'compression': compression!,
         if (destinationFormat != null) 'destinationFormat': destinationFormat!,
         if (destinationUri != null) 'destinationUri': destinationUri!,
@@ -6160,7 +6155,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowJaggedRows != null) 'allowJaggedRows': allowJaggedRows!,
         if (allowQuotedNewlines != null)
           'allowQuotedNewlines': allowQuotedNewlines!,
@@ -6450,15 +6445,15 @@
           .toList();
     }
     if (_json.containsKey('tableDefinitions')) {
-      tableDefinitions = (_json['tableDefinitions'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ExternalDataConfiguration.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      tableDefinitions =
+          (_json['tableDefinitions'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          ExternalDataConfiguration.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('timePartitioning')) {
       timePartitioning = TimePartitioning.fromJson(
@@ -6483,7 +6478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowLargeResults != null) 'allowLargeResults': allowLargeResults!,
         if (clustering != null) 'clustering': clustering!.toJson(),
         if (connectionProperties != null)
@@ -6619,7 +6614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createDisposition != null) 'createDisposition': createDisposition!,
         if (destinationEncryptionConfiguration != null)
           'destinationEncryptionConfiguration':
@@ -6705,7 +6700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configuration != null) 'configuration': configuration!.toJson(),
         if (errorResult != null) 'errorResult': errorResult!.toJson(),
         if (id != null) 'id': id!,
@@ -6751,7 +6746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -6793,7 +6788,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobId != null) 'jobId': jobId!,
         if (location != null) 'location': location!,
         if (projectId != null) 'projectId': projectId!,
@@ -6819,7 +6814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (slotMs != null) 'slotMs': slotMs!,
       };
@@ -6964,7 +6959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completionRatio != null) 'completionRatio': completionRatio!,
         if (creationTime != null) 'creationTime': creationTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -7010,7 +7005,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (slotMs != null) 'slotMs': slotMs!,
       };
@@ -7265,7 +7260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingTier != null) 'billingTier': billingTier!,
         if (cacheHit != null) 'cacheHit': cacheHit!,
         if (ddlAffectedRowAccessPolicyCount != null)
@@ -7365,7 +7360,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (badRecords != null) 'badRecords': badRecords!,
         if (inputFileBytes != null) 'inputFileBytes': inputFileBytes!,
         if (inputFiles != null) 'inputFiles': inputFiles!,
@@ -7401,7 +7396,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationUriFileCounts != null)
           'destinationUriFileCounts': destinationUriFileCounts!,
         if (inputBytes != null) 'inputBytes': inputBytes!,
@@ -7443,7 +7438,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorResult != null) 'errorResult': errorResult!.toJson(),
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
@@ -7510,7 +7505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (models != null)
           'models': models!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -7542,7 +7537,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (routines != null)
           'routines': routines!.map((value) => value.toJson()).toList(),
@@ -7571,7 +7566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (rowAccessPolicies != null)
           'rowAccessPolicies':
@@ -7598,7 +7593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (legacyLocationId != null) 'legacyLocationId': legacyLocationId!,
       };
 }
@@ -7646,7 +7641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableRefresh != null) 'enableRefresh': enableRefresh!,
         if (lastRefreshTime != null) 'lastRefreshTime': lastRefreshTime!,
         if (query != null) 'query': query!,
@@ -7790,13 +7785,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lastModifiedTime')) {
       lastModifiedTime = _json['lastModifiedTime'] as core.String;
@@ -7819,7 +7813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (description != null) 'description': description!,
         if (encryptionConfiguration != null)
@@ -7867,7 +7861,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (lossType != null) 'lossType': lossType!,
         if (modelType != null) 'modelType': modelType!,
@@ -7902,7 +7896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (modelOptions != null) 'modelOptions': modelOptions!.toJson(),
         if (trainingRuns != null)
           'trainingRuns': trainingRuns!.map((value) => value.toJson()).toList(),
@@ -7942,7 +7936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetId != null) 'datasetId': datasetId!,
         if (modelId != null) 'modelId': modelId!,
         if (projectId != null) 'projectId': projectId!,
@@ -7973,7 +7967,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregateClassificationMetrics != null)
           'aggregateClassificationMetrics':
               aggregateClassificationMetrics!.toJson(),
@@ -8087,7 +8081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -8135,7 +8129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cumulativeExplainedVarianceRatio != null)
           'cumulativeExplainedVarianceRatio': cumulativeExplainedVarianceRatio!,
         if (explainedVariance != null) 'explainedVariance': explainedVariance!,
@@ -8183,7 +8177,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (friendlyName != null) 'friendlyName': friendlyName!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -8232,7 +8226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8258,7 +8252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectId != null) 'projectId': projectId!,
       };
 }
@@ -8297,7 +8291,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (parameterType != null) 'parameterType': parameterType!.toJson(),
         if (parameterValue != null) 'parameterValue': parameterValue!.toJson(),
@@ -8335,7 +8329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (name != null) 'name': name!,
         if (type != null) 'type': type!.toJson(),
@@ -8377,7 +8371,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arrayType != null) 'arrayType': arrayType!.toJson(),
         if (structTypes != null)
           'structTypes': structTypes!.map((value) => value.toJson()).toList(),
@@ -8411,22 +8405,21 @@
           .toList();
     }
     if (_json.containsKey('structValues')) {
-      structValues = (_json['structValues'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              QueryParameterValue.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      structValues =
+          (_json['structValues'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          QueryParameterValue.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arrayValues != null)
           'arrayValues': arrayValues!.map((value) => value.toJson()).toList(),
         if (structValues != null)
@@ -8589,13 +8582,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -8635,7 +8627,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectionProperties != null)
           'connectionProperties':
               connectionProperties!.map((value) => value.toJson()).toList(),
@@ -8765,7 +8757,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheHit != null) 'cacheHit': cacheHit!,
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
@@ -8822,7 +8814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeUnits != null) 'activeUnits': activeUnits!,
         if (completedUnits != null) 'completedUnits': completedUnits!,
         if (elapsedMs != null) 'elapsedMs': elapsedMs!,
@@ -8856,7 +8848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (end != null) 'end': end!,
         if (interval != null) 'interval': interval!,
         if (start != null) 'start': start!,
@@ -8885,7 +8877,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!,
         if (range != null) 'range': range!.toJson(),
       };
@@ -8932,7 +8924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (averageRank != null) 'averageRank': averageRank!,
         if (meanAveragePrecision != null)
           'meanAveragePrecision': meanAveragePrecision!,
@@ -8985,7 +8977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (meanAbsoluteError != null) 'meanAbsoluteError': meanAbsoluteError!,
         if (meanSquaredError != null) 'meanSquaredError': meanSquaredError!,
         if (meanSquaredLogError != null)
@@ -9144,7 +9136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arguments != null)
           'arguments': arguments!.map((value) => value.toJson()).toList(),
         if (creationTime != null) 'creationTime': creationTime!,
@@ -9195,7 +9187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetId != null) 'datasetId': datasetId!,
         if (projectId != null) 'projectId': projectId!,
         if (routineId != null) 'routineId': routineId!,
@@ -9224,7 +9216,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actualLabel != null) 'actualLabel': actualLabel!,
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
@@ -9291,7 +9283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (etag != null) 'etag': etag!,
         if (filterPredicate != null) 'filterPredicate': filterPredicate!,
@@ -9342,7 +9334,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetId != null) 'datasetId': datasetId!,
         if (policyId != null) 'policyId': policyId!,
         if (projectId != null) 'projectId': projectId!,
@@ -9363,7 +9355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rowLevelSecurityApplied != null)
           'rowLevelSecurityApplied': rowLevelSecurityApplied!,
       };
@@ -9412,7 +9404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endColumn != null) 'endColumn': endColumn!,
         if (endLine != null) 'endLine': endLine!,
         if (procedureId != null) 'procedureId': procedureId!,
@@ -9446,7 +9438,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (evaluationKind != null) 'evaluationKind': evaluationKind!,
         if (stackFrames != null)
           'stackFrames': stackFrames!.map((value) => value.toJson()).toList(),
@@ -9480,7 +9472,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -9509,7 +9501,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseTableReference != null)
           'baseTableReference': baseTableReference!.toJson(),
         if (snapshotTime != null)
@@ -9573,7 +9565,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arrayElementType != null)
           'arrayElementType': arrayElementType!.toJson(),
         if (structType != null) 'structType': structType!.toJson(),
@@ -9611,7 +9603,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (type != null) 'type': type!.toJson(),
       };
@@ -9631,7 +9623,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
       };
@@ -9665,7 +9657,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (estimatedBytes != null) 'estimatedBytes': estimatedBytes!,
         if (estimatedRows != null) 'estimatedRows': estimatedRows!,
         if (oldestEntryTime != null) 'oldestEntryTime': oldestEntryTime!,
@@ -9868,13 +9860,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lastModifiedTime')) {
       lastModifiedTime = _json['lastModifiedTime'] as core.String;
@@ -9941,7 +9932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clustering != null) 'clustering': clustering!.toJson(),
         if (creationTime != null) 'creationTime': creationTime!,
         if (description != null) 'description': description!,
@@ -9997,7 +9988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (v != null) 'v': v!,
       };
 }
@@ -10031,7 +10022,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (insertId != null) 'insertId': insertId!,
         if (json != null) 'json': json!,
       };
@@ -10093,7 +10084,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ignoreUnknownValues != null)
           'ignoreUnknownValues': ignoreUnknownValues!,
         if (kind != null) 'kind': kind!,
@@ -10124,7 +10115,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
         if (index != null) 'index': index!,
@@ -10153,7 +10144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (insertErrors != null)
           'insertErrors': insertErrors!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -10202,7 +10193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (pageToken != null) 'pageToken': pageToken!,
@@ -10231,7 +10222,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -10253,7 +10244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -10337,7 +10328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categories != null) 'categories': categories!.toJson(),
         if (description != null) 'description': description!,
         if (fields != null)
@@ -10362,7 +10353,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (useLegacySql != null) 'useLegacySql': useLegacySql!,
       };
 }
@@ -10436,13 +10427,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('rangePartitioning')) {
       rangePartitioning = RangePartitioning.fromJson(
@@ -10465,7 +10455,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clustering != null) 'clustering': clustering!.toJson(),
         if (creationTime != null) 'creationTime': creationTime!,
         if (expirationTime != null) 'expirationTime': expirationTime!,
@@ -10522,7 +10512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -10565,7 +10555,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetId != null) 'datasetId': datasetId!,
         if (projectId != null) 'projectId': projectId!,
         if (tableId != null) 'tableId': tableId!,
@@ -10588,7 +10578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (f != null) 'f': f!.map((value) => value.toJson()).toList(),
       };
 }
@@ -10608,7 +10598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
       };
@@ -10633,7 +10623,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -10654,7 +10644,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -10704,7 +10694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expirationMs != null) 'expirationMs': expirationMs!,
         if (field != null) 'field': field!,
         if (requirePartitionFilter != null)
@@ -11080,14 +11070,14 @@
       l2Regularization = (_json['l2Regularization'] as core.num).toDouble();
     }
     if (_json.containsKey('labelClassWeights')) {
-      labelClassWeights = (_json['labelClassWeights'] as core.Map)
-          .cast<core.String, core.double>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              (item as core.num).toDouble(),
-            ),
-          );
+      labelClassWeights =
+          (_json['labelClassWeights'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          (item as core.num).toDouble(),
+        ),
+      );
     }
     if (_json.containsKey('learnRate')) {
       learnRate = (_json['learnRate'] as core.num).toDouble();
@@ -11154,7 +11144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoArima != null) 'autoArima': autoArima!,
         if (autoArimaMaxOrder != null) 'autoArimaMaxOrder': autoArimaMaxOrder!,
         if (batchSize != null) 'batchSize': batchSize!,
@@ -11270,7 +11260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSplitResult != null)
           'dataSplitResult': dataSplitResult!.toJson(),
         if (evaluationMetrics != null)
@@ -11298,7 +11288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transactionId != null) 'transactionId': transactionId!,
       };
 }
@@ -11333,7 +11323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inlineCode != null) 'inlineCode': inlineCode!,
         if (resourceUri != null) 'resourceUri': resourceUri!,
       };
@@ -11374,7 +11364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (query != null) 'query': query!,
         if (useLegacySql != null) 'useLegacySql': useLegacySql!,
         if (userDefinedFunctionResources != null)
diff --git a/generated/googleapis/lib/bigquerydatatransfer/v1.dart b/generated/googleapis/lib/bigquerydatatransfer/v1.dart
index 0735195..67706a5 100644
--- a/generated/googleapis/lib/bigquerydatatransfer/v1.dart
+++ b/generated/googleapis/lib/bigquerydatatransfer/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1762,7 +1761,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A response indicating whether the credentials exist and are valid.
@@ -1778,7 +1777,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hasValidCreds != null) 'hasValidCreds': hasValidCreds!,
       };
 }
@@ -1955,7 +1954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorizationType != null) 'authorizationType': authorizationType!,
         if (clientId != null) 'clientId': clientId!,
         if (dataRefreshType != null) 'dataRefreshType': dataRefreshType!,
@@ -2115,7 +2114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedValues != null) 'allowedValues': allowedValues!,
         if (deprecated != null) 'deprecated': deprecated!,
         if (description != null) 'description': description!,
@@ -2151,7 +2150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableFailureEmail != null)
           'enableFailureEmail': enableFailureEmail!,
       };
@@ -2171,7 +2170,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Returns list of supported data sources and their metadata.
@@ -2202,7 +2201,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSources != null)
           'dataSources': dataSources!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2231,7 +2230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2268,7 +2267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (transferConfigs != null)
           'transferConfigs':
@@ -2306,7 +2305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (transferMessages != null)
           'transferMessages':
@@ -2344,7 +2343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (transferRuns != null)
           'transferRuns': transferRuns!.map((value) => value.toJson()).toList(),
@@ -2388,32 +2387,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -2461,7 +2458,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableAutoScheduling != null)
           'disableAutoScheduling': disableAutoScheduling!,
         if (endTime != null) 'endTime': endTime!,
@@ -2496,7 +2493,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -2518,7 +2515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (runs != null) 'runs': runs!.map((value) => value.toJson()).toList(),
       };
 }
@@ -2545,7 +2542,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedRunTime != null) 'requestedRunTime': requestedRunTime!,
         if (requestedTimeRange != null)
           'requestedTimeRange': requestedTimeRange!.toJson(),
@@ -2568,7 +2565,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (runs != null) 'runs': runs!.map((value) => value.toJson()).toList(),
       };
 }
@@ -2606,8 +2603,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2620,7 +2617,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2655,7 +2652,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -2799,13 +2796,12 @@
       notificationPubsubTopic = _json['notificationPubsubTopic'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('schedule')) {
       schedule = _json['schedule'] as core.String;
@@ -2825,7 +2821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataRefreshWindowDays != null)
           'dataRefreshWindowDays': dataRefreshWindowDays!,
         if (dataSourceId != null) 'dataSourceId': dataSourceId!,
@@ -2880,7 +2876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (messageText != null) 'messageText': messageText!,
         if (messageTime != null) 'messageTime': messageTime!,
         if (severity != null) 'severity': severity!,
@@ -3011,13 +3007,12 @@
       notificationPubsubTopic = _json['notificationPubsubTopic'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('runTime')) {
       runTime = _json['runTime'] as core.String;
@@ -3042,7 +3037,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceId != null) 'dataSourceId': dataSourceId!,
         if (destinationDatasetId != null)
           'destinationDatasetId': destinationDatasetId!,
diff --git a/generated/googleapis/lib/bigqueryreservation/v1.dart b/generated/googleapis/lib/bigqueryreservation/v1.dart
index dd38693..7149bae 100644
--- a/generated/googleapis/lib/bigqueryreservation/v1.dart
+++ b/generated/googleapis/lib/bigqueryreservation/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1258,7 +1257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignee != null) 'assignee': assignee!,
         if (jobType != null) 'jobType': jobType!,
         if (name != null) 'name': name!,
@@ -1296,7 +1295,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (size != null) 'size': size!,
         if (updateTime != null) 'updateTime': updateTime!,
@@ -1423,7 +1422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commitmentEndTime != null) 'commitmentEndTime': commitmentEndTime!,
         if (commitmentStartTime != null)
           'commitmentStartTime': commitmentStartTime!,
@@ -1452,7 +1451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (slotPool != null) 'slotPool': slotPool!,
       };
 }
@@ -1471,7 +1470,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response for ReservationService.ListAssignments.
@@ -1497,7 +1496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignments != null)
           'assignments': assignments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1527,7 +1526,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (capacityCommitments != null)
           'capacityCommitments':
               capacityCommitments!.map((value) => value.toJson()).toList(),
@@ -1557,7 +1556,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1587,7 +1586,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (reservations != null)
           'reservations': reservations!.map((value) => value.toJson()).toList(),
@@ -1614,7 +1613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (capacityCommitmentIds != null)
           'capacityCommitmentIds': capacityCommitmentIds!,
       };
@@ -1639,7 +1638,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationId != null) 'destinationId': destinationId!,
       };
 }
@@ -1698,29 +1697,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1783,7 +1780,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (ignoreIdleSlots != null) 'ignoreIdleSlots': ignoreIdleSlots!,
         if (name != null) 'name': name!,
@@ -1815,7 +1812,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignments != null)
           'assignments': assignments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1845,7 +1842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignments != null)
           'assignments': assignments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1865,7 +1862,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (slotCount != null) 'slotCount': slotCount!,
       };
 }
@@ -1891,7 +1888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (first != null) 'first': first!.toJson(),
         if (second != null) 'second': second!.toJson(),
       };
@@ -1930,8 +1927,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1944,7 +1941,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/bigtableadmin/v2.dart b/generated/googleapis/lib/bigtableadmin/v2.dart
index a959c69..b93b5ae 100644
--- a/generated/googleapis/lib/bigtableadmin/v2.dart
+++ b/generated/googleapis/lib/bigtableadmin/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2350,7 +2349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (etag != null) 'etag': etag!,
         if (multiClusterRoutingUseAny != null)
@@ -2402,7 +2401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -2444,7 +2443,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -2536,7 +2535,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (expireTime != null) 'expireTime': expireTime!,
         if (name != null) 'name': name!,
@@ -2590,7 +2589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backup != null) 'backup': backup!,
         if (endTime != null) 'endTime': endTime!,
         if (sourceTable != null) 'sourceTable': sourceTable!,
@@ -2664,7 +2663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -2687,7 +2686,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consistencyToken != null) 'consistencyToken': consistencyToken!,
       };
 }
@@ -2709,7 +2708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consistent != null) 'consistent': consistent!,
       };
 }
@@ -2788,7 +2787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultStorageType != null)
           'defaultStorageType': defaultStorageType!,
         if (location != null) 'location': location!,
@@ -2829,7 +2828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (replicationState != null) 'replicationState': replicationState!,
       };
 }
@@ -2852,7 +2851,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcRule != null) 'gcRule': gcRule!.toJson(),
       };
 }
@@ -2888,7 +2887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (name != null) 'name': name!,
         if (sourceTable != null) 'sourceTable': sourceTable!,
@@ -2930,19 +2929,16 @@
       requestTime = _json['requestTime'] as core.String;
     }
     if (_json.containsKey('tables')) {
-      tables = (_json['tables'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              TableProgress.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      tables = (_json['tables'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          TableProgress.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (finishTime != null) 'finishTime': finishTime!,
         if (originalRequest != null)
           'originalRequest': originalRequest!.toJson(),
@@ -2991,7 +2987,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cluster != null) 'cluster': cluster!.toJson(),
         if (clusterId != null) 'clusterId': clusterId!,
         if (parent != null) 'parent': parent!,
@@ -3024,7 +3020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (finishTime != null) 'finishTime': finishTime!,
         if (originalRequest != null)
           'originalRequest': originalRequest!.toJson(),
@@ -3069,14 +3065,12 @@
 
   CreateInstanceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('clusters')) {
-      clusters = (_json['clusters'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Cluster.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      clusters = (_json['clusters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Cluster.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('instance')) {
       instance = Instance.fromJson(
@@ -3090,7 +3084,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusters != null)
           'clusters':
               clusters!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -3146,7 +3140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (initialSplits != null)
           'initialSplits':
               initialSplits!.map((value) => value.toJson()).toList(),
@@ -3185,7 +3179,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deleteAllDataFromTable != null)
           'deleteAllDataFromTable': deleteAllDataFromTable!,
         if (rowKeyPrefix != null) 'rowKeyPrefix': rowKeyPrefix!,
@@ -3206,7 +3200,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -3270,7 +3264,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -3293,7 +3287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
       };
@@ -3318,7 +3312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetName != null) 'targetName': targetName!,
         if (workflowGuid != null) 'workflowGuid': workflowGuid!,
         if (zoneId != null) 'zoneId': zoneId!,
@@ -3361,7 +3355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intersection != null) 'intersection': intersection!.toJson(),
         if (maxAge != null) 'maxAge': maxAge!,
         if (maxNumVersions != null) 'maxNumVersions': maxNumVersions!,
@@ -3378,7 +3372,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for
@@ -3395,7 +3389,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consistencyToken != null) 'consistencyToken': consistencyToken!,
       };
 }
@@ -3415,7 +3409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -3442,7 +3436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -3512,13 +3506,12 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3531,7 +3524,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (name != null) 'name': name!,
@@ -3556,7 +3549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -3599,7 +3592,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appProfiles != null)
           'appProfiles': appProfiles!.map((value) => value.toJson()).toList(),
         if (failedLocations != null) 'failedLocations': failedLocations!,
@@ -3630,7 +3623,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backups != null)
           'backups': backups!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3672,7 +3665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusters != null)
           'clusters': clusters!.map((value) => value.toJson()).toList(),
         if (failedLocations != null) 'failedLocations': failedLocations!,
@@ -3716,7 +3709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failedLocations != null) 'failedLocations': failedLocations!,
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
@@ -3746,7 +3739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3775,7 +3768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -3807,7 +3800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tables != null)
           'tables': tables!.map((value) => value.toJson()).toList(),
@@ -3851,32 +3844,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -3921,7 +3912,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (create != null) 'create': create!.toJson(),
         if (drop != null) 'drop': drop!,
         if (id != null) 'id': id!,
@@ -3952,7 +3943,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (modifications != null)
           'modifications':
               modifications!.map((value) => value.toJson()).toList(),
@@ -3972,7 +3963,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// This resource represents a long-running operation that is the result of a
@@ -4029,29 +4020,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4089,7 +4078,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (progressPercent != null) 'progressPercent': progressPercent!,
         if (startTime != null) 'startTime': startTime!,
@@ -4120,7 +4109,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (progress != null) 'progress': progress!.toJson(),
       };
@@ -4152,7 +4141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -4262,7 +4251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -4297,7 +4286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupInfo != null) 'backupInfo': backupInfo!.toJson(),
         if (sourceType != null) 'sourceType': sourceType!,
       };
@@ -4354,7 +4343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupInfo != null) 'backupInfo': backupInfo!.toJson(),
         if (name != null) 'name': name!,
         if (optimizeTableOperationName != null)
@@ -4390,7 +4379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backup != null) 'backup': backup!,
         if (tableId != null) 'tableId': tableId!,
       };
@@ -4423,7 +4412,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -4455,7 +4444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowTransactionalWrites != null)
           'allowTransactionalWrites': allowTransactionalWrites!,
         if (clusterId != null) 'clusterId': clusterId!,
@@ -4481,7 +4470,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
       };
 }
@@ -4519,8 +4508,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4533,7 +4522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4591,26 +4580,22 @@
 
   Table.fromJson(core.Map _json) {
     if (_json.containsKey('clusterStates')) {
-      clusterStates = (_json['clusterStates'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ClusterState.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      clusterStates =
+          (_json['clusterStates'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ClusterState.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('columnFamilies')) {
-      columnFamilies = (_json['columnFamilies'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ColumnFamily.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      columnFamilies =
+          (_json['columnFamilies'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ColumnFamily.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('granularity')) {
       granularity = _json['granularity'] as core.String;
@@ -4624,7 +4609,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterStates != null)
           'clusterStates': clusterStates!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -4673,7 +4658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (estimatedCopiedBytes != null)
           'estimatedCopiedBytes': estimatedCopiedBytes!,
         if (estimatedSizeBytes != null)
@@ -4701,7 +4686,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4722,7 +4707,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4743,7 +4728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -4757,7 +4742,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The metadata for the Operation returned by UpdateCluster.
@@ -4786,7 +4771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (finishTime != null) 'finishTime': finishTime!,
         if (originalRequest != null)
           'originalRequest': originalRequest!.toJson(),
@@ -4820,7 +4805,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (finishTime != null) 'finishTime': finishTime!,
         if (originalRequest != null)
           'originalRequest': originalRequest!.toJson(),
diff --git a/generated/googleapis/lib/billingbudgets/v1.dart b/generated/googleapis/lib/billingbudgets/v1.dart
index e71ebab..a829044 100644
--- a/generated/googleapis/lib/billingbudgets/v1.dart
+++ b/generated/googleapis/lib/billingbudgets/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -399,7 +398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (budgetFilter != null) 'budgetFilter': budgetFilter!.toJson(),
         if (displayName != null) 'displayName': displayName!,
@@ -441,7 +440,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastPeriodAmount != null)
           'lastPeriodAmount': lastPeriodAmount!.toJson(),
         if (specifiedAmount != null)
@@ -477,7 +476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!.toJson(),
         if (startDate != null) 'startDate': startDate!.toJson(),
       };
@@ -595,16 +594,14 @@
           _json['customPeriod'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels = (_json['labels'] as core.Map)
-          .cast<core.String, core.List<core.Object>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              (item as core.List)
-                  .map<core.Object>((value) => value as core.Object)
-                  .toList(),
-            ),
-          );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          (item as core.List)
+              .map<core.Object>((value) => value as core.Object)
+              .toList(),
+        ),
+      );
     }
     if (_json.containsKey('projects')) {
       projects = (_json['projects'] as core.List)
@@ -623,7 +620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calendarPeriod != null) 'calendarPeriod': calendarPeriod!,
         if (creditTypes != null) 'creditTypes': creditTypes!,
         if (creditTypesTreatment != null)
@@ -648,7 +645,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response for ListBudgets
@@ -675,7 +672,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (budgets != null)
           'budgets': budgets!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -753,7 +750,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableDefaultIamRecipients != null)
           'disableDefaultIamRecipients': disableDefaultIamRecipients!,
         if (monitoringNotificationChannels != null)
@@ -805,7 +802,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (spendBasis != null) 'spendBasis': spendBasis!,
         if (thresholdPercent != null) 'thresholdPercent': thresholdPercent!,
       };
@@ -825,7 +822,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a whole or partial calendar date, such as a birthday.
@@ -868,7 +865,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -908,7 +905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
diff --git a/generated/googleapis/lib/binaryauthorization/v1.dart b/generated/googleapis/lib/binaryauthorization/v1.dart
index c7f3809..d1ee348 100644
--- a/generated/googleapis/lib/binaryauthorization/v1.dart
+++ b/generated/googleapis/lib/binaryauthorization/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -835,7 +834,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enforcementMode != null) 'enforcementMode': enforcementMode!,
         if (evaluationMode != null) 'evaluationMode': evaluationMode!,
         if (requireAttestationsBy != null)
@@ -860,7 +859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namePattern != null) 'namePattern': namePattern!,
       };
 }
@@ -925,7 +924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jwts != null) 'jwts': jwts!.map((value) => value.toJson()).toList(),
         if (serializedPayload != null) 'serializedPayload': serializedPayload!,
         if (signatures != null)
@@ -978,7 +977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (name != null) 'name': name!,
         if (updateTime != null) 'updateTime': updateTime!,
@@ -1044,7 +1043,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (asciiArmoredPgpPublicKey != null)
           'asciiArmoredPgpPublicKey': asciiArmoredPgpPublicKey!,
         if (comment != null) 'comment': comment!,
@@ -1119,7 +1118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1140,7 +1139,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -1204,7 +1203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1307,7 +1306,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -1330,7 +1329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compactJwt != null) 'compactJwt': compactJwt!,
       };
 }
@@ -1361,7 +1360,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attestors != null)
           'attestors': attestors!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1423,7 +1422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publicKeyPem != null) 'publicKeyPem': publicKeyPem!,
         if (signatureAlgorithm != null)
           'signatureAlgorithm': signatureAlgorithm!,
@@ -1525,15 +1524,14 @@
               .toList();
     }
     if (_json.containsKey('clusterAdmissionRules')) {
-      clusterAdmissionRules = (_json['clusterAdmissionRules'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
+      clusterAdmissionRules = (_json['clusterAdmissionRules']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              AdmissionRule.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          AdmissionRule.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('defaultAdmissionRule')) {
       defaultAdmissionRule = AdmissionRule.fromJson(
@@ -1548,39 +1546,36 @@
     }
     if (_json.containsKey('istioServiceIdentityAdmissionRules')) {
       istioServiceIdentityAdmissionRules =
-          (_json['istioServiceIdentityAdmissionRules'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
+          (_json['istioServiceIdentityAdmissionRules']
+                  as core.Map<core.String, core.dynamic>)
               .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  AdmissionRule.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+        (key, item) => core.MapEntry(
+          key,
+          AdmissionRule.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kubernetesNamespaceAdmissionRules')) {
       kubernetesNamespaceAdmissionRules =
-          (_json['kubernetesNamespaceAdmissionRules'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
+          (_json['kubernetesNamespaceAdmissionRules']
+                  as core.Map<core.String, core.dynamic>)
               .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  AdmissionRule.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+        (key, item) => core.MapEntry(
+          key,
+          AdmissionRule.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kubernetesServiceAccountAdmissionRules')) {
       kubernetesServiceAccountAdmissionRules =
-          (_json['kubernetesServiceAccountAdmissionRules'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
+          (_json['kubernetesServiceAccountAdmissionRules']
+                  as core.Map<core.String, core.dynamic>)
               .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  AdmissionRule.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+        (key, item) => core.MapEntry(
+          key,
+          AdmissionRule.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1590,7 +1585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (admissionWhitelistPatterns != null)
           'admissionWhitelistPatterns': admissionWhitelistPatterns!
               .map((value) => value.toJson())
@@ -1638,7 +1633,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -1703,7 +1698,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publicKeyId != null) 'publicKeyId': publicKeyId!,
         if (signature != null) 'signature': signature!,
       };
@@ -1728,7 +1723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1749,7 +1744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1808,7 +1803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delegationServiceAccountEmail != null)
           'delegationServiceAccountEmail': delegationServiceAccountEmail!,
         if (noteReference != null) 'noteReference': noteReference!,
@@ -1855,7 +1850,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attestation != null) 'attestation': attestation!.toJson(),
         if (occurrenceNote != null) 'occurrenceNote': occurrenceNote!,
         if (occurrenceResourceUri != null)
@@ -1887,7 +1882,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (denialReason != null) 'denialReason': denialReason!,
         if (result != null) 'result': result!,
       };
diff --git a/generated/googleapis/lib/blogger/v3.dart b/generated/googleapis/lib/blogger/v3.dart
index 34dcb43..bc4edbd 100644
--- a/generated/googleapis/lib/blogger/v3.dart
+++ b/generated/googleapis/lib/blogger/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1858,7 +1857,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (language != null) 'language': language!,
         if (variant != null) 'variant': variant!,
@@ -1884,7 +1883,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (selfLink != null) 'selfLink': selfLink!,
         if (totalItems != null) 'totalItems': totalItems!,
       };
@@ -1918,7 +1917,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (selfLink != null) 'selfLink': selfLink!,
@@ -2022,7 +2021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customMetaData != null) 'customMetaData': customMetaData!,
         if (description != null) 'description': description!,
         if (id != null) 'id': id!,
@@ -2071,7 +2070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blogUserInfos != null)
           'blogUserInfos':
               blogUserInfos!.map((value) => value.toJson()).toList(),
@@ -2131,7 +2130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blogId != null) 'blogId': blogId!,
         if (hasAdminAccess != null) 'hasAdminAccess': hasAdminAccess!,
         if (kind != null) 'kind': kind!,
@@ -2169,7 +2168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blog != null) 'blog': blog!.toJson(),
         if (blogUserInfo != null) 'blog_user_info': blogUserInfo!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -2189,7 +2188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -2226,7 +2225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (id != null) 'id': id!,
         if (image != null) 'image': image!.toJson(),
@@ -2247,7 +2246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
       };
 }
@@ -2265,7 +2264,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
       };
 }
@@ -2283,7 +2282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
       };
 }
@@ -2373,7 +2372,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (author != null) 'author': author!.toJson(),
         if (blog != null) 'blog': blog!.toJson(),
         if (content != null) 'content': content!,
@@ -2429,7 +2428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -2452,7 +2451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -2489,7 +2488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (id != null) 'id': id!,
         if (image != null) 'image': image!.toJson(),
@@ -2510,7 +2509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
       };
 }
@@ -2602,7 +2601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (author != null) 'author': author!.toJson(),
         if (blog != null) 'blog': blog!.toJson(),
         if (content != null) 'content': content!,
@@ -2653,7 +2652,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -2684,7 +2683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (timeRange != null) 'timeRange': timeRange!,
       };
@@ -2719,7 +2718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blogId != null) 'blogId': blogId!,
         if (counts != null)
           'counts': counts!.map((value) => value.toJson()).toList(),
@@ -2740,7 +2739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -2777,7 +2776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (id != null) 'id': id!,
         if (image != null) 'image': image!.toJson(),
@@ -2798,7 +2797,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
       };
 }
@@ -2814,7 +2813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -2852,7 +2851,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lat != null) 'lat': lat!,
         if (lng != null) 'lng': lng!,
         if (name != null) 'name': name!,
@@ -2888,7 +2887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (selfLink != null) 'selfLink': selfLink!,
@@ -3039,7 +3038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (author != null) 'author': author!.toJson(),
         if (blog != null) 'blog': blog!.toJson(),
         if (content != null) 'content': content!,
@@ -3104,7 +3103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -3152,7 +3151,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blogId != null) 'blogId': blogId!,
         if (hasEditAccess != null) 'hasEditAccess': hasEditAccess!,
         if (kind != null) 'kind': kind!,
@@ -3189,7 +3188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (post != null) 'post': post!.toJson(),
         if (postUserInfo != null) 'post_user_info': postUserInfo!.toJson(),
@@ -3225,7 +3224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3246,7 +3245,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (selfLink != null) 'selfLink': selfLink!,
       };
 }
@@ -3276,7 +3275,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (language != null) 'language': language!,
         if (variant != null) 'variant': variant!,
@@ -3347,7 +3346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (about != null) 'about': about!,
         if (blogs != null) 'blogs': blogs!.toJson(),
         if (created != null) 'created': created!,
diff --git a/generated/googleapis/lib/books/v1.dart b/generated/googleapis/lib/books/v1.dart
index dbddd39..4a5fe31 100644
--- a/generated/googleapis/lib/books/v1.dart
+++ b/generated/googleapis/lib/books/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3081,7 +3080,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cfiRange != null) 'cfiRange': cfiRange!.toJson(),
         if (contentVersion != null) 'contentVersion': contentVersion!,
         if (gbImageRange != null) 'gbImageRange': gbImageRange!.toJson(),
@@ -3131,7 +3130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cfiRange != null) 'cfiRange': cfiRange!.toJson(),
         if (contentVersion != null) 'contentVersion': contentVersion!,
         if (gbImageRange != null) 'gbImageRange': gbImageRange!.toJson(),
@@ -3167,7 +3166,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedCharacterCount != null)
           'allowedCharacterCount': allowedCharacterCount!,
         if (limitType != null) 'limitType': limitType!,
@@ -3293,7 +3292,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (afterSelectedText != null) 'afterSelectedText': afterSelectedText!,
         if (beforeSelectedText != null)
           'beforeSelectedText': beforeSelectedText!,
@@ -3355,7 +3354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3391,7 +3390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedCharacterCount != null)
           'allowedCharacterCount': allowedCharacterCount!,
         if (layerId != null) 'layerId': layerId!,
@@ -3421,7 +3420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (layers != null)
           'layers': layers!.map((value) => value.toJson()).toList(),
@@ -3463,7 +3462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3502,7 +3501,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endOffset != null) 'endOffset': endOffset!,
         if (endPosition != null) 'endPosition': endPosition!,
         if (startOffset != null) 'startOffset': startOffset!,
@@ -3533,7 +3532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (author != null) 'author': author!,
         if (processingState != null) 'processingState': processingState!,
         if (title != null) 'title': title!,
@@ -3552,7 +3551,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consistencyToken != null) 'consistency_token': consistencyToken!,
       };
 }
@@ -3626,7 +3625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (access != null) 'access': access!,
         if (created != null) 'created': created!,
         if (description != null) 'description': description!,
@@ -3662,7 +3661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3688,7 +3687,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (badgeUrl != null) 'badgeUrl': badgeUrl!,
         if (categoryId != null) 'categoryId': categoryId!,
         if (name != null) 'name': name!,
@@ -3716,7 +3715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3799,7 +3798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceAllowed != null) 'deviceAllowed': deviceAllowed!,
         if (kind != null) 'kind': kind!,
         if (maxConcurrentDevices != null)
@@ -3894,7 +3893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationType != null) 'annotationType': annotationType!,
         if (data != null) 'data': data!.toJson(),
         if (encodedData != null) 'encodedData': encodedData!,
@@ -3920,7 +3919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (title != null) 'title': title!,
       };
 }
@@ -3941,7 +3940,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribution != null) 'attribution': attribution!,
         if (url != null) 'url': url!,
       };
@@ -3962,7 +3961,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribution != null) 'attribution': attribution!,
         if (url != null) 'url': url!,
       };
@@ -3984,7 +3983,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (source != null) 'source': source!.toJson(),
         if (text != null) 'text': text!,
       };
@@ -4005,7 +4004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribution != null) 'attribution': attribution!,
         if (url != null) 'url': url!,
       };
@@ -4027,7 +4026,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (source != null) 'source': source!.toJson(),
         if (text != null) 'text': text!,
       };
@@ -4048,7 +4047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
       };
@@ -4070,7 +4069,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribution != null) 'attribution': attribution!,
         if (url != null) 'url': url!,
       };
@@ -4092,7 +4091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (source != null) 'source': source!.toJson(),
         if (text != null) 'text': text!,
       };
@@ -4117,7 +4116,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (definition != null) 'definition': definition!,
         if (examples != null)
           'examples': examples!.map((value) => value.toJson()).toList(),
@@ -4139,7 +4138,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribution != null) 'attribution': attribution!,
         if (url != null) 'url': url!,
       };
@@ -4160,7 +4159,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribution != null) 'attribution': attribution!,
         if (url != null) 'url': url!,
       };
@@ -4182,7 +4181,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (source != null) 'source': source!.toJson(),
         if (text != null) 'text': text!,
       };
@@ -4240,7 +4239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conjugations != null)
           'conjugations': conjugations!.map((value) => value.toJson()).toList(),
         if (definitions != null)
@@ -4272,7 +4271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribution != null) 'attribution': attribution!,
         if (url != null) 'url': url!,
       };
@@ -4317,7 +4316,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (derivatives != null)
           'derivatives': derivatives!.map((value) => value.toJson()).toList(),
         if (examples != null)
@@ -4349,7 +4348,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (source != null) 'source': source!.toJson(),
         if (words != null)
           'words': words!.map((value) => value.toJson()).toList(),
@@ -4377,7 +4376,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (common != null) 'common': common!.toJson(),
         if (dict != null) 'dict': dict!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -4415,7 +4414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fillColorArgb != null) 'fillColorArgb': fillColorArgb!,
         if (imageUrl != null) 'imageUrl': imageUrl!,
         if (maskColorArgb != null) 'maskColorArgb': maskColorArgb!,
@@ -4463,7 +4462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bannerWithContentContainer != null)
           'banner_with_content_container': bannerWithContentContainer!.toJson(),
         if (subTitle != null) 'subTitle': subTitle!,
@@ -4500,7 +4499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusters != null)
           'clusters': clusters!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -4596,7 +4595,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceAllowed != null) 'deviceAllowed': deviceAllowed!,
         if (downloadsAcquired != null) 'downloadsAcquired': downloadsAcquired!,
         if (justAcquired != null) 'justAcquired': justAcquired!,
@@ -4635,7 +4634,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (downloadAccessList != null)
           'downloadAccessList':
               downloadAccessList!.map((value) => value.toJson()).toList(),
@@ -4657,7 +4656,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Family membership info of the user that made the request.
@@ -4695,7 +4694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acquirePermission != null) 'acquirePermission': acquirePermission!,
         if (ageGroup != null) 'ageGroup': ageGroup!,
         if (allowedMaturityRating != null)
@@ -4724,7 +4723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (membership != null) 'membership': membership!.toJson(),
       };
@@ -4809,7 +4808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationType != null) 'annotationType': annotationType!,
         if (data != null) 'data': data!.toJson(),
         if (encodedData != null) 'encodedData': encodedData!,
@@ -4861,7 +4860,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lang != null) 'lang': lang!,
         if (previewImageUrl != null) 'previewImageUrl': previewImageUrl!,
         if (snippet != null) 'snippet': snippet!,
@@ -4885,7 +4884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
@@ -4906,7 +4905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
@@ -4932,7 +4931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hi != null) 'hi': hi!.toJson(),
         if (lo != null) 'lo': lo!.toJson(),
       };
@@ -5006,7 +5005,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundary != null) 'boundary': boundary!,
         if (cachePolicy != null) 'cachePolicy': cachePolicy!,
         if (countryCode != null) 'countryCode': countryCode!,
@@ -5039,7 +5038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (common != null) 'common': common!.toJson(),
         if (geo != null) 'geo': geo!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -5073,7 +5072,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5174,7 +5173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationCount != null) 'annotationCount': annotationCount!,
         if (annotationTypes != null) 'annotationTypes': annotationTypes!,
         if (annotationsDataLink != null)
@@ -5220,7 +5219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (downloadUrl != null) 'download_url': downloadUrl!,
         if (encryptedKey != null) 'encrypted_key': encryptedKey!,
         if (language != null) 'language': language!,
@@ -5250,7 +5249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5335,7 +5334,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!,
         if (crmExperimentIds != null) 'crmExperimentIds': crmExperimentIds!,
         if (docId != null) 'doc_id': docId!,
@@ -5388,7 +5387,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (author != null) 'author': author!,
         if (canonicalVolumeLink != null)
           'canonicalVolumeLink': canonicalVolumeLink!,
@@ -5425,7 +5424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (artUrl != null) 'artUrl': artUrl!,
         if (gservicesKey != null) 'gservicesKey': gservicesKey!,
         if (id != null) 'id': id!,
@@ -5455,7 +5454,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5511,7 +5510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (epubCfiPosition != null) 'epubCfiPosition': epubCfiPosition!,
         if (gbImagePosition != null) 'gbImagePosition': gbImagePosition!,
         if (gbTextPosition != null) 'gbTextPosition': gbTextPosition!,
@@ -5548,7 +5547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (concurrentAccess != null)
           'concurrentAccess': concurrentAccess!.toJson(),
         if (downloadAccess != null) 'downloadAccess': downloadAccess!.toJson(),
@@ -5569,7 +5568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -5600,7 +5599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (extraDescription != null) 'extraDescription': extraDescription!,
         if (url != null) 'url': url!,
@@ -5680,7 +5679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (author != null) 'author': author!.toJson(),
         if (content != null) 'content': content!,
         if (date != null) 'date': date!,
@@ -5718,7 +5717,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amountInMicros != null) 'amountInMicros': amountInMicros!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (releaseNumber != null) 'releaseNumber': releaseNumber!,
@@ -5750,7 +5749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amountInMicros != null) 'amountInMicros': amountInMicros!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (releaseNumber != null) 'releaseNumber': releaseNumber!,
@@ -5787,7 +5786,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cancelTime != null) 'cancelTime': cancelTime!,
         if (currentReleaseInfo != null)
           'currentReleaseInfo': currentReleaseInfo!.toJson(),
@@ -5848,7 +5847,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bannerImageUrl != null) 'bannerImageUrl': bannerImageUrl!,
         if (eligibleForSubscription != null)
           'eligibleForSubscription': eligibleForSubscription!,
@@ -5884,7 +5883,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (series != null)
           'series': series!.map((value) => value.toJson()).toList(),
@@ -5914,7 +5913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (member != null)
           'member': member!.map((value) => value.toJson()).toList(),
@@ -5938,7 +5937,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folderName != null) 'folderName': folderName!,
         if (isEnabled != null) 'isEnabled': isEnabled!,
       };
@@ -5955,7 +5954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (optedState != null) 'opted_state': optedState!,
       };
 }
@@ -5971,7 +5970,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (optedState != null) 'opted_state': optedState!,
       };
 }
@@ -5987,7 +5986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (optedState != null) 'opted_state': optedState!,
       };
 }
@@ -6003,7 +6002,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (optedState != null) 'opted_state': optedState!,
       };
 }
@@ -6019,7 +6018,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (optedState != null) 'opted_state': optedState!,
       };
 }
@@ -6056,7 +6055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matchMyInterests != null)
           'matchMyInterests': matchMyInterests!.toJson(),
         if (moreFromAuthors != null)
@@ -6092,7 +6091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (notesExport != null) 'notesExport': notesExport!.toJson(),
         if (notification != null) 'notification': notification!.toJson(),
@@ -6132,7 +6131,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acsTokenLink != null) 'acsTokenLink': acsTokenLink!,
         if (downloadLink != null) 'downloadLink': downloadLink!,
         if (isAvailable != null) 'isAvailable': isAvailable!,
@@ -6172,7 +6171,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acsTokenLink != null) 'acsTokenLink': acsTokenLink!,
         if (downloadLink != null) 'downloadLink': downloadLink!,
         if (isAvailable != null) 'isAvailable': isAvailable!,
@@ -6305,7 +6304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessViewStatus != null) 'accessViewStatus': accessViewStatus!,
         if (country != null) 'country': country!,
         if (downloadAccess != null) 'downloadAccess': downloadAccess!.toJson(),
@@ -6350,7 +6349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (layerId != null) 'layerId': layerId!,
         if (volumeAnnotationsVersion != null)
           'volumeAnnotationsVersion': volumeAnnotationsVersion!,
@@ -6373,7 +6372,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (layers != null)
           'layers': layers!.map((value) => value.toJson()).toList(),
       };
@@ -6392,7 +6391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (explanation != null) 'explanation': explanation!,
       };
 }
@@ -6422,7 +6421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
       };
@@ -6444,7 +6443,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amountInMicros != null) 'amountInMicros': amountInMicros!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
       };
@@ -6466,7 +6465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (unit != null) 'unit': unit!,
       };
@@ -6488,7 +6487,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amountInMicros != null) 'amountInMicros': amountInMicros!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
       };
@@ -6533,7 +6532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (finskyOfferType != null) 'finskyOfferType': finskyOfferType!,
         if (giftable != null) 'giftable': giftable!,
         if (listPrice != null) 'listPrice': listPrice!.toJson(),
@@ -6568,7 +6567,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
       };
@@ -6653,7 +6652,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buyLink != null) 'buyLink': buyLink!,
         if (country != null) 'country': country!,
         if (isEbook != null) 'isEbook': isEbook!,
@@ -6679,7 +6678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (textSnippet != null) 'textSnippet': textSnippet!,
       };
 }
@@ -6708,7 +6707,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedCharacterCount != null)
           'allowedCharacterCount': allowedCharacterCount!,
         if (limitType != null) 'limitType': limitType!,
@@ -6747,7 +6746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (familyRole != null) 'familyRole': familyRole!,
         if (isSharingAllowed != null) 'isSharingAllowed': isSharingAllowed!,
         if (isSharingDisabledByFop != null)
@@ -6771,7 +6770,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endUtcSec != null) 'endUtcSec': endUtcSec!,
         if (startUtcSec != null) 'startUtcSec': startUtcSec!,
       };
@@ -6788,7 +6787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (processingState != null) 'processingState': processingState!,
       };
 }
@@ -6936,7 +6935,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acquiredTime != null) 'acquiredTime': acquiredTime!,
         if (acquisitionType != null) 'acquisitionType': acquisitionType!,
         if (copy != null) 'copy': copy!.toJson(),
@@ -6990,7 +6989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (thickness != null) 'thickness': thickness!,
         if (width != null) 'width': width!,
@@ -7054,7 +7053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (extraLarge != null) 'extraLarge': extraLarge!,
         if (large != null) 'large': large!,
         if (medium != null) 'medium': medium!,
@@ -7084,7 +7083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identifier != null) 'identifier': identifier!,
         if (type != null) 'type': type!,
       };
@@ -7114,7 +7113,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containsEpubBubbles != null)
           'containsEpubBubbles': containsEpubBubbles!,
         if (containsImageBubbles != null)
@@ -7141,7 +7140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (image != null) 'image': image!,
         if (text != null) 'text': text!,
       };
@@ -7361,7 +7360,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowAnonLogging != null) 'allowAnonLogging': allowAnonLogging!,
         if (authors != null) 'authors': authors!,
         if (averageRating != null) 'averageRating': averageRating!,
@@ -7494,7 +7493,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessInfo != null) 'accessInfo': accessInfo!.toJson(),
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -7535,7 +7534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -7577,7 +7576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cfiRange != null) 'cfiRange': cfiRange!.toJson(),
         if (contentVersion != null) 'contentVersion': contentVersion!,
         if (gbImageRange != null) 'gbImageRange': gbImageRange!.toJson(),
@@ -7680,7 +7679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationDataId != null) 'annotationDataId': annotationDataId!,
         if (annotationDataLink != null)
           'annotationDataLink': annotationDataLink!,
@@ -7745,7 +7744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -7785,7 +7784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -7808,7 +7807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (issueDisplayNumber != null)
           'issueDisplayNumber': issueDisplayNumber!,
         if (issueOrderNumber != null) 'issueOrderNumber': issueOrderNumber!,
@@ -7853,7 +7852,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (issue != null)
           'issue': issue!.map((value) => value.toJson()).toList(),
         if (orderNumber != null) 'orderNumber': orderNumber!,
@@ -7897,7 +7896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bookDisplayNumber != null) 'bookDisplayNumber': bookDisplayNumber!,
         if (kind != null) 'kind': kind!,
         if (shortSeriesBookTitle != null)
diff --git a/generated/googleapis/lib/calendar/v3.dart b/generated/googleapis/lib/calendar/v3.dart
index 986f3fb..fb32249 100644
--- a/generated/googleapis/lib/calendar/v3.dart
+++ b/generated/googleapis/lib/calendar/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2466,7 +2465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -2506,7 +2505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
       };
@@ -2561,7 +2560,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -2635,7 +2634,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conferenceProperties != null)
           'conferenceProperties': conferenceProperties!.toJson(),
         if (description != null) 'description': description!,
@@ -2694,7 +2693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -2721,7 +2720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notifications != null)
           'notifications':
               notifications!.map((value) => value.toJson()).toList(),
@@ -2898,7 +2897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessRole != null) 'accessRole': accessRole!,
         if (backgroundColor != null) 'backgroundColor': backgroundColor!,
         if (colorId != null) 'colorId': colorId!,
@@ -2958,7 +2957,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (method != null) 'method': method!,
         if (type != null) 'type': type!,
       };
@@ -3027,13 +3026,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('payload')) {
       payload = _json['payload'] as core.bool;
@@ -3052,7 +3050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (expiration != null) 'expiration': expiration!,
         if (id != null) 'id': id!,
@@ -3085,7 +3083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (background != null) 'background': background!,
         if (foreground != null) 'foreground': foreground!,
       };
@@ -3118,26 +3116,20 @@
 
   Colors.fromJson(core.Map _json) {
     if (_json.containsKey('calendar')) {
-      calendar = (_json['calendar'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ColorDefinition.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      calendar = (_json['calendar'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ColorDefinition.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('event')) {
-      event = (_json['event'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ColorDefinition.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      event = (_json['event'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ColorDefinition.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -3147,7 +3139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calendar != null)
           'calendar':
               calendar!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -3245,7 +3237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conferenceId != null) 'conferenceId': conferenceId!,
         if (conferenceSolution != null)
           'conferenceSolution': conferenceSolution!.toJson(),
@@ -3271,7 +3263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addOnParameters != null)
           'addOnParameters': addOnParameters!.toJson(),
       };
@@ -3284,18 +3276,17 @@
 
   ConferenceParametersAddOnParameters.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null) 'parameters': parameters!,
       };
 }
@@ -3319,7 +3310,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedConferenceSolutionTypes != null)
           'allowedConferenceSolutionTypes': allowedConferenceSolutionTypes!,
       };
@@ -3345,7 +3336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (statusCode != null) 'statusCode': statusCode!,
       };
 }
@@ -3378,7 +3369,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iconUri != null) 'iconUri': iconUri!,
         if (key != null) 'key': key!.toJson(),
         if (name != null) 'name': name!,
@@ -3407,7 +3398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -3443,7 +3434,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conferenceSolutionKey != null)
           'conferenceSolutionKey': conferenceSolutionKey!.toJson(),
         if (requestId != null) 'requestId': requestId!,
@@ -3587,7 +3578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessCode != null) 'accessCode': accessCode!,
         if (entryPointFeatures != null)
           'entryPointFeatures': entryPointFeatures!,
@@ -3630,7 +3621,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domain != null) 'domain': domain!,
         if (reason != null) 'reason': reason!,
       };
@@ -3674,7 +3665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (email != null) 'email': email!,
         if (id != null) 'id': id!,
@@ -3696,26 +3687,24 @@
 
   EventExtendedProperties.fromJson(core.Map _json) {
     if (_json.containsKey('private')) {
-      private =
-          (_json['private'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      private = (_json['private'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('shared')) {
-      shared =
-          (_json['shared'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      shared = (_json['shared'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (private != null) 'private': private!,
         if (shared != null) 'shared': shared!,
       };
@@ -3783,14 +3772,13 @@
       link = _json['link'] as core.String;
     }
     if (_json.containsKey('preferences')) {
-      preferences = (_json['preferences'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      preferences =
+          (_json['preferences'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -3803,7 +3791,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (display != null) 'display': display!,
         if (height != null) 'height': height!,
         if (iconLink != null) 'iconLink': iconLink!,
@@ -3858,7 +3846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (email != null) 'email': email!,
         if (id != null) 'id': id!,
@@ -3892,7 +3880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (overrides != null)
           'overrides': overrides!.map((value) => value.toJson()).toList(),
         if (useDefault != null) 'useDefault': useDefault!,
@@ -3925,7 +3913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (title != null) 'title': title!,
         if (url != null) 'url': url!,
       };
@@ -4345,7 +4333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (anyoneCanAddSelf != null) 'anyoneCanAddSelf': anyoneCanAddSelf!,
         if (attachments != null)
           'attachments': attachments!.map((value) => value.toJson()).toList(),
@@ -4440,7 +4428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileId != null) 'fileId': fileId!,
         if (fileUrl != null) 'fileUrl': fileUrl!,
         if (iconLink != null) 'iconLink': iconLink!,
@@ -4544,7 +4532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalGuests != null) 'additionalGuests': additionalGuests!,
         if (comment != null) 'comment': comment!,
         if (displayName != null) 'displayName': displayName!,
@@ -4590,7 +4578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null)
           'date':
               "${(date!).year.toString().padLeft(4, '0')}-${(date!).month.toString().padLeft(2, '0')}-${(date!).day.toString().padLeft(2, '0')}",
@@ -4626,7 +4614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (method != null) 'method': method!,
         if (minutes != null) 'minutes': minutes!,
       };
@@ -4741,7 +4729,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessRole != null) 'accessRole': accessRole!,
         if (defaultReminders != null)
           'defaultReminders':
@@ -4783,7 +4771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (busy != null) 'busy': busy!.map((value) => value.toJson()).toList(),
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
@@ -4813,7 +4801,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calendars != null) 'calendars': calendars!,
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
@@ -4873,7 +4861,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calendarExpansionMax != null)
           'calendarExpansionMax': calendarExpansionMax!,
         if (groupExpansionMax != null) 'groupExpansionMax': groupExpansionMax!,
@@ -4897,7 +4885,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
       };
 }
@@ -4922,26 +4910,22 @@
 
   FreeBusyResponse.fromJson(core.Map _json) {
     if (_json.containsKey('calendars')) {
-      calendars = (_json['calendars'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              FreeBusyCalendar.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      calendars =
+          (_json['calendars'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          FreeBusyCalendar.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('groups')) {
-      groups = (_json['groups'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              FreeBusyGroup.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      groups = (_json['groups'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          FreeBusyGroup.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -4954,7 +4938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calendars != null)
           'calendars':
               calendars!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -5000,7 +4984,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -5054,7 +5038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -5082,7 +5066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (end != null) 'end': end!.toIso8601String(),
         if (start != null) 'start': start!.toIso8601String(),
       };
diff --git a/generated/googleapis/lib/chat/v1.dart b/generated/googleapis/lib/chat/v1.dart
index 403923b..3ecce92 100644
--- a/generated/googleapis/lib/chat/v1.dart
+++ b/generated/googleapis/lib/chat/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -976,7 +975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -1009,7 +1008,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (url != null) 'url': url!,
       };
@@ -1067,7 +1066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (length != null) 'length': length!,
         if (slashCommand != null) 'slashCommand': slashCommand!.toJson(),
         if (startIndex != null) 'startIndex': startIndex!,
@@ -1152,7 +1151,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachmentDataRef != null)
           'attachmentDataRef': attachmentDataRef!.toJson(),
         if (contentName != null) 'contentName': contentName!,
@@ -1180,7 +1179,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceName != null) 'resourceName': resourceName!,
       };
 }
@@ -1208,7 +1207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageButton != null) 'imageButton': imageButton!.toJson(),
         if (textButton != null) 'textButton': textButton!.toJson(),
       };
@@ -1254,7 +1253,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cardActions != null)
           'cardActions': cardActions!.map((value) => value.toJson()).toList(),
         if (header != null) 'header': header!.toJson(),
@@ -1287,7 +1286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionLabel != null) 'actionLabel': actionLabel!,
         if (onClick != null) 'onClick': onClick!.toJson(),
       };
@@ -1331,7 +1330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageStyle != null) 'imageStyle': imageStyle!,
         if (imageUrl != null) 'imageUrl': imageUrl!,
         if (subtitle != null) 'subtitle': subtitle!,
@@ -1425,7 +1424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!.toJson(),
         if (configCompleteRedirectUrl != null)
           'configCompleteRedirectUrl': configCompleteRedirectUrl!,
@@ -1452,7 +1451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driveFileId != null) 'driveFileId': driveFileId!,
       };
 }
@@ -1471,7 +1470,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A form action describes the behavior when the form is submitted.
@@ -1503,7 +1502,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionMethodName != null) 'actionMethodName': actionMethodName!,
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
@@ -1540,7 +1539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aspectRatio != null) 'aspectRatio': aspectRatio!,
         if (imageUrl != null) 'imageUrl': imageUrl!,
         if (onClick != null) 'onClick': onClick!.toJson(),
@@ -1614,7 +1613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (icon != null) 'icon': icon!,
         if (iconUrl != null) 'iconUrl': iconUrl!,
         if (name != null) 'name': name!,
@@ -1722,7 +1721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottomLabel != null) 'bottomLabel': bottomLabel!,
         if (button != null) 'button': button!.toJson(),
         if (content != null) 'content': content!,
@@ -1757,7 +1756,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (memberships != null)
           'memberships': memberships!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1788,7 +1787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (spaces != null)
           'spaces': spaces!.map((value) => value.toJson()).toList(),
@@ -1808,7 +1807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceName != null) 'resourceName': resourceName!,
       };
 }
@@ -1851,7 +1850,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (member != null) 'member': member!.toJson(),
         if (name != null) 'name': name!,
@@ -1979,7 +1978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionResponse != null) 'actionResponse': actionResponse!.toJson(),
         if (annotations != null)
           'annotations': annotations!.map((value) => value.toJson()).toList(),
@@ -2021,7 +2020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!.toJson(),
         if (openLink != null) 'openLink': openLink!.toJson(),
       };
@@ -2040,7 +2039,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -2071,7 +2070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!,
         if (widgets != null)
           'widgets': widgets!.map((value) => value.toJson()).toList(),
@@ -2091,7 +2090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commandId != null) 'commandId': commandId!,
       };
 }
@@ -2137,7 +2136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bot != null) 'bot': bot!.toJson(),
         if (commandId != null) 'commandId': commandId!,
         if (commandName != null) 'commandName': commandName!,
@@ -2199,7 +2198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (singleUserBotDm != null) 'singleUserBotDm': singleUserBotDm!,
@@ -2228,7 +2227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (onClick != null) 'onClick': onClick!.toJson(),
         if (text != null) 'text': text!,
       };
@@ -2248,7 +2247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -2268,7 +2267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -2314,7 +2313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (domainId != null) 'domainId': domainId!,
         if (isAnonymous != null) 'isAnonymous': isAnonymous!,
@@ -2347,7 +2346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (user != null) 'user': user!.toJson(),
       };
@@ -2392,7 +2391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (image != null) 'image': image!.toJson(),
diff --git a/generated/googleapis/lib/chromemanagement/v1.dart b/generated/googleapis/lib/chromemanagement/v1.dart
index 90df3c8..484c6cd 100644
--- a/generated/googleapis/lib/chromemanagement/v1.dart
+++ b/generated/googleapis/lib/chromemanagement/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -341,7 +340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channel != null) 'channel': channel!,
         if (count != null) 'count': count!,
         if (deviceOsVersion != null) 'deviceOsVersion': deviceOsVersion!,
@@ -379,7 +378,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (browserVersions != null)
           'browserVersions':
               browserVersions!.map((value) => value.toJson()).toList(),
@@ -417,7 +416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (installedApps != null)
           'installedApps':
               installedApps!.map((value) => value.toJson()).toList(),
@@ -449,7 +448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (machine != null) 'machine': machine!,
       };
@@ -487,7 +486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -615,7 +614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appId != null) 'appId': appId!,
         if (appInstallType != null) 'appInstallType': appInstallType!,
         if (appSource != null) 'appSource': appSource!,
diff --git a/generated/googleapis/lib/chromeuxreport/v1.dart b/generated/googleapis/lib/chromeuxreport/v1.dart
index 882837e..0063d20 100644
--- a/generated/googleapis/lib/chromeuxreport/v1.dart
+++ b/generated/googleapis/lib/chromeuxreport/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -141,7 +140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (density != null) 'density': density!,
         if (end != null) 'end': end!,
         if (start != null) 'start': start!,
@@ -201,7 +200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (effectiveConnectionType != null)
           'effectiveConnectionType': effectiveConnectionType!,
         if (formFactor != null) 'formFactor': formFactor!,
@@ -243,7 +242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (histogram != null)
           'histogram': histogram!.map((value) => value.toJson()).toList(),
         if (percentiles != null) 'percentiles': percentiles!.toJson(),
@@ -270,7 +269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (p75 != null) 'p75': p75!,
       };
 }
@@ -343,7 +342,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (effectiveConnectionType != null)
           'effectiveConnectionType': effectiveConnectionType!,
         if (formFactor != null) 'formFactor': formFactor!,
@@ -381,7 +380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (record != null) 'record': record!.toJson(),
         if (urlNormalizationDetails != null)
           'urlNormalizationDetails': urlNormalizationDetails!.toJson(),
@@ -412,18 +411,16 @@
       key = Key.fromJson(_json['key'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metrics')) {
-      metrics = (_json['metrics'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Metric.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      metrics = (_json['metrics'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Metric.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!.toJson(),
         if (metrics != null)
           'metrics':
@@ -457,7 +454,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedUrl != null) 'normalizedUrl': normalizedUrl!,
         if (originalUrl != null) 'originalUrl': originalUrl!,
       };
diff --git a/generated/googleapis/lib/civicinfo/v2.dart b/generated/googleapis/lib/civicinfo/v2.dart
index cec6fc2..18762e1 100644
--- a/generated/googleapis/lib/civicinfo/v2.dart
+++ b/generated/googleapis/lib/civicinfo/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -358,7 +357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (electionAdministrationBody != null)
           'electionAdministrationBody': electionAdministrationBody!.toJson(),
         if (localJurisdiction != null)
@@ -484,7 +483,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (absenteeVotingInfoUrl != null)
           'absenteeVotingInfoUrl': absenteeVotingInfoUrl!,
         if (ballotInfoUrl != null) 'ballotInfoUrl': ballotInfoUrl!,
@@ -575,7 +574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (candidateUrl != null) 'candidateUrl': candidateUrl!,
         if (channels != null)
           'channels': channels!.map((value) => value.toJson()).toList(),
@@ -611,7 +610,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (type != null) 'type': type!,
       };
@@ -839,7 +838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ballotPlacement != null) 'ballotPlacement': ballotPlacement!,
         if (ballotTitle != null) 'ballotTitle': ballotTitle!,
         if (candidates != null)
@@ -899,7 +898,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
@@ -939,7 +938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliases != null) 'aliases': aliases!,
         if (name != null) 'name': name!,
         if (ocdId != null) 'ocdId': ocdId!,
@@ -982,7 +981,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (electionDay != null) 'electionDay': electionDay!,
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
@@ -1027,7 +1026,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emailAddress != null) 'emailAddress': emailAddress!,
         if (faxNumber != null) 'faxNumber': faxNumber!,
         if (name != null) 'name': name!,
@@ -1060,7 +1059,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (elections != null)
           'elections': elections!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -1114,7 +1113,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (scope != null) 'scope': scope!,
@@ -1163,7 +1162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alsoKnownAs != null) 'alsoKnownAs': alsoKnownAs!,
         if (name != null) 'name': name!,
         if (officeIndices != null) 'officeIndices': officeIndices!,
@@ -1236,7 +1235,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (divisionId != null) 'divisionId': divisionId!,
         if (levels != null) 'levels': levels!,
         if (name != null) 'name': name!,
@@ -1314,7 +1313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null)
           'address': address!.map((value) => value.toJson()).toList(),
         if (channels != null)
@@ -1417,7 +1416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!.toJson(),
         if (endDate != null) 'endDate': endDate!,
         if (latitude != null) 'latitude': latitude!,
@@ -1451,15 +1450,14 @@
 
   RepresentativeInfoData.fromJson(core.Map _json) {
     if (_json.containsKey('divisions')) {
-      divisions = (_json['divisions'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GeographicDivision.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      divisions =
+          (_json['divisions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GeographicDivision.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('offices')) {
       offices = (_json['offices'] as core.List)
@@ -1475,7 +1473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (divisions != null)
           'divisions':
               divisions!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -1514,15 +1512,14 @@
 
   RepresentativeInfoResponse.fromJson(core.Map _json) {
     if (_json.containsKey('divisions')) {
-      divisions = (_json['divisions'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GeographicDivision.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      divisions =
+          (_json['divisions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GeographicDivision.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -1545,7 +1542,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (divisions != null)
           'divisions':
               divisions!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -1608,7 +1605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (city != null) 'city': city!,
         if (line1 != null) 'line1': line1!,
         if (line2 != null) 'line2': line2!,
@@ -1638,7 +1635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (official != null) 'official': official!,
       };
@@ -1756,7 +1753,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contests != null)
           'contests': contests!.map((value) => value.toJson()).toList(),
         if (dropOffLocations != null)
diff --git a/generated/googleapis/lib/classroom/v1.dart b/generated/googleapis/lib/classroom/v1.dart
index b10defa..5869e39 100644
--- a/generated/googleapis/lib/classroom/v1.dart
+++ b/generated/googleapis/lib/classroom/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3810,7 +3809,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateLink != null) 'alternateLink': alternateLink!,
         if (assigneeMode != null) 'assigneeMode': assigneeMode!,
         if (courseId != null) 'courseId': courseId!,
@@ -3844,7 +3843,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (studentWorkFolder != null)
           'studentWorkFolder': studentWorkFolder!.toJson(),
       };
@@ -3872,7 +3871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachments != null)
           'attachments': attachments!.map((value) => value.toJson()).toList(),
       };
@@ -3915,7 +3914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driveFile != null) 'driveFile': driveFile!.toJson(),
         if (form != null) 'form': form!.toJson(),
         if (link != null) 'link': link!.toJson(),
@@ -3941,7 +3940,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topicName != null) 'topicName': topicName!,
       };
 }
@@ -4143,7 +4142,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateLink != null) 'alternateLink': alternateLink!,
         if (calendarId != null) 'calendarId': calendarId!,
         if (courseGroupEmail != null) 'courseGroupEmail': courseGroupEmail!,
@@ -4198,7 +4197,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alias != null) 'alias': alias!,
       };
 }
@@ -4238,7 +4237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driveFile != null) 'driveFile': driveFile!.toJson(),
         if (form != null) 'form': form!.toJson(),
         if (link != null) 'link': link!.toJson(),
@@ -4271,7 +4270,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (materials != null)
           'materials': materials!.map((value) => value.toJson()).toList(),
         if (title != null) 'title': title!,
@@ -4291,7 +4290,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (courseId != null) 'courseId': courseId!,
       };
 }
@@ -4525,7 +4524,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateLink != null) 'alternateLink': alternateLink!,
         if (assigneeMode != null) 'assigneeMode': assigneeMode!,
         if (assignment != null) 'assignment': assignment!.toJson(),
@@ -4569,7 +4568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (courseId != null) 'courseId': courseId!,
       };
 }
@@ -4720,7 +4719,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateLink != null) 'alternateLink': alternateLink!,
         if (assigneeMode != null) 'assigneeMode': assigneeMode!,
         if (courseId != null) 'courseId': courseId!,
@@ -4780,7 +4779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -4824,7 +4823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateLink != null) 'alternateLink': alternateLink!,
         if (id != null) 'id': id!,
         if (thumbnailUrl != null) 'thumbnailUrl': thumbnailUrl!,
@@ -4861,7 +4860,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateLink != null) 'alternateLink': alternateLink!,
         if (id != null) 'id': id!,
         if (title != null) 'title': title!,
@@ -4882,7 +4881,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A class of notifications that an application can register to receive.
@@ -4939,7 +4938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (courseRosterChangesInfo != null)
           'courseRosterChangesInfo': courseRosterChangesInfo!.toJson(),
         if (courseWorkChangesInfo != null)
@@ -4986,7 +4985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formUrl != null) 'formUrl': formUrl!,
         if (responseUrl != null) 'responseUrl': responseUrl!,
         if (thumbnailUrl != null) 'thumbnailUrl': thumbnailUrl!,
@@ -5011,7 +5010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permission != null) 'permission': permission!,
       };
 }
@@ -5061,7 +5060,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actorUserId != null) 'actorUserId': actorUserId!,
         if (gradeChangeType != null) 'gradeChangeType': gradeChangeType!,
         if (gradeTimestamp != null) 'gradeTimestamp': gradeTimestamp!,
@@ -5106,7 +5105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (guardianId != null) 'guardianId': guardianId!,
         if (guardianProfile != null)
           'guardianProfile': guardianProfile!.toJson(),
@@ -5165,7 +5164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (invitationId != null) 'invitationId': invitationId!,
         if (invitedEmailAddress != null)
@@ -5193,7 +5192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (studentIds != null) 'studentIds': studentIds!,
       };
 }
@@ -5243,7 +5242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (courseId != null) 'courseId': courseId!,
         if (id != null) 'id': id!,
         if (role != null) 'role': role!,
@@ -5283,7 +5282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (thumbnailUrl != null) 'thumbnailUrl': thumbnailUrl!,
         if (title != null) 'title': title!,
         if (url != null) 'url': url!,
@@ -5314,7 +5313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (announcements != null)
           'announcements':
               announcements!.map((value) => value.toJson()).toList(),
@@ -5346,7 +5345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliases != null)
           'aliases': aliases!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5377,7 +5376,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (courseWorkMaterial != null)
           'courseWorkMaterial':
               courseWorkMaterial!.map((value) => value.toJson()).toList(),
@@ -5409,7 +5408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (courseWork != null)
           'courseWork': courseWork!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5440,7 +5439,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (courses != null)
           'courses': courses!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5471,7 +5470,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (guardianInvitations != null)
           'guardianInvitations':
               guardianInvitations!.map((value) => value.toJson()).toList(),
@@ -5504,7 +5503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (guardians != null)
           'guardians': guardians!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5535,7 +5534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (invitations != null)
           'invitations': invitations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5566,7 +5565,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (studentSubmissions != null)
           'studentSubmissions':
@@ -5598,7 +5597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (students != null)
           'students': students!.map((value) => value.toJson()).toList(),
@@ -5629,7 +5628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (teachers != null)
           'teachers': teachers!.map((value) => value.toJson()).toList(),
@@ -5660,7 +5659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (topic != null)
           'topic': topic!.map((value) => value.toJson()).toList(),
@@ -5707,7 +5706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driveFile != null) 'driveFile': driveFile!.toJson(),
         if (form != null) 'form': form!.toJson(),
         if (link != null) 'link': link!.toJson(),
@@ -5745,7 +5744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assigneeMode != null) 'assigneeMode': assigneeMode!,
         if (modifyIndividualStudentsOptions != null)
           'modifyIndividualStudentsOptions':
@@ -5772,7 +5771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addAttachments != null)
           'addAttachments':
               addAttachments!.map((value) => value.toJson()).toList(),
@@ -5809,7 +5808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assigneeMode != null) 'assigneeMode': assigneeMode!,
         if (modifyIndividualStudentsOptions != null)
           'modifyIndividualStudentsOptions':
@@ -5843,7 +5842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addStudentIds != null) 'addStudentIds': addStudentIds!,
         if (removeStudentIds != null) 'removeStudentIds': removeStudentIds!,
       };
@@ -5864,7 +5863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (choices != null) 'choices': choices!,
       };
 }
@@ -5882,7 +5881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (answer != null) 'answer': answer!,
       };
 }
@@ -5919,7 +5918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (familyName != null) 'familyName': familyName!,
         if (fullName != null) 'fullName': fullName!,
         if (givenName != null) 'givenName': givenName!,
@@ -5934,7 +5933,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An instruction to Classroom to send notifications from the `feed` to the
@@ -5976,7 +5975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudPubsubTopic != null)
           'cloudPubsubTopic': cloudPubsubTopic!.toJson(),
         if (expiryTime != null) 'expiryTime': expiryTime!,
@@ -5993,7 +5992,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Drive file that is used as material for course work.
@@ -6022,7 +6021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driveFile != null) 'driveFile': driveFile!.toJson(),
         if (shareMode != null) 'shareMode': shareMode!,
       };
@@ -6041,7 +6040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (answer != null) 'answer': answer!,
       };
 }
@@ -6084,7 +6083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actorUserId != null) 'actorUserId': actorUserId!,
         if (state != null) 'state': state!,
         if (stateTimestamp != null) 'stateTimestamp': stateTimestamp!,
@@ -6134,7 +6133,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (courseId != null) 'courseId': courseId!,
         if (profile != null) 'profile': profile!.toJson(),
         if (studentWorkFolder != null)
@@ -6314,7 +6313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateLink != null) 'alternateLink': alternateLink!,
         if (assignedGrade != null) 'assignedGrade': assignedGrade!,
         if (assignmentSubmission != null)
@@ -6364,7 +6363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gradeHistory != null) 'gradeHistory': gradeHistory!.toJson(),
         if (stateHistory != null) 'stateHistory': stateHistory!.toJson(),
       };
@@ -6404,7 +6403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (courseId != null) 'courseId': courseId!,
         if (profile != null) 'profile': profile!.toJson(),
         if (userId != null) 'userId': userId!,
@@ -6456,7 +6455,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
@@ -6506,7 +6505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (courseId != null) 'courseId': courseId!,
         if (name != null) 'name': name!,
         if (topicId != null) 'topicId': topicId!,
@@ -6522,7 +6521,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Global information for a user.
@@ -6586,7 +6585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emailAddress != null) 'emailAddress': emailAddress!,
         if (id != null) 'id': id!,
         if (name != null) 'name': name!.toJson(),
@@ -6634,7 +6633,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateLink != null) 'alternateLink': alternateLink!,
         if (id != null) 'id': id!,
         if (thumbnailUrl != null) 'thumbnailUrl': thumbnailUrl!,
diff --git a/generated/googleapis/lib/cloudasset/v1.dart b/generated/googleapis/lib/cloudasset/v1.dart
index 190a860..2534cdb 100644
--- a/generated/googleapis/lib/cloudasset/v1.dart
+++ b/generated/googleapis/lib/cloudasset/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -947,7 +946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
         if (roles != null) 'roles': roles!,
       };
@@ -978,7 +977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analysisQuery != null) 'analysisQuery': analysisQuery!.toJson(),
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
@@ -1017,7 +1016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullyExplored != null) 'fullyExplored': fullyExplored!,
         if (mainAnalysis != null) 'mainAnalysis': mainAnalysis!.toJson(),
         if (serviceAccountImpersonationAnalysis != null)
@@ -1161,7 +1160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevel != null) 'accessLevel': accessLevel!.toJson(),
         if (accessPolicy != null) 'accessPolicy': accessPolicy!.toJson(),
         if (ancestors != null) 'ancestors': ancestors!,
@@ -1219,7 +1218,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1261,7 +1260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1283,7 +1282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assets != null)
           'assets': assets!.map((value) => value.toJson()).toList(),
       };
@@ -1381,7 +1380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!,
         if (force != null) 'force': force!,
         if (partitionSpec != null) 'partitionSpec': partitionSpec!.toJson(),
@@ -1457,7 +1456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1493,7 +1492,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feed != null) 'feed': feed!.toJson(),
         if (feedId != null) 'feedId': feedId!,
       };
@@ -1513,7 +1512,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Explanation about the IAM policy search result.
@@ -1532,18 +1531,18 @@
 
   Explanation.fromJson(core.Map _json) {
     if (_json.containsKey('matchedPermissions')) {
-      matchedPermissions = (_json['matchedPermissions'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Permissions.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      matchedPermissions =
+          (_json['matchedPermissions'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          Permissions.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matchedPermissions != null)
           'matchedPermissions': matchedPermissions!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -1615,7 +1614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assetTypes != null) 'assetTypes': assetTypes!,
         if (contentType != null) 'contentType': contentType!,
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
@@ -1684,7 +1683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1788,7 +1787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assetNames != null) 'assetNames': assetNames!,
         if (assetTypes != null) 'assetTypes': assetTypes!,
         if (condition != null) 'condition': condition!.toJson(),
@@ -1813,7 +1812,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pubsubDestination != null)
           'pubsubDestination': pubsubDestination!.toJson(),
       };
@@ -1851,7 +1850,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
         if (uriPrefix != null) 'uriPrefix': uriPrefix!,
       };
@@ -1883,7 +1882,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analysisState != null) 'analysisState': analysisState!.toJson(),
         if (permission != null) 'permission': permission!,
         if (role != null) 'role': role!,
@@ -1947,7 +1946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accesses != null)
           'accesses': accesses!.map((value) => value.toJson()).toList(),
         if (resourceEdges != null)
@@ -2024,7 +2023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!,
         if (partitionKey != null) 'partitionKey': partitionKey!,
         if (tablePrefix != null) 'tablePrefix': tablePrefix!,
@@ -2057,7 +2056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sourceNode != null) 'sourceNode': sourceNode!,
         if (targetNode != null) 'targetNode': targetNode!,
       };
@@ -2083,7 +2082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -2112,7 +2111,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analysisState != null) 'analysisState': analysisState!.toJson(),
         if (name != null) 'name': name!,
       };
@@ -2153,7 +2152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupEdges != null)
           'groupEdges': groupEdges!.map((value) => value.toJson()).toList(),
         if (identities != null)
@@ -2182,7 +2181,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analysisState != null) 'analysisState': analysisState!.toJson(),
         if (fullResourceName != null) 'fullResourceName': fullResourceName!,
       };
@@ -2227,7 +2226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enforced != null) 'enforced': enforced!,
       };
 }
@@ -2365,7 +2364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allValues != null) 'allValues': allValues!,
         if (allowedValues != null) 'allowedValues': allowedValues!,
         if (deniedValues != null) 'deniedValues': deniedValues!,
@@ -2456,7 +2455,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (booleanPolicy != null) 'booleanPolicy': booleanPolicy!.toJson(),
         if (constraint != null) 'constraint': constraint!,
         if (etag != null) 'etag': etag!,
@@ -2486,7 +2485,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An `AccessLevel` is a label that can be applied to requests to Google Cloud
@@ -2541,7 +2540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basic != null) 'basic': basic!.toJson(),
         if (custom != null) 'custom': custom!.toJson(),
         if (description != null) 'description': description!,
@@ -2605,7 +2604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (name != null) 'name': name!,
         if (parent != null) 'parent': parent!,
@@ -2646,7 +2645,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (methodSelectors != null)
           'methodSelectors':
               methodSelectors!.map((value) => value.toJson()).toList(),
@@ -2689,7 +2688,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (combiningFunction != null) 'combiningFunction': combiningFunction!,
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
@@ -2780,7 +2779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devicePolicy != null) 'devicePolicy': devicePolicy!.toJson(),
         if (ipSubnetworks != null) 'ipSubnetworks': ipSubnetworks!,
         if (members != null) 'members': members!,
@@ -2810,7 +2809,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expr != null) 'expr': expr!.toJson(),
       };
 }
@@ -2881,7 +2880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedDeviceManagementLevels != null)
           'allowedDeviceManagementLevels': allowedDeviceManagementLevels!,
         if (allowedEncryptionStatuses != null)
@@ -2938,7 +2937,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identities != null) 'identities': identities!,
         if (identityType != null) 'identityType': identityType!,
       };
@@ -2980,7 +2979,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (egressFrom != null) 'egressFrom': egressFrom!.toJson(),
         if (egressTo != null) 'egressTo': egressTo!.toJson(),
       };
@@ -3024,7 +3023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
         if (resources != null) 'resources': resources!,
@@ -3079,7 +3078,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identities != null) 'identities': identities!,
         if (identityType != null) 'identityType': identityType!,
         if (sources != null)
@@ -3121,7 +3120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingressFrom != null) 'ingressFrom': ingressFrom!.toJson(),
         if (ingressTo != null) 'ingressTo': ingressTo!.toJson(),
       };
@@ -3160,7 +3159,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevel != null) 'accessLevel': accessLevel!,
         if (resource != null) 'resource': resource!,
       };
@@ -3202,7 +3201,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
         if (resources != null) 'resources': resources!,
@@ -3233,7 +3232,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (method != null) 'method': method!,
         if (permission != null) 'permission': permission!,
       };
@@ -3282,7 +3281,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minimumVersion != null) 'minimumVersion': minimumVersion!,
         if (osType != null) 'osType': osType!,
         if (requireVerifiedChromeOs != null)
@@ -3392,7 +3391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (name != null) 'name': name!,
         if (perimeterType != null) 'perimeterType': perimeterType!,
@@ -3491,7 +3490,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevels != null) 'accessLevels': accessLevels!,
         if (egressPolicies != null)
           'egressPolicies':
@@ -3535,7 +3534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedServices != null) 'allowedServices': allowedServices!,
         if (enableRestriction != null) 'enableRestriction': enableRestriction!,
       };
@@ -3583,7 +3582,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analysisQuery != null) 'analysisQuery': analysisQuery!.toJson(),
         if (analysisResults != null)
           'analysisResults':
@@ -3616,7 +3615,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigqueryDestination != null)
           'bigqueryDestination': bigqueryDestination!.toJson(),
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
@@ -3685,7 +3684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessSelector != null) 'accessSelector': accessSelector!.toJson(),
         if (identitySelector != null)
           'identitySelector': identitySelector!.toJson(),
@@ -3746,7 +3745,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessControlLists != null)
           'accessControlLists':
               accessControlLists!.map((value) => value.toJson()).toList(),
@@ -3863,7 +3862,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cause != null) 'cause': cause!,
         if (code != null) 'code': code!,
       };
@@ -3929,7 +3928,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (explanation != null) 'explanation': explanation!.toJson(),
         if (policy != null) 'policy': policy!.toJson(),
         if (project != null) 'project': project!,
@@ -3961,7 +3960,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identity != null) 'identity': identity!,
       };
 }
@@ -3982,14 +3981,12 @@
 
   Inventory.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Item.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Item.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('osInfo')) {
       osInfo = OsInfo.fromJson(
@@ -3997,7 +3994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
         if (osInfo != null) 'osInfo': osInfo!.toJson(),
@@ -4065,7 +4062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availablePackage != null)
           'availablePackage': availablePackage!.toJson(),
         if (createTime != null) 'createTime': createTime!,
@@ -4093,7 +4090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feeds != null)
           'feeds': feeds!.map((value) => value.toJson()).toList(),
       };
@@ -4153,29 +4150,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4290,7 +4285,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyzeServiceAccountImpersonation != null)
           'analyzeServiceAccountImpersonation':
               analyzeServiceAccountImpersonation!,
@@ -4363,7 +4358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (architecture != null) 'architecture': architecture!,
         if (hostname != null) 'hostname': hostname!,
         if (kernelRelease != null) 'kernelRelease': kernelRelease!,
@@ -4399,7 +4394,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigqueryDestination != null)
           'bigqueryDestination': bigqueryDestination!.toJson(),
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
@@ -4431,7 +4426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (partitionKey != null) 'partitionKey': partitionKey!,
       };
 }
@@ -4453,7 +4448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4562,7 +4557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -4587,7 +4582,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topic != null) 'topic': topic!,
       };
 }
@@ -4646,12 +4641,12 @@
 
   Resource.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
-      data = (_json['data'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      data = (_json['data'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('discoveryDocumentUri')) {
       discoveryDocumentUri = _json['discoveryDocumentUri'] as core.String;
@@ -4673,7 +4668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
         if (discoveryDocumentUri != null)
           'discoveryDocumentUri': discoveryDocumentUri!,
@@ -4856,14 +4851,14 @@
 
   ResourceSearchResult.fromJson(core.Map _json) {
     if (_json.containsKey('additionalAttributes')) {
-      additionalAttributes = (_json['additionalAttributes'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      additionalAttributes =
+          (_json['additionalAttributes'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('assetType')) {
       assetType = _json['assetType'] as core.String;
@@ -4886,13 +4881,12 @@
       kmsKey = _json['kmsKey'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -4925,7 +4919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalAttributes != null)
           'additionalAttributes': additionalAttributes!,
         if (assetType != null) 'assetType': assetType!,
@@ -4968,7 +4962,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullResourceName != null) 'fullResourceName': fullResourceName!,
       };
 }
@@ -5000,7 +4994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
@@ -5035,7 +5029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
@@ -5127,7 +5121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aptPackage != null) 'aptPackage': aptPackage!.toJson(),
         if (cosPackage != null) 'cosPackage': cosPackage!.toJson(),
         if (googetPackage != null) 'googetPackage': googetPackage!.toJson(),
@@ -5172,8 +5166,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -5186,7 +5180,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -5244,7 +5238,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (asset != null) 'asset': asset!.toJson(),
         if (deleted != null) 'deleted': deleted!,
         if (priorAsset != null) 'priorAsset': priorAsset!.toJson(),
@@ -5274,7 +5268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -5312,7 +5306,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feed != null) 'feed': feed!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -5346,7 +5340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (architecture != null) 'architecture': architecture!,
         if (packageName != null) 'packageName': packageName!,
         if (version != null) 'version': version!,
@@ -5390,7 +5384,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caption != null) 'caption': caption!,
         if (description != null) 'description': description!,
         if (hotFixId != null) 'hotFixId': hotFixId!,
@@ -5417,7 +5411,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
       };
@@ -5501,7 +5495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categories != null)
           'categories': categories!.map((value) => value.toJson()).toList(),
         if (description != null) 'description': description!,
@@ -5547,7 +5541,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (patchName != null) 'patchName': patchName!,
         if (severity != null) 'severity': severity!,
diff --git a/generated/googleapis/lib/cloudbilling/v1.dart b/generated/googleapis/lib/cloudbilling/v1.dart
index 7aedc6a..fbbff33 100644
--- a/generated/googleapis/lib/cloudbilling/v1.dart
+++ b/generated/googleapis/lib/cloudbilling/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -769,7 +768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregationCount != null) 'aggregationCount': aggregationCount!,
         if (aggregationInterval != null)
           'aggregationInterval': aggregationInterval!,
@@ -818,7 +817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -860,7 +859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -920,7 +919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (masterBillingAccount != null)
           'masterBillingAccount': masterBillingAccount!,
@@ -995,7 +994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1039,7 +1038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceFamily != null) 'resourceFamily': resourceFamily!,
         if (resourceGroup != null) 'resourceGroup': resourceGroup!,
         if (serviceDisplayName != null)
@@ -1109,7 +1108,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1147,7 +1146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (regions != null) 'regions': regions!,
         if (type != null) 'type': type!,
       };
@@ -1179,7 +1178,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingAccounts != null)
           'billingAccounts':
               billingAccounts!.map((value) => value.toJson()).toList(),
@@ -1214,7 +1213,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (projectBillingInfo != null)
           'projectBillingInfo':
@@ -1248,7 +1247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (services != null)
           'services': services!.map((value) => value.toJson()).toList(),
@@ -1281,7 +1280,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (skus != null) 'skus': skus!.map((value) => value.toJson()).toList(),
       };
@@ -1320,7 +1319,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -1431,7 +1430,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -1523,7 +1522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseUnit != null) 'baseUnit': baseUnit!,
         if (baseUnitConversionFactor != null)
           'baseUnitConversionFactor': baseUnitConversionFactor!,
@@ -1595,7 +1594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregationInfo != null)
           'aggregationInfo': aggregationInfo!.toJson(),
         if (currencyConversionRate != null)
@@ -1658,7 +1657,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingAccountName != null)
           'billingAccountName': billingAccountName!,
         if (billingEnabled != null) 'billingEnabled': billingEnabled!,
@@ -1704,7 +1703,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (businessEntityName != null)
           'businessEntityName': businessEntityName!,
         if (displayName != null) 'displayName': displayName!,
@@ -1740,7 +1739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -1818,7 +1817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!.toJson(),
         if (description != null) 'description': description!,
         if (geoTaxonomy != null) 'geoTaxonomy': geoTaxonomy!.toJson(),
@@ -1851,7 +1850,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1872,7 +1871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1902,7 +1901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (startUsageAmount != null) 'startUsageAmount': startUsageAmount!,
         if (unitPrice != null) 'unitPrice': unitPrice!.toJson(),
       };
diff --git a/generated/googleapis/lib/cloudbuild/v1.dart b/generated/googleapis/lib/cloudbuild/v1.dart
index fa8c112..7b8a36f 100644
--- a/generated/googleapis/lib/cloudbuild/v1.dart
+++ b/generated/googleapis/lib/cloudbuild/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1184,7 +1183,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null) 'location': location!,
         if (paths != null) 'paths': paths!,
         if (timing != null) 'timing': timing!.toJson(),
@@ -1218,7 +1217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileHash != null)
           'fileHash': fileHash!.map((value) => value.toJson()).toList(),
         if (location != null) 'location': location!,
@@ -1261,7 +1260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (images != null) 'images': images!,
         if (objects != null) 'objects': objects!.toJson(),
       };
@@ -1522,14 +1521,13 @@
           .toList();
     }
     if (_json.containsKey('substitutions')) {
-      substitutions = (_json['substitutions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      substitutions =
+          (_json['substitutions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('tags')) {
       tags = (_json['tags'] as core.List)
@@ -1540,18 +1538,16 @@
       timeout = _json['timeout'] as core.String;
     }
     if (_json.containsKey('timing')) {
-      timing = (_json['timing'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              TimeSpan.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      timing = (_json['timing'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          TimeSpan.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (artifacts != null) 'artifacts': artifacts!.toJson(),
         if (availableSecrets != null)
           'availableSecrets': availableSecrets!.toJson(),
@@ -1601,7 +1597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (build != null) 'build': build!.toJson(),
       };
 }
@@ -1759,7 +1755,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (diskSizeGb != null) 'diskSizeGb': diskSizeGb!,
         if (dynamicSubstitutions != null)
           'dynamicSubstitutions': dynamicSubstitutions!,
@@ -1949,7 +1945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (args != null) 'args': args!,
         if (dir != null) 'dir': dir!,
         if (entrypoint != null) 'entrypoint': entrypoint!,
@@ -2083,14 +2079,13 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('substitutions')) {
-      substitutions = (_json['substitutions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      substitutions =
+          (_json['substitutions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('tags')) {
       tags = (_json['tags'] as core.List)
@@ -2103,7 +2098,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (build != null) 'build': build!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
@@ -2150,7 +2145,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digest != null) 'digest': digest!,
         if (name != null) 'name': name!,
         if (pushTiming != null) 'pushTiming': pushTiming!.toJson(),
@@ -2188,7 +2183,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (projectId != null) 'projectId': projectId!,
@@ -2203,7 +2198,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -2220,7 +2215,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Container message for hashes of byte content of files, used in
@@ -2240,7 +2235,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileHash != null)
           'fileHash': fileHash!.map((value) => value.toJson()).toList(),
       };
@@ -2295,7 +2290,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (installationId != null) 'installationId': installationId!,
         if (name != null) 'name': name!,
         if (owner != null) 'owner': owner!,
@@ -2317,7 +2312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -2351,7 +2346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
       };
@@ -2408,8 +2403,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2419,7 +2414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (data != null) 'data': data!,
         if (extensions != null) 'extensions': extensions!,
@@ -2446,20 +2441,19 @@
 
   InlineSecret.fromJson(core.Map _json) {
     if (_json.containsKey('envMap')) {
-      envMap =
-          (_json['envMap'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      envMap = (_json['envMap'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('kmsKeyName')) {
       kmsKeyName = _json['kmsKeyName'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (envMap != null) 'envMap': envMap!,
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
       };
@@ -2487,7 +2481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (triggers != null)
           'triggers': triggers!.map((value) => value.toJson()).toList(),
@@ -2518,7 +2512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (builds != null)
           'builds': builds!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2568,18 +2562,17 @@
           _json['smtpDelivery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('structDelivery')) {
-      structDelivery = (_json['structDelivery'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      structDelivery =
+          (_json['structDelivery'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
         if (httpDelivery != null) 'httpDelivery': httpDelivery!.toJson(),
         if (slackDelivery != null) 'slackDelivery': slackDelivery!.toJson(),
@@ -2621,7 +2614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (kind != null) 'kind': kind!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -2654,7 +2647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (notifier != null) 'notifier': notifier!,
       };
@@ -2686,7 +2679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -2707,7 +2700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (secretRef != null) 'secretRef': secretRef!,
       };
 }
@@ -2735,7 +2728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notification != null) 'notification': notification!.toJson(),
         if (secrets != null)
           'secrets': secrets!.map((value) => value.toJson()).toList(),
@@ -2796,29 +2789,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2865,7 +2856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (branch != null) 'branch': branch!,
         if (commentControl != null) 'commentControl': commentControl!,
         if (invertRegex != null) 'invertRegex': invertRegex!,
@@ -2904,7 +2895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (branch != null) 'branch': branch!,
         if (invertRegex != null) 'invertRegex': invertRegex!,
         if (tag != null) 'tag': tag!,
@@ -2920,7 +2911,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Location of the source in a Google Cloud Source Repository.
@@ -2985,21 +2976,20 @@
       repoName = _json['repoName'] as core.String;
     }
     if (_json.containsKey('substitutions')) {
-      substitutions = (_json['substitutions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      substitutions =
+          (_json['substitutions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('tagName')) {
       tagName = _json['tagName'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (branchName != null) 'branchName': branchName!,
         if (commitSha != null) 'commitSha': commitSha!,
         if (dir != null) 'dir': dir!,
@@ -3072,7 +3062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (artifactManifest != null) 'artifactManifest': artifactManifest!,
         if (artifactTiming != null) 'artifactTiming': artifactTiming!.toJson(),
         if (buildStepImages != null) 'buildStepImages': buildStepImages!,
@@ -3114,7 +3104,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (projectId != null) 'projectId': projectId!,
@@ -3170,7 +3160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fromAddress != null) 'fromAddress': fromAddress!,
         if (password != null) 'password': password!.toJson(),
         if (port != null) 'port': port!,
@@ -3207,16 +3197,16 @@
     }
     if (_json.containsKey('secretEnv')) {
       secretEnv =
-          (_json['secretEnv'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+          (_json['secretEnv'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
         if (secretEnv != null) 'secretEnv': secretEnv!,
       };
@@ -3246,7 +3236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (env != null) 'env': env!,
         if (versionName != null) 'versionName': versionName!,
       };
@@ -3278,7 +3268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inline != null)
           'inline': inline!.map((value) => value.toJson()).toList(),
         if (secretManager != null)
@@ -3306,7 +3296,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (webhookUri != null) 'webhookUri': webhookUri!.toJson(),
       };
 }
@@ -3333,7 +3323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (repoSource != null) 'repoSource': repoSource!.toJson(),
         if (storageSource != null) 'storageSource': storageSource!.toJson(),
       };
@@ -3369,14 +3359,13 @@
 
   SourceProvenance.fromJson(core.Map _json) {
     if (_json.containsKey('fileHashes')) {
-      fileHashes = (_json['fileHashes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              FileHashes.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      fileHashes =
+          (_json['fileHashes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          FileHashes.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('resolvedRepoSource')) {
       resolvedRepoSource = RepoSource.fromJson(
@@ -3389,7 +3378,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileHashes != null)
           'fileHashes':
               fileHashes!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -3433,8 +3422,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3447,7 +3436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -3485,7 +3474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucket != null) 'bucket': bucket!,
         if (generation != null) 'generation': generation!,
         if (object != null) 'object': object!,
@@ -3511,7 +3500,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -3544,7 +3533,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (path != null) 'path': path!,
       };
diff --git a/generated/googleapis/lib/cloudchannel/v1.dart b/generated/googleapis/lib/cloudchannel/v1.dart
index 76686fd..f9d7f52 100644
--- a/generated/googleapis/lib/cloudchannel/v1.dart
+++ b/generated/googleapis/lib/cloudchannel/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2317,7 +2316,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestId != null) 'requestId': requestId!,
       };
 }
@@ -2347,7 +2346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (familyName != null) 'familyName': familyName!,
         if (givenName != null) 'givenName': givenName!,
@@ -2367,7 +2366,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseEntitlement != null) 'baseEntitlement': baseEntitlement!,
       };
 }
@@ -2397,7 +2396,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestId != null) 'requestId': requestId!,
       };
 }
@@ -2457,7 +2456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (offer != null) 'offer': offer!,
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
@@ -2513,7 +2512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
         if (purchaseOrderId != null) 'purchaseOrderId': purchaseOrderId!,
@@ -2555,7 +2554,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (renewalSettings != null)
           'renewalSettings': renewalSettings!.toJson(),
         if (requestId != null) 'requestId': requestId!,
@@ -2648,7 +2647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelPartnerCloudIdentityInfo != null)
           'channelPartnerCloudIdentityInfo':
               channelPartnerCloudIdentityInfo!.toJson(),
@@ -2679,7 +2678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domain != null) 'domain': domain!,
       };
 }
@@ -2703,7 +2702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudIdentityAccounts != null)
           'cloudIdentityAccounts':
               cloudIdentityAccounts!.map((value) => value.toJson()).toList(),
@@ -2748,7 +2747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerCloudIdentityId != null)
           'customerCloudIdentityId': customerCloudIdentityId!,
         if (customerName != null) 'customerName': customerName!,
@@ -2823,7 +2822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminConsoleUri != null) 'adminConsoleUri': adminConsoleUri!,
         if (alternateEmail != null) 'alternateEmail': alternateEmail!,
         if (customerType != null) 'customerType': customerType!,
@@ -2867,7 +2866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (renewalSettings != null)
           'renewalSettings': renewalSettings!.toJson(),
@@ -2889,7 +2888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerConstraints != null)
           'customerConstraints': customerConstraints!.toJson(),
       };
@@ -2948,7 +2947,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (email != null) 'email': email!,
         if (firstName != null) 'firstName': firstName!,
@@ -2992,7 +2991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entitlement != null) 'entitlement': entitlement!.toJson(),
         if (requestId != null) 'requestId': requestId!,
       };
@@ -3121,7 +3120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateEmail != null) 'alternateEmail': alternateEmail!,
         if (channelPartnerId != null) 'channelPartnerId': channelPartnerId!,
         if (cloudIdentityId != null) 'cloudIdentityId': cloudIdentityId!,
@@ -3173,7 +3172,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedCustomerTypes != null)
           'allowedCustomerTypes': allowedCustomerTypes!,
         if (allowedRegions != null) 'allowedRegions': allowedRegions!,
@@ -3206,7 +3205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customer != null) 'customer': customer!,
         if (eventType != null) 'eventType': eventType!,
       };
@@ -3252,7 +3251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instituteSize != null) 'instituteSize': instituteSize!,
         if (instituteType != null) 'instituteType': instituteType!,
         if (website != null) 'website': website!,
@@ -3384,7 +3383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (associationInfo != null)
           'associationInfo': associationInfo!.toJson(),
         if (commitmentSettings != null)
@@ -3443,7 +3442,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entitlement != null) 'entitlement': entitlement!,
         if (eventType != null) 'eventType': eventType!,
       };
@@ -3474,7 +3473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelPartnerLinks != null)
           'channelPartnerLinks':
               channelPartnerLinks!.map((value) => value.toJson()).toList(),
@@ -3507,7 +3506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customers != null)
           'customers': customers!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3539,7 +3538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entitlements != null)
           'entitlements': entitlements!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3569,7 +3568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (offers != null)
           'offers': offers!.map((value) => value.toJson()).toList(),
@@ -3599,7 +3598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (products != null)
           'products': products!.map((value) => value.toJson()).toList(),
@@ -3629,7 +3628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (purchasableOffers != null)
           'purchasableOffers':
@@ -3660,7 +3659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (purchasableSkus != null)
           'purchasableSkus':
@@ -3691,7 +3690,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (skus != null) 'skus': skus!.map((value) => value.toJson()).toList(),
       };
@@ -3726,7 +3725,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (serviceAccounts != null) 'serviceAccounts': serviceAccounts!,
         if (topic != null) 'topic': topic!,
@@ -3789,7 +3788,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudIdentityId != null) 'cloudIdentityId': cloudIdentityId!,
         if (customerName != null) 'customerName': customerName!,
         if (languageCode != null) 'languageCode': languageCode!,
@@ -3824,7 +3823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (transferableOffers != null)
           'transferableOffers':
@@ -3894,7 +3893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authToken != null) 'authToken': authToken!,
         if (cloudIdentityId != null) 'cloudIdentityId': cloudIdentityId!,
         if (customerName != null) 'customerName': customerName!,
@@ -3930,7 +3929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (transferableSkus != null)
           'transferableSkus':
@@ -3966,7 +3965,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultLogo != null) 'defaultLogo': defaultLogo!.toJson(),
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -4001,7 +4000,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (title != null) 'title': title!,
         if (type != null) 'type': type!,
@@ -4088,7 +4087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (constraints != null) 'constraints': constraints!.toJson(),
         if (endTime != null) 'endTime': endTime!,
         if (marketingInfo != null) 'marketingInfo': marketingInfo!.toJson(),
@@ -4142,7 +4141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationType != null) 'operationType': operationType!,
       };
 }
@@ -4178,7 +4177,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (editable != null) 'editable': editable!,
         if (name != null) 'name': name!,
         if (value != null) 'value': value!.toJson(),
@@ -4253,7 +4252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedValues != null)
           'allowedValues':
               allowedValues!.map((value) => value.toJson()).toList(),
@@ -4289,7 +4288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (periodType != null) 'periodType': periodType!,
       };
@@ -4357,7 +4356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingAccount != null) 'billingAccount': billingAccount!,
         if (paymentCycle != null) 'paymentCycle': paymentCycle!.toJson(),
         if (paymentPlan != null) 'paymentPlan': paymentPlan!,
@@ -4401,7 +4400,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basePrice != null) 'basePrice': basePrice!.toJson(),
         if (discount != null) 'discount': discount!,
         if (effectivePrice != null) 'effectivePrice': effectivePrice!.toJson(),
@@ -4457,7 +4456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (price != null) 'price': price!.toJson(),
         if (pricePhases != null)
           'pricePhases': pricePhases!.map((value) => value.toJson()).toList(),
@@ -4517,7 +4516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firstPeriod != null) 'firstPeriod': firstPeriod!,
         if (lastPeriod != null) 'lastPeriod': lastPeriod!,
         if (periodType != null) 'periodType': periodType!,
@@ -4558,7 +4557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firstResource != null) 'firstResource': firstResource!,
         if (lastResource != null) 'lastResource': lastResource!,
         if (price != null) 'price': price!.toJson(),
@@ -4589,7 +4588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (marketingInfo != null) 'marketingInfo': marketingInfo!.toJson(),
         if (name != null) 'name': name!,
       };
@@ -4623,7 +4622,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudIdentityInfo != null)
           'cloudIdentityInfo': cloudIdentityInfo!.toJson(),
         if (user != null) 'user': user!.toJson(),
@@ -4665,7 +4664,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (productId != null) 'productId': productId!,
         if (provisioningId != null) 'provisioningId': provisioningId!,
         if (skuId != null) 'skuId': skuId!,
@@ -4688,7 +4687,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (offer != null) 'offer': offer!.toJson(),
       };
 }
@@ -4709,7 +4708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sku != null) 'sku': sku!.toJson(),
       };
 }
@@ -4730,7 +4729,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (serviceAccount != null) 'serviceAccount': serviceAccount!,
       };
 }
@@ -4748,7 +4747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topic != null) 'topic': topic!,
       };
 }
@@ -4794,7 +4793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableRenewal != null) 'enableRenewal': enableRenewal!,
         if (paymentCycle != null) 'paymentCycle': paymentCycle!.toJson(),
         if (paymentPlan != null) 'paymentPlan': paymentPlan!,
@@ -4835,7 +4834,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (marketingInfo != null) 'marketingInfo': marketingInfo!.toJson(),
         if (name != null) 'name': name!,
         if (product != null) 'product': product!.toJson(),
@@ -4867,7 +4866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestId != null) 'requestId': requestId!,
       };
 }
@@ -4894,7 +4893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerEvent != null) 'customerEvent': customerEvent!.toJson(),
         if (entitlementEvent != null)
           'entitlementEvent': entitlementEvent!.toJson(),
@@ -4926,7 +4925,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestId != null) 'requestId': requestId!,
       };
 }
@@ -4962,7 +4961,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (ineligibilityReason != null)
           'ineligibilityReason': ineligibilityReason!,
@@ -5018,7 +5017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authToken != null) 'authToken': authToken!,
         if (entitlements != null)
           'entitlements': entitlements!.map((value) => value.toJson()).toList(),
@@ -5045,7 +5044,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entitlements != null)
           'entitlements': entitlements!.map((value) => value.toJson()).toList(),
       };
@@ -5089,7 +5088,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entitlements != null)
           'entitlements': entitlements!.map((value) => value.toJson()).toList(),
         if (requestId != null) 'requestId': requestId!,
@@ -5112,7 +5111,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (offer != null) 'offer': offer!.toJson(),
       };
 }
@@ -5141,7 +5140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sku != null) 'sku': sku!.toJson(),
         if (transferEligibility != null)
           'transferEligibility': transferEligibility!.toJson(),
@@ -5173,7 +5172,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (trial != null) 'trial': trial!,
       };
@@ -5195,7 +5194,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (serviceAccount != null) 'serviceAccount': serviceAccount!,
       };
 }
@@ -5214,7 +5213,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topic != null) 'topic': topic!,
       };
 }
@@ -5248,7 +5247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelPartnerLink != null)
           'channelPartnerLink': channelPartnerLink!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
@@ -5282,21 +5281,20 @@
       int64Value = _json['int64Value'] as core.String;
     }
     if (_json.containsKey('protoValue')) {
-      protoValue = (_json['protoValue'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      protoValue =
+          (_json['protoValue'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('stringValue')) {
       stringValue = _json['stringValue'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (doubleValue != null) 'doubleValue': doubleValue!,
         if (int64Value != null) 'int64Value': int64Value!,
         if (protoValue != null) 'protoValue': protoValue!,
@@ -5317,7 +5315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseEntitlement != null) 'baseEntitlement': baseEntitlement!,
       };
 }
@@ -5354,7 +5352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (renewalSettings != null)
           'renewalSettings': renewalSettings!.toJson(),
@@ -5386,7 +5384,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customer != null) 'customer': customer!,
         if (eventType != null) 'eventType': eventType!,
       };
@@ -5572,7 +5570,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedUnits != null) 'assignedUnits': assignedUnits!,
         if (associationInfo != null)
           'associationInfo': associationInfo!.toJson(),
@@ -5635,7 +5633,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entitlement != null) 'entitlement': entitlement!,
         if (eventType != null) 'eventType': eventType!,
       };
@@ -5682,7 +5680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationType != null) 'operationType': operationType!,
       };
 }
@@ -5718,7 +5716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (editable != null) 'editable': editable!,
         if (name != null) 'name': name!,
         if (value != null) 'value': value!.toJson(),
@@ -5749,7 +5747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (periodType != null) 'periodType': periodType!,
       };
@@ -5789,7 +5787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (productId != null) 'productId': productId!,
         if (provisioningId != null) 'provisioningId': provisioningId!,
         if (skuId != null) 'skuId': skuId!,
@@ -5859,7 +5857,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableCommitment != null) 'disableCommitment': disableCommitment!,
         if (enableRenewal != null) 'enableRenewal': enableRenewal!,
         if (paymentCycle != null) 'paymentCycle': paymentCycle!.toJson(),
@@ -5891,7 +5889,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerEvent != null) 'customerEvent': customerEvent!.toJson(),
         if (entitlementEvent != null)
           'entitlementEvent': entitlementEvent!.toJson(),
@@ -5918,7 +5916,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entitlements != null)
           'entitlements': entitlements!.map((value) => value.toJson()).toList(),
       };
@@ -5949,7 +5947,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (trial != null) 'trial': trial!,
       };
@@ -5982,21 +5980,20 @@
       int64Value = _json['int64Value'] as core.String;
     }
     if (_json.containsKey('protoValue')) {
-      protoValue = (_json['protoValue'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      protoValue =
+          (_json['protoValue'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('stringValue')) {
       stringValue = _json['stringValue'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (doubleValue != null) 'doubleValue': doubleValue!,
         if (int64Value != null) 'int64Value': int64Value!,
         if (protoValue != null) 'protoValue': protoValue!,
@@ -6012,7 +6009,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Operations.ListOperations.
@@ -6038,7 +6035,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -6099,29 +6096,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -6144,7 +6139,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -6180,8 +6175,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -6194,7 +6189,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -6234,7 +6229,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -6404,7 +6399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressLines != null) 'addressLines': addressLines!,
         if (administrativeArea != null)
           'administrativeArea': administrativeArea!,
diff --git a/generated/googleapis/lib/clouddebugger/v2.dart b/generated/googleapis/lib/clouddebugger/v2.dart
index a1f3679..ba01ab5 100644
--- a/generated/googleapis/lib/clouddebugger/v2.dart
+++ b/generated/googleapis/lib/clouddebugger/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -585,7 +584,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
       };
@@ -752,13 +751,12 @@
       isFinalState = _json['isFinalState'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('location')) {
       location = SourceLocation.fromJson(
@@ -794,7 +792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (canaryExpireTime != null) 'canaryExpireTime': canaryExpireTime!,
         if (condition != null) 'condition': condition!,
@@ -855,7 +853,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliasContext != null) 'aliasContext': aliasContext!.toJson(),
         if (aliasName != null) 'aliasName': aliasName!,
         if (repoId != null) 'repoId': repoId!.toJson(),
@@ -889,7 +887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (repoId != null) 'repoId': repoId!.toJson(),
       };
@@ -917,7 +915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (snapshotId != null) 'snapshotId': snapshotId!,
         if (workspaceId != null) 'workspaceId': workspaceId!.toJson(),
       };
@@ -1031,13 +1029,12 @@
       isInactive = _json['isInactive'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('project')) {
       project = _json['project'] as core.String;
@@ -1057,7 +1054,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentVersion != null) 'agentVersion': agentVersion!,
         if (canaryMode != null) 'canaryMode': canaryMode!,
         if (description != null) 'description': description!,
@@ -1091,7 +1088,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An ExtendedSourceContext is a SourceContext combined with additional details
@@ -1111,17 +1108,16 @@
           _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (labels != null) 'labels': labels!,
       };
@@ -1153,7 +1149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (format != null) 'format': format!,
         if (parameters != null) 'parameters': parameters!,
       };
@@ -1200,7 +1196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliasContext != null) 'aliasContext': aliasContext!.toJson(),
         if (aliasName != null) 'aliasName': aliasName!,
         if (gerritProject != null) 'gerritProject': gerritProject!,
@@ -1225,7 +1221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (breakpoint != null) 'breakpoint': breakpoint!.toJson(),
       };
 }
@@ -1252,7 +1248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (revisionId != null) 'revisionId': revisionId!,
         if (url != null) 'url': url!,
       };
@@ -1293,7 +1289,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (breakpoints != null)
           'breakpoints': breakpoints!.map((value) => value.toJson()).toList(),
         if (nextWaitToken != null) 'nextWaitToken': nextWaitToken!,
@@ -1329,7 +1325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (breakpoints != null)
           'breakpoints': breakpoints!.map((value) => value.toJson()).toList(),
         if (nextWaitToken != null) 'nextWaitToken': nextWaitToken!,
@@ -1356,7 +1352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debuggees != null)
           'debuggees': debuggees!.map((value) => value.toJson()).toList(),
       };
@@ -1384,7 +1380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectId != null) 'projectId': projectId!,
         if (repoName != null) 'repoName': repoName!,
       };
@@ -1409,7 +1405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debuggee != null) 'debuggee': debuggee!.toJson(),
       };
 }
@@ -1441,7 +1437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentId != null) 'agentId': agentId!,
         if (debuggee != null) 'debuggee': debuggee!.toJson(),
       };
@@ -1467,7 +1463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectRepoId != null) 'projectRepoId': projectRepoId!.toJson(),
         if (uid != null) 'uid': uid!,
       };
@@ -1489,7 +1485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (breakpoint != null) 'breakpoint': breakpoint!.toJson(),
       };
 }
@@ -1532,7 +1528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudRepo != null) 'cloudRepo': cloudRepo!.toJson(),
         if (cloudWorkspace != null) 'cloudWorkspace': cloudWorkspace!.toJson(),
         if (gerrit != null) 'gerrit': gerrit!.toJson(),
@@ -1570,7 +1566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (column != null) 'column': column!,
         if (line != null) 'line': line!,
         if (path != null) 'path': path!,
@@ -1619,7 +1615,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arguments != null)
           'arguments': arguments!.map((value) => value.toJson()).toList(),
         if (function != null) 'function': function!,
@@ -1675,7 +1671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!.toJson(),
         if (isError != null) 'isError': isError!,
         if (refersTo != null) 'refersTo': refersTo!,
@@ -1701,7 +1697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (breakpoint != null) 'breakpoint': breakpoint!.toJson(),
       };
 }
@@ -1716,7 +1712,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a variable or an argument possibly of a compound object type.
@@ -1818,7 +1814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (members != null)
           'members': members!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
diff --git a/generated/googleapis/lib/cloudfunctions/v1.dart b/generated/googleapis/lib/cloudfunctions/v1.dart
index 11b131c..b5d7315 100644
--- a/generated/googleapis/lib/cloudfunctions/v1.dart
+++ b/generated/googleapis/lib/cloudfunctions/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -810,7 +809,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -852,7 +851,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -924,7 +923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -946,7 +945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
       };
 }
@@ -981,7 +980,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!,
         if (executionId != null) 'executionId': executionId!,
         if (result != null) 'result': result!,
@@ -1176,15 +1175,14 @@
       availableMemoryMb = _json['availableMemoryMb'] as core.int;
     }
     if (_json.containsKey('buildEnvironmentVariables')) {
-      buildEnvironmentVariables =
-          (_json['buildEnvironmentVariables'] as core.Map)
-              .cast<core.String, core.String>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      buildEnvironmentVariables = (_json['buildEnvironmentVariables']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('buildId')) {
       buildId = _json['buildId'] as core.String;
@@ -1199,14 +1197,14 @@
       entryPoint = _json['entryPoint'] as core.String;
     }
     if (_json.containsKey('environmentVariables')) {
-      environmentVariables = (_json['environmentVariables'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      environmentVariables =
+          (_json['environmentVariables'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('eventTrigger')) {
       eventTrigger = EventTrigger.fromJson(
@@ -1220,13 +1218,12 @@
       ingressSettings = _json['ingressSettings'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('maxInstances')) {
       maxInstances = _json['maxInstances'] as core.int;
@@ -1277,7 +1274,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableMemoryMb != null) 'availableMemoryMb': availableMemoryMb!,
         if (buildEnvironmentVariables != null)
           'buildEnvironmentVariables': buildEnvironmentVariables!,
@@ -1373,7 +1370,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventType != null) 'eventType': eventType!,
         if (failurePolicy != null) 'failurePolicy': failurePolicy!.toJson(),
         if (resource != null) 'resource': resource!,
@@ -1442,7 +1439,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1466,7 +1463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (retry != null) 'retry': retry!.toJson(),
       };
 }
@@ -1486,7 +1483,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (versionId != null) 'versionId': versionId!,
       };
 }
@@ -1505,7 +1502,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (downloadUrl != null) 'downloadUrl': downloadUrl!,
       };
 }
@@ -1518,7 +1515,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response of `GenerateSourceUploadUrl` method.
@@ -1537,7 +1534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uploadUrl != null) 'uploadUrl': uploadUrl!,
       };
 }
@@ -1571,7 +1568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (securityLevel != null) 'securityLevel': securityLevel!,
         if (url != null) 'url': url!,
       };
@@ -1611,7 +1608,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (functions != null)
           'functions': functions!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1641,7 +1638,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1670,7 +1667,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1714,32 +1711,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1802,29 +1797,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1879,13 +1872,12 @@
       buildId = _json['buildId'] as core.String;
     }
     if (_json.containsKey('request')) {
-      request =
-          (_json['request'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      request = (_json['request'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sourceToken')) {
       sourceToken = _json['sourceToken'] as core.String;
@@ -1904,7 +1896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buildId != null) 'buildId': buildId!,
         if (request != null) 'request': request!,
         if (sourceToken != null) 'sourceToken': sourceToken!,
@@ -2019,7 +2011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -2041,7 +2033,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for `SetIamPolicy` method.
@@ -2071,7 +2063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -2113,7 +2105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployedUrl != null) 'deployedUrl': deployedUrl!,
         if (url != null) 'url': url!,
       };
@@ -2152,8 +2144,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2166,7 +2158,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2192,7 +2184,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2213,7 +2205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
diff --git a/generated/googleapis/lib/cloudidentity/v1.dart b/generated/googleapis/lib/cloudidentity/v1.dart
index c1000b3..16263d9 100644
--- a/generated/googleapis/lib/cloudidentity/v1.dart
+++ b/generated/googleapis/lib/cloudidentity/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1979,7 +1978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hasMembership != null) 'hasMembership': hasMembership!,
       };
 }
@@ -2012,7 +2011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queries != null)
           'queries': queries!.map((value) => value.toJson()).toList(),
         if (status != null) 'status': status!.toJson(),
@@ -2047,7 +2046,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (query != null) 'query': query!,
         if (resourceType != null) 'resourceType': resourceType!,
       };
@@ -2082,7 +2081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!,
         if (statusTime != null) 'statusTime': statusTime!,
       };
@@ -2122,7 +2121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (namespace != null) 'namespace': namespace!,
       };
@@ -2141,7 +2140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expireTime != null) 'expireTime': expireTime!,
       };
 }
@@ -2175,7 +2174,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adjacencyList != null)
           'adjacencyList':
               adjacencyList!.map((value) => value.toJson()).toList(),
@@ -2228,7 +2227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabledUnknownSources != null)
           'enabledUnknownSources': enabledUnknownSources!,
         if (ownerProfileAccount != null)
@@ -2262,7 +2261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customer != null) 'customer': customer!,
       };
 }
@@ -2282,7 +2281,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceUser != null) 'deviceUser': deviceUser!.toJson(),
       };
 }
@@ -2309,7 +2308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customer != null) 'customer': customer!,
       };
 }
@@ -2329,7 +2328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceUser != null) 'deviceUser': deviceUser!.toJson(),
       };
 }
@@ -2356,7 +2355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customer != null) 'customer': customer!,
       };
 }
@@ -2378,7 +2377,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (device != null) 'device': device!.toJson(),
       };
 }
@@ -2405,7 +2404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customer != null) 'customer': customer!,
       };
 }
@@ -2425,7 +2424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceUser != null) 'deviceUser': deviceUser!.toJson(),
       };
 }
@@ -2553,15 +2552,14 @@
       healthScore = _json['healthScore'] as core.String;
     }
     if (_json.containsKey('keyValuePairs')) {
-      keyValuePairs = (_json['keyValuePairs'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleAppsCloudidentityDevicesV1CustomAttributeValue.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      keyValuePairs =
+          (_json['keyValuePairs'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleAppsCloudidentityDevicesV1CustomAttributeValue.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('lastUpdateTime')) {
       lastUpdateTime = _json['lastUpdateTime'] as core.String;
@@ -2580,7 +2578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assetTags != null) 'assetTags': assetTags!,
         if (complianceState != null) 'complianceState': complianceState!,
         if (createTime != null) 'createTime': createTime!,
@@ -2624,7 +2622,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (numberValue != null) 'numberValue': numberValue!,
         if (stringValue != null) 'stringValue': stringValue!,
@@ -2921,7 +2919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidSpecificAttributes != null)
           'androidSpecificAttributes': androidSpecificAttributes!.toJson(),
         if (assetTag != null) 'assetTag': assetTag!,
@@ -3058,7 +3056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compromisedState != null) 'compromisedState': compromisedState!,
         if (createTime != null) 'createTime': createTime!,
         if (firstSyncTime != null) 'firstSyncTime': firstSyncTime!,
@@ -3098,7 +3096,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientStates != null)
           'clientStates': clientStates!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3131,7 +3129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceUsers != null)
           'deviceUsers': deviceUsers!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3163,7 +3161,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3206,7 +3204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customer != null) 'customer': customer!,
         if (names != null) 'names': names!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3234,7 +3232,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customer != null) 'customer': customer!,
       };
 }
@@ -3255,7 +3253,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (device != null) 'device': device!.toJson(),
       };
 }
@@ -3282,7 +3280,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customer != null) 'customer': customer!,
       };
 }
@@ -3302,7 +3300,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceUser != null) 'deviceUser': deviceUser!.toJson(),
       };
 }
@@ -3396,13 +3394,12 @@
           _json['groupKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3415,7 +3412,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -3475,13 +3472,12 @@
           _json['groupKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('relationType')) {
       relationType = _json['relationType'] as core.String;
@@ -3495,7 +3491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (group != null) 'group': group!,
         if (groupKey != null) 'groupKey': groupKey!.toJson(),
@@ -3531,7 +3527,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groups != null)
           'groups': groups!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3561,7 +3557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (memberships != null)
           'memberships': memberships!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3582,7 +3578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -3603,7 +3599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -3658,7 +3654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (member != null) 'member': member!,
         if (preferredMemberKey != null)
           'preferredMemberKey':
@@ -3742,7 +3738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (name != null) 'name': name!,
         if (preferredMemberKey != null)
@@ -3781,7 +3777,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (edges != null)
           'edges': edges!.map((value) => value.toJson()).toList(),
         if (group != null) 'group': group!,
@@ -3815,7 +3811,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expiryDetail != null) 'expiryDetail': expiryDetail!.toJson(),
         if (name != null) 'name': name!,
       };
@@ -3867,7 +3863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addRoles != null)
           'addRoles': addRoles!.map((value) => value.toJson()).toList(),
         if (removeRoles != null) 'removeRoles': removeRoles!,
@@ -3891,7 +3887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (membership != null) 'membership': membership!.toJson(),
       };
 }
@@ -3950,29 +3946,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4004,7 +3998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groups != null)
           'groups': groups!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4034,7 +4028,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (memberships != null)
           'memberships': memberships!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4064,7 +4058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (memberships != null)
           'memberships': memberships!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4104,8 +4098,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4118,7 +4112,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4141,7 +4135,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (role != null) 'role': role!,
       };
 }
@@ -4170,7 +4164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldMask != null) 'fieldMask': fieldMask!,
         if (membershipRole != null) 'membershipRole': membershipRole!.toJson(),
       };
@@ -4223,7 +4217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mailsSentCount != null) 'mailsSentCount': mailsSentCount!,
         if (name != null) 'name': name!,
         if (state != null) 'state': state!,
diff --git a/generated/googleapis/lib/cloudiot/v1.dart b/generated/googleapis/lib/cloudiot/v1.dart
index cb418bb..9c9bece 100644
--- a/generated/googleapis/lib/cloudiot/v1.dart
+++ b/generated/googleapis/lib/cloudiot/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1365,7 +1364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (gatewayId != null) 'gatewayId': gatewayId!,
       };
@@ -1379,7 +1378,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Associates `members` with a `role`.
@@ -1448,7 +1447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1641,13 +1640,12 @@
       logLevel = _json['logLevel'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1661,7 +1659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blocked != null) 'blocked': blocked!,
         if (config != null) 'config': config!.toJson(),
         if (credentials != null)
@@ -1748,7 +1746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (binaryData != null) 'binaryData': binaryData!,
         if (cloudUpdateTime != null) 'cloudUpdateTime': cloudUpdateTime!,
         if (deviceAckTime != null) 'deviceAckTime': deviceAckTime!,
@@ -1791,7 +1789,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expirationTime != null) 'expirationTime': expirationTime!,
         if (publicKey != null) 'publicKey': publicKey!.toJson(),
       };
@@ -1906,7 +1904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (credentials != null)
           'credentials': credentials!.map((value) => value.toJson()).toList(),
         if (eventNotificationConfigs != null)
@@ -1950,7 +1948,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (binaryData != null) 'binaryData': binaryData!,
         if (updateTime != null) 'updateTime': updateTime!,
       };
@@ -1970,7 +1968,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The configuration for forwarding telemetry events.
@@ -1999,7 +1997,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pubsubTopicName != null) 'pubsubTopicName': pubsubTopicName!,
         if (subfolderMatches != null) 'subfolderMatches': subfolderMatches!,
       };
@@ -2066,7 +2064,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2126,7 +2124,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gatewayAuthMethod != null) 'gatewayAuthMethod': gatewayAuthMethod!,
         if (gatewayType != null) 'gatewayType': gatewayType!,
         if (lastAccessedGatewayId != null)
@@ -2151,7 +2149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -2178,7 +2176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -2205,7 +2203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpEnabledState != null) 'httpEnabledState': httpEnabledState!,
       };
 }
@@ -2229,7 +2227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceConfigs != null)
           'deviceConfigs':
               deviceConfigs!.map((value) => value.toJson()).toList(),
@@ -2260,7 +2258,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceRegistries != null)
           'deviceRegistries':
               deviceRegistries!.map((value) => value.toJson()).toList(),
@@ -2287,7 +2285,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceStates != null)
           'deviceStates': deviceStates!.map((value) => value.toJson()).toList(),
       };
@@ -2316,7 +2314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2357,7 +2355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (binaryData != null) 'binaryData': binaryData!,
         if (versionToUpdate != null) 'versionToUpdate': versionToUpdate!,
       };
@@ -2383,7 +2381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mqttEnabledState != null) 'mqttEnabledState': mqttEnabledState!,
       };
 }
@@ -2483,7 +2481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -2527,7 +2525,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificate != null) 'certificate': certificate!,
         if (format != null) 'format': format!,
         if (x509Details != null) 'x509Details': x509Details!.toJson(),
@@ -2574,7 +2572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (format != null) 'format': format!,
         if (key != null) 'key': key!,
       };
@@ -2594,7 +2592,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publicKeyCertificate != null)
           'publicKeyCertificate': publicKeyCertificate!.toJson(),
       };
@@ -2634,7 +2632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (binaryData != null) 'binaryData': binaryData!,
         if (subfolder != null) 'subfolder': subfolder!,
       };
@@ -2648,7 +2646,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for `SetIamPolicy` method.
@@ -2669,7 +2667,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -2689,7 +2687,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pubsubTopicName != null) 'pubsubTopicName': pubsubTopicName!,
       };
 }
@@ -2727,8 +2725,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2741,7 +2739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2767,7 +2765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2788,7 +2786,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2820,7 +2818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (gatewayId != null) 'gatewayId': gatewayId!,
       };
@@ -2834,7 +2832,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Details of an X.509 certificate.
@@ -2882,7 +2880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expiryTime != null) 'expiryTime': expiryTime!,
         if (issuer != null) 'issuer': issuer!,
         if (publicKeyType != null) 'publicKeyType': publicKeyType!,
diff --git a/generated/googleapis/lib/cloudkms/v1.dart b/generated/googleapis/lib/cloudkms/v1.dart
index 3d43235..1bda29b 100644
--- a/generated/googleapis/lib/cloudkms/v1.dart
+++ b/generated/googleapis/lib/cloudkms/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1849,7 +1848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ciphertext != null) 'ciphertext': ciphertext!,
         if (ciphertextCrc32c != null) 'ciphertextCrc32c': ciphertextCrc32c!,
       };
@@ -1918,7 +1917,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (plaintext != null) 'plaintext': plaintext!,
         if (plaintextCrc32c != null) 'plaintextCrc32c': plaintextCrc32c!,
         if (protectionLevel != null) 'protectionLevel': protectionLevel!,
@@ -1967,7 +1966,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digest != null) 'digest': digest!.toJson(),
         if (digestCrc32c != null) 'digestCrc32c': digestCrc32c!,
       };
@@ -2045,7 +2044,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (protectionLevel != null) 'protectionLevel': protectionLevel!,
         if (signature != null) 'signature': signature!,
@@ -2096,7 +2095,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -2138,7 +2137,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -2210,7 +2209,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -2251,7 +2250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caviumCerts != null) 'caviumCerts': caviumCerts!,
         if (googleCardCerts != null) 'googleCardCerts': googleCardCerts!,
         if (googlePartitionCerts != null)
@@ -2336,13 +2335,12 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2366,7 +2364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (labels != null) 'labels': labels!,
         if (name != null) 'name': name!,
@@ -2571,7 +2569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (attestation != null) 'attestation': attestation!.toJson(),
         if (createTime != null) 'createTime': createTime!,
@@ -2658,7 +2656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (protectionLevel != null) 'protectionLevel': protectionLevel!,
       };
@@ -2747,7 +2745,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalAuthenticatedData != null)
           'additionalAuthenticatedData': additionalAuthenticatedData!,
         if (additionalAuthenticatedDataCrc32c != null)
@@ -2813,7 +2811,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (plaintext != null) 'plaintext': plaintext!,
         if (plaintextCrc32c != null) 'plaintextCrc32c': plaintextCrc32c!,
         if (protectionLevel != null) 'protectionLevel': protectionLevel!,
@@ -2829,7 +2827,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A Digest holds a cryptographic message digest.
@@ -2875,7 +2873,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sha256 != null) 'sha256': sha256!,
         if (sha384 != null) 'sha384': sha384!,
         if (sha512 != null) 'sha512': sha512!,
@@ -2974,7 +2972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalAuthenticatedData != null)
           'additionalAuthenticatedData': additionalAuthenticatedData!,
         if (additionalAuthenticatedDataCrc32c != null)
@@ -3074,7 +3072,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ciphertext != null) 'ciphertext': ciphertext!,
         if (ciphertextCrc32c != null) 'ciphertextCrc32c': ciphertextCrc32c!,
         if (name != null) 'name': name!,
@@ -3148,7 +3146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -3171,7 +3169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (externalKeyUri != null) 'externalKeyUri': externalKeyUri!,
       };
 }
@@ -3259,7 +3257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (importJob != null) 'importJob': importJob!,
         if (rsaAesWrappedKey != null) 'rsaAesWrappedKey': rsaAesWrappedKey!,
@@ -3415,7 +3413,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attestation != null) 'attestation': attestation!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (expireEventTime != null) 'expireEventTime': expireEventTime!,
@@ -3478,7 +3476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certChains != null) 'certChains': certChains!.toJson(),
         if (content != null) 'content': content!,
         if (format != null) 'format': format!,
@@ -3509,7 +3507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (name != null) 'name': name!,
       };
@@ -3546,7 +3544,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cryptoKeyVersions != null)
           'cryptoKeyVersions':
               cryptoKeyVersions!.map((value) => value.toJson()).toList(),
@@ -3586,7 +3584,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cryptoKeys != null)
           'cryptoKeys': cryptoKeys!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3625,7 +3623,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (importJobs != null)
           'importJobs': importJobs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3664,7 +3662,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyRings != null)
           'keyRings': keyRings!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3694,7 +3692,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3738,32 +3736,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -3793,7 +3789,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ekmAvailable != null) 'ekmAvailable': ekmAvailable!,
         if (hsmAvailable != null) 'hsmAvailable': hsmAvailable!,
       };
@@ -3903,7 +3899,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -4009,7 +4005,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (name != null) 'name': name!,
         if (pem != null) 'pem': pem!,
@@ -4026,7 +4022,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for `SetIamPolicy` method.
@@ -4056,7 +4052,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -4081,7 +4077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4102,7 +4098,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4122,7 +4118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cryptoKeyVersionId != null)
           'cryptoKeyVersionId': cryptoKeyVersionId!,
       };
@@ -4150,7 +4146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pem != null) 'pem': pem!,
       };
 }
diff --git a/generated/googleapis/lib/cloudprofiler/v2.dart b/generated/googleapis/lib/cloudprofiler/v2.dart
index f849906..41245f6 100644
--- a/generated/googleapis/lib/cloudprofiler/v2.dart
+++ b/generated/googleapis/lib/cloudprofiler/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -250,7 +249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployment != null) 'deployment': deployment!.toJson(),
         if (profileType != null) 'profileType': profileType!,
       };
@@ -288,13 +287,12 @@
 
   Deployment.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
@@ -304,7 +302,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (projectId != null) 'projectId': projectId!,
         if (target != null) 'target': target!,
@@ -382,13 +380,12 @@
       duration = _json['duration'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -401,7 +398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployment != null) 'deployment': deployment!.toJson(),
         if (duration != null) 'duration': duration!,
         if (labels != null) 'labels': labels!,
diff --git a/generated/googleapis/lib/cloudresourcemanager/v1.dart b/generated/googleapis/lib/cloudresourcemanager/v1.dart
index 54cc9d0..92a3726 100644
--- a/generated/googleapis/lib/cloudresourcemanager/v1.dart
+++ b/generated/googleapis/lib/cloudresourcemanager/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1881,7 +1880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceId != null) 'resourceId': resourceId!.toJson(),
       };
 }
@@ -1927,7 +1926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1969,7 +1968,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -2041,7 +2040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -2060,7 +2059,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Used in `policy_type` to specify how `boolean_policy` will behave at this
@@ -2102,7 +2101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enforced != null) 'enforced': enforced!,
       };
 }
@@ -2134,7 +2133,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (constraint != null) 'constraint': constraint!,
         if (etag != null) 'etag': etag!,
       };
@@ -2179,7 +2178,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationParent != null) 'destinationParent': destinationParent!,
         if (displayName != null) 'displayName': displayName!,
         if (operationType != null) 'operationType': operationType!,
@@ -2226,7 +2225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationParent != null) 'destinationParent': destinationParent!,
         if (displayName != null) 'displayName': displayName!,
         if (operationType != null) 'operationType': operationType!,
@@ -2315,7 +2314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (booleanConstraint != null)
           'booleanConstraint': booleanConstraint!.toJson(),
         if (constraintDefault != null) 'constraintDefault': constraintDefault!,
@@ -2335,7 +2334,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for creating a TagValue.
@@ -2346,7 +2345,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for deleting a TagKey.
@@ -2357,7 +2356,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for deleting a TagValue.
@@ -2368,7 +2367,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -2385,7 +2384,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -2449,7 +2448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2495,7 +2494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationParent != null) 'destinationParent': destinationParent!,
         if (displayName != null) 'displayName': displayName!,
         if (operationType != null) 'operationType': operationType!,
@@ -2537,7 +2536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessageId != null) 'errorMessageId': errorMessageId!,
       };
 }
@@ -2550,7 +2549,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response from the projects.getAncestry method.
@@ -2572,7 +2571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ancestor != null)
           'ancestor': ancestor!.map((value) => value.toJson()).toList(),
       };
@@ -2591,7 +2590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (constraint != null) 'constraint': constraint!,
       };
 }
@@ -2611,7 +2610,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -2629,7 +2628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (constraint != null) 'constraint': constraint!,
       };
 }
@@ -2656,7 +2655,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -2724,7 +2723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (name != null) 'name': name!,
         if (origin != null) 'origin': origin!,
@@ -2760,7 +2759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
       };
@@ -2794,7 +2793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (constraints != null)
           'constraints': constraints!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2828,7 +2827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestedValue != null) 'suggestedValue': suggestedValue!,
         if (supportsUnder != null) 'supportsUnder': supportsUnder!,
       };
@@ -2857,7 +2856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (liens != null)
           'liens': liens!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2889,7 +2888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
       };
@@ -2924,7 +2923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (policies != null)
           'policies': policies!.map((value) => value.toJson()).toList(),
@@ -3064,7 +3063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allValues != null) 'allValues': allValues!,
         if (allowedValues != null) 'allowedValues': allowedValues!,
         if (deniedValues != null) 'deniedValues': deniedValues!,
@@ -3108,7 +3107,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (projects != null)
           'projects': projects!.map((value) => value.toJson()).toList(),
@@ -3169,29 +3168,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -3282,7 +3279,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (booleanPolicy != null) 'booleanPolicy': booleanPolicy!.toJson(),
         if (constraint != null) 'constraint': constraint!,
         if (etag != null) 'etag': etag!,
@@ -3355,7 +3352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (displayName != null) 'displayName': displayName!,
         if (lifecycleState != null) 'lifecycleState': lifecycleState!,
@@ -3381,7 +3378,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directoryCustomerId != null)
           'directoryCustomerId': directoryCustomerId!,
       };
@@ -3491,7 +3488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -3571,13 +3568,12 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lifecycleState')) {
       lifecycleState = _json['lifecycleState'] as core.String;
@@ -3597,7 +3593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (labels != null) 'labels': labels!,
         if (lifecycleState != null) 'lifecycleState': lifecycleState!,
@@ -3640,7 +3636,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (gettable != null) 'gettable': gettable!,
         if (ready != null) 'ready': ready!,
@@ -3675,7 +3671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (type != null) 'type': type!,
       };
@@ -3700,7 +3696,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The request sent to the `SearchOrganizations` method.
@@ -3741,7 +3737,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
@@ -3776,7 +3772,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (organizations != null)
           'organizations':
@@ -3811,7 +3807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -3831,7 +3827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -3869,8 +3865,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3883,7 +3879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -3909,7 +3905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3930,7 +3926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3943,7 +3939,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for updating a TagKey.
@@ -3954,7 +3950,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for updating a TagValue.
@@ -3965,5 +3961,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis/lib/cloudresourcemanager/v2.dart b/generated/googleapis/lib/cloudresourcemanager/v2.dart
index f02be1d..c300e5b 100644
--- a/generated/googleapis/lib/cloudresourcemanager/v2.dart
+++ b/generated/googleapis/lib/cloudresourcemanager/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -704,7 +703,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -746,7 +745,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -818,7 +817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -864,7 +863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationParent != null) 'destinationParent': destinationParent!,
         if (displayName != null) 'displayName': displayName!,
         if (operationType != null) 'operationType': operationType!,
@@ -911,7 +910,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationParent != null) 'destinationParent': destinationParent!,
         if (displayName != null) 'displayName': displayName!,
         if (operationType != null) 'operationType': operationType!,
@@ -927,7 +926,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for creating a TagValue.
@@ -938,7 +937,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for deleting a TagKey.
@@ -949,7 +948,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for deleting a TagValue.
@@ -960,7 +959,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -1024,7 +1023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1099,7 +1098,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (displayName != null) 'displayName': displayName!,
         if (lifecycleState != null) 'lifecycleState': lifecycleState!,
@@ -1146,7 +1145,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationParent != null) 'destinationParent': destinationParent!,
         if (displayName != null) 'displayName': displayName!,
         if (operationType != null) 'operationType': operationType!,
@@ -1188,7 +1187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessageId != null) 'errorMessageId': errorMessageId!,
       };
 }
@@ -1208,7 +1207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -1235,7 +1234,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -1265,7 +1264,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folders != null)
           'folders': folders!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1290,7 +1289,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationParent != null) 'destinationParent': destinationParent!,
       };
 }
@@ -1349,29 +1348,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1484,7 +1481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -1526,7 +1523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (gettable != null) 'gettable': gettable!,
         if (ready != null) 'ready': ready!,
@@ -1578,7 +1575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
         if (query != null) 'query': query!,
@@ -1610,7 +1607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folders != null)
           'folders': folders!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1644,7 +1641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -1683,8 +1680,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1697,7 +1694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1723,7 +1720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1744,7 +1741,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1757,7 +1754,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for updating a TagKey.
@@ -1768,7 +1765,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for updating a TagValue.
@@ -1779,5 +1776,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis/lib/cloudresourcemanager/v3.dart b/generated/googleapis/lib/cloudresourcemanager/v3.dart
index e088b01..6ad2345 100644
--- a/generated/googleapis/lib/cloudresourcemanager/v3.dart
+++ b/generated/googleapis/lib/cloudresourcemanager/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1245,7 +1244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1287,7 +1286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1359,7 +1358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1405,7 +1404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationParent != null) 'destinationParent': destinationParent!,
         if (displayName != null) 'displayName': displayName!,
         if (operationType != null) 'operationType': operationType!,
@@ -1452,7 +1451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationParent != null) 'destinationParent': destinationParent!,
         if (displayName != null) 'displayName': displayName!,
         if (operationType != null) 'operationType': operationType!,
@@ -1468,7 +1467,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for creating a TagValue.
@@ -1479,7 +1478,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for deleting a TagKey.
@@ -1490,7 +1489,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for deleting a TagValue.
@@ -1501,7 +1500,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -1518,7 +1517,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -1582,7 +1581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1628,7 +1627,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationParent != null) 'destinationParent': destinationParent!,
         if (displayName != null) 'displayName': displayName!,
         if (operationType != null) 'operationType': operationType!,
@@ -1670,7 +1669,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessageId != null) 'errorMessageId': errorMessageId!,
       };
 }
@@ -1690,7 +1689,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -1717,7 +1716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -1785,7 +1784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (name != null) 'name': name!,
         if (origin != null) 'origin': origin!,
@@ -1818,7 +1817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (liens != null)
           'liens': liens!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1852,7 +1851,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tagBindings != null)
           'tagBindings': tagBindings!.map((value) => value.toJson()).toList(),
@@ -1885,7 +1884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tagKeys != null)
           'tagKeys': tagKeys!.map((value) => value.toJson()).toList(),
@@ -1919,7 +1918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tagValues != null)
           'tagValues': tagValues!.map((value) => value.toJson()).toList(),
@@ -1980,29 +1979,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2115,7 +2112,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -2157,7 +2154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (gettable != null) 'gettable': gettable!,
         if (ready != null) 'ready': ready!,
@@ -2191,7 +2188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -2230,8 +2227,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2244,7 +2241,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2290,7 +2287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (parent != null) 'parent': parent!,
         if (tagValue != null) 'tagValue': tagValue!,
@@ -2383,7 +2380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (etag != null) 'etag': etag!,
@@ -2484,7 +2481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (etag != null) 'etag': etag!,
@@ -2515,7 +2512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2536,7 +2533,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2549,7 +2546,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime operation information for updating a TagValue.
@@ -2560,5 +2557,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis/lib/cloudscheduler/v1.dart b/generated/googleapis/lib/cloudscheduler/v1.dart
index 4ba94a8..8421cea 100644
--- a/generated/googleapis/lib/cloudscheduler/v1.dart
+++ b/generated/googleapis/lib/cloudscheduler/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -618,13 +617,12 @@
       body = _json['body'] as core.String;
     }
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('httpMethod')) {
       httpMethod = _json['httpMethod'] as core.String;
@@ -634,7 +632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appEngineRouting != null)
           'appEngineRouting': appEngineRouting!.toJson(),
         if (body != null) 'body': body!,
@@ -722,7 +720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (instance != null) 'instance': instance!,
         if (service != null) 'service': service!,
@@ -744,7 +742,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Http target.
@@ -831,13 +829,12 @@
       body = _json['body'] as core.String;
     }
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('httpMethod')) {
       httpMethod = _json['httpMethod'] as core.String;
@@ -855,7 +852,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!,
         if (headers != null) 'headers': headers!,
         if (httpMethod != null) 'httpMethod': httpMethod!,
@@ -1029,7 +1026,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appEngineHttpTarget != null)
           'appEngineHttpTarget': appEngineHttpTarget!.toJson(),
         if (attemptDeadline != null) 'attemptDeadline': attemptDeadline!,
@@ -1075,7 +1072,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -1103,7 +1100,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1147,32 +1144,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1211,7 +1206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (scope != null) 'scope': scope!,
         if (serviceAccountEmail != null)
           'serviceAccountEmail': serviceAccountEmail!,
@@ -1247,7 +1242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audience != null) 'audience': audience!,
         if (serviceAccountEmail != null)
           'serviceAccountEmail': serviceAccountEmail!,
@@ -1262,7 +1257,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A message that is published by publishers and consumed by subscribers.
@@ -1319,14 +1314,13 @@
 
   PubsubMessage.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = (_json['attributes'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      attributes =
+          (_json['attributes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('data')) {
       data = _json['data'] as core.String;
@@ -1342,7 +1336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!,
         if (data != null) 'data': data!,
         if (messageId != null) 'messageId': messageId!,
@@ -1389,14 +1383,13 @@
 
   PubsubTarget.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = (_json['attributes'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      attributes =
+          (_json['attributes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('data')) {
       data = _json['data'] as core.String;
@@ -1406,7 +1399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!,
         if (data != null) 'data': data!,
         if (topicName != null) 'topicName': topicName!,
@@ -1421,7 +1414,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Settings that determine the retry behavior.
@@ -1494,7 +1487,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxBackoffDuration != null)
           'maxBackoffDuration': maxBackoffDuration!,
         if (maxDoublings != null) 'maxDoublings': maxDoublings!,
@@ -1513,7 +1506,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -1549,8 +1542,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1563,7 +1556,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/cloudsearch/v1.dart b/generated/googleapis/lib/cloudsearch/v1.dart
index a2106ac..df4583a 100644
--- a/generated/googleapis/lib/cloudsearch/v1.dart
+++ b/generated/googleapis/lib/cloudsearch/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2631,7 +2630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorName != null) 'operatorName': operatorName!,
       };
 }
@@ -2650,7 +2649,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorOptions != null)
           'operatorOptions': operatorOptions!.toJson(),
       };
@@ -2670,7 +2669,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hasAccess != null) 'hasAccess': hasAccess!,
       };
 }
@@ -2700,7 +2699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logicOperator != null) 'logicOperator': logicOperator!,
         if (subFilters != null)
           'subFilters': subFilters!.map((value) => value.toJson()).toList(),
@@ -2730,7 +2729,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (itemCountByStatus != null)
           'itemCountByStatus':
@@ -2760,7 +2759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (queryCountByStatus != null)
           'queryCountByStatus':
@@ -2789,7 +2788,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (searchSessionsCount != null)
           'searchSessionsCount': searchSessionsCount!,
@@ -2831,7 +2830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (oneDayActiveUsersCount != null)
           'oneDayActiveUsersCount': oneDayActiveUsersCount!,
@@ -2931,7 +2930,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableModifications != null)
           'disableModifications': disableModifications!,
         if (disableServing != null) 'disableServing': disableServing!,
@@ -2975,7 +2974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (itemCountByStatus != null)
           'itemCountByStatus':
@@ -3013,7 +3012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filterOptions != null)
           'filterOptions':
               filterOptions!.map((value) => value.toJson()).toList(),
@@ -3057,7 +3056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -3119,7 +3118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (greaterThanOperatorName != null)
           'greaterThanOperatorName': greaterThanOperatorName!,
         if (lessThanOperatorName != null)
@@ -3142,7 +3141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorOptions != null)
           'operatorOptions': operatorOptions!.toJson(),
       };
@@ -3163,7 +3162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
       };
@@ -3184,7 +3183,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableDebugging != null) 'enableDebugging': enableDebugging!,
       };
 }
@@ -3216,7 +3215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectorName != null) 'connectorName': connectorName!,
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
         if (queue != null) 'queue': queue!,
@@ -3245,7 +3244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (propertyName != null) 'propertyName': propertyName!,
       };
 }
@@ -3270,7 +3269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorName != null) 'operatorName': operatorName!,
       };
 }
@@ -3289,7 +3288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorOptions != null)
           'operatorOptions': operatorOptions!.toJson(),
       };
@@ -3309,7 +3308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -3331,7 +3330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -3353,7 +3352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -3387,7 +3386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -3412,7 +3411,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -3430,7 +3429,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emailAddress != null) 'emailAddress': emailAddress!,
       };
 }
@@ -3468,7 +3467,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorName != null) 'operatorName': operatorName!,
       };
 }
@@ -3533,7 +3532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorOptions != null)
           'operatorOptions': operatorOptions!.toJson(),
         if (orderedRanking != null) 'orderedRanking': orderedRanking!,
@@ -3579,7 +3578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (integerValue != null) 'integerValue': integerValue!,
         if (stringValue != null) 'stringValue': stringValue!,
       };
@@ -3600,7 +3599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -3620,7 +3619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessages != null)
           'errorMessages':
               errorMessages!.map((value) => value.toJson()).toList(),
@@ -3644,7 +3643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (source != null) 'source': source!.toJson(),
       };
@@ -3687,7 +3686,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (percentage != null) 'percentage': percentage!,
         if (value != null) 'value': value!.toJson(),
@@ -3737,7 +3736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numFacetBuckets != null) 'numFacetBuckets': numFacetBuckets!,
         if (objectType != null) 'objectType': objectType!,
         if (operatorName != null) 'operatorName': operatorName!,
@@ -3785,7 +3784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buckets != null)
           'buckets': buckets!.map((value) => value.toJson()).toList(),
         if (objectType != null) 'objectType': objectType!,
@@ -3812,7 +3811,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (field != null) 'field': field!,
       };
@@ -3843,7 +3842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compositeFilter != null)
           'compositeFilter': compositeFilter!.toJson(),
         if (valueFilter != null) 'valueFilter': valueFilter!.toJson(),
@@ -3873,7 +3872,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!.toJson(),
         if (objectType != null) 'objectType': objectType!,
       };
@@ -3914,7 +3913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (freshnessDuration != null) 'freshnessDuration': freshnessDuration!,
         if (freshnessProperty != null) 'freshnessProperty': freshnessProperty!,
       };
@@ -3944,7 +3943,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gsuiteDomain != null) 'gsuiteDomain': gsuiteDomain!,
         if (gsuiteGroupEmail != null) 'gsuiteGroupEmail': gsuiteGroupEmail!,
         if (gsuiteUserEmail != null) 'gsuiteUserEmail': gsuiteUserEmail!,
@@ -3966,7 +3965,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stats != null)
           'stats': stats!.map((value) => value.toJson()).toList(),
       };
@@ -3986,7 +3985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stats != null)
           'stats': stats!.map((value) => value.toJson()).toList(),
       };
@@ -4006,7 +4005,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stats != null)
           'stats': stats!.map((value) => value.toJson()).toList(),
       };
@@ -4026,7 +4025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stats != null)
           'stats': stats!.map((value) => value.toJson()).toList(),
       };
@@ -4047,7 +4046,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stats != null)
           'stats': stats!.map((value) => value.toJson()).toList(),
       };
@@ -4068,7 +4067,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stats != null)
           'stats': stats!.map((value) => value.toJson()).toList(),
       };
@@ -4089,7 +4088,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stats != null)
           'stats': stats!.map((value) => value.toJson()).toList(),
       };
@@ -4110,7 +4109,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stats != null)
           'stats': stats!.map((value) => value.toJson()).toList(),
       };
@@ -4141,7 +4140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorName != null) 'operatorName': operatorName!,
       };
 }
@@ -4170,7 +4169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorOptions != null)
           'operatorOptions': operatorOptions!.toJson(),
         if (retrievalImportance != null)
@@ -4193,7 +4192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -4212,7 +4211,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowUnknownGsuitePrincipals != null)
           'allowUnknownGsuitePrincipals': allowUnknownGsuitePrincipals!,
       };
@@ -4267,7 +4266,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectorName != null) 'connectorName': connectorName!,
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
         if (indexItemOptions != null)
@@ -4329,7 +4328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (greaterThanOperatorName != null)
           'greaterThanOperatorName': greaterThanOperatorName!,
         if (lessThanOperatorName != null)
@@ -4389,7 +4388,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maximumValue != null) 'maximumValue': maximumValue!,
         if (minimumValue != null) 'minimumValue': minimumValue!,
         if (operatorOptions != null)
@@ -4412,7 +4411,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -4450,7 +4449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (interactionTime != null) 'interactionTime': interactionTime!,
         if (principal != null) 'principal': principal!.toJson(),
         if (type != null) 'type': type!,
@@ -4569,7 +4568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acl != null) 'acl': acl!.toJson(),
         if (content != null) 'content': content!.toJson(),
         if (itemType != null) 'itemType': itemType!,
@@ -4671,7 +4670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aclInheritanceType != null)
           'aclInheritanceType': aclInheritanceType!,
         if (deniedReaders != null)
@@ -4737,7 +4736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentDataRef != null) 'contentDataRef': contentDataRef!.toJson(),
         if (contentFormat != null) 'contentFormat': contentFormat!,
         if (hash != null) 'hash': hash!,
@@ -4774,7 +4773,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (statusCode != null) 'statusCode': statusCode!,
       };
@@ -4900,7 +4899,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerName != null) 'containerName': containerName!,
         if (contentLanguage != null) 'contentLanguage': contentLanguage!,
         if (createTime != null) 'createTime': createTime!,
@@ -4961,7 +4960,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (processingErrors != null)
           'processingErrors':
@@ -4996,7 +4995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hash != null) 'hash': hash!,
         if (object != null) 'object': object!.toJson(),
       };
@@ -5022,7 +5021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sources != null)
           'sources': sources!.map((value) => value.toJson()).toList(),
@@ -5049,7 +5048,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (itemNames != null) 'itemNames': itemNames!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -5076,7 +5075,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5105,7 +5104,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -5131,7 +5130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sources != null)
           'sources': sources!.map((value) => value.toJson()).toList(),
@@ -5158,7 +5157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (searchApplications != null)
           'searchApplications':
@@ -5186,7 +5185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (unmappedIdentities != null)
           'unmappedIdentities':
@@ -5213,7 +5212,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (end != null) 'end': end!,
         if (start != null) 'start': start!,
       };
@@ -5232,7 +5231,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceName != null) 'resourceName': resourceName!,
       };
 }
@@ -5302,7 +5301,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (displayOptions != null) 'displayOptions': displayOptions!.toJson(),
         if (fields != null)
@@ -5334,7 +5333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (properties != null)
           'properties': properties!.map((value) => value.toJson()).toList(),
       };
@@ -5354,7 +5353,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -5424,7 +5423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (booleanValue != null) 'booleanValue': booleanValue!,
         if (dateValues != null) 'dateValues': dateValues!.toJson(),
         if (doubleValues != null) 'doubleValues': doubleValues!.toJson(),
@@ -5477,7 +5476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (options != null) 'options': options!.toJson(),
         if (propertyDefinitions != null)
@@ -5519,7 +5518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metalines != null)
           'metalines': metalines!.map((value) => value.toJson()).toList(),
         if (objectDisplayLabel != null)
@@ -5549,7 +5548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayOptions != null) 'displayOptions': displayOptions!.toJson(),
         if (freshnessOptions != null)
           'freshnessOptions': freshnessOptions!.toJson(),
@@ -5576,7 +5575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (subobjectProperties != null)
           'subobjectProperties':
               subobjectProperties!.map((value) => value.toJson()).toList(),
@@ -5598,7 +5597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
       };
@@ -5658,29 +5657,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -5705,7 +5702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (person != null) 'person': person!.toJson(),
       };
 }
@@ -5761,7 +5758,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emailAddresses != null)
           'emailAddresses':
               emailAddresses!.map((value) => value.toJson()).toList(),
@@ -5787,7 +5784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -5838,7 +5835,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectorName != null) 'connectorName': connectorName!,
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
         if (limit != null) 'limit': limit!,
@@ -5865,7 +5862,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
       };
@@ -5903,7 +5900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupResourceName != null) 'groupResourceName': groupResourceName!,
         if (gsuitePrincipal != null)
           'gsuitePrincipal': gsuitePrincipal!.toJson(),
@@ -5950,7 +5947,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (fieldViolations != null)
@@ -6102,7 +6099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (booleanPropertyOptions != null)
           'booleanPropertyOptions': booleanPropertyOptions!.toJson(),
         if (datePropertyOptions != null)
@@ -6155,7 +6152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayLabel != null) 'displayLabel': displayLabel!,
       };
 }
@@ -6252,7 +6249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentHash != null) 'contentHash': contentHash!,
         if (metadataHash != null) 'metadataHash': metadataHash!,
         if (payload != null) 'payload': payload!,
@@ -6293,7 +6290,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectorName != null) 'connectorName': connectorName!,
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
         if (item != null) 'item': item!.toJson(),
@@ -6317,7 +6314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (statusCode != null) 'statusCode': statusCode!,
       };
@@ -6370,7 +6367,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (interpretationType != null)
           'interpretationType': interpretationType!,
         if (interpretedQuery != null) 'interpretedQuery': interpretedQuery!,
@@ -6404,7 +6401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableNlInterpretation != null)
           'disableNlInterpretation': disableNlInterpretation!,
         if (enableVerbatimMode != null)
@@ -6425,7 +6422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isSynthetic != null) 'isSynthetic': isSynthetic!,
       };
 }
@@ -6530,7 +6527,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (enumValues != null) 'enumValues': enumValues!,
         if (greaterThanOperatorName != null)
@@ -6585,7 +6582,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (operators != null)
           'operators': operators!.map((value) => value.toJson()).toList(),
@@ -6603,7 +6600,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Errors when the connector is communicating to the source repository.
@@ -6649,7 +6646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (httpStatusCode != null) 'httpStatusCode': httpStatusCode!,
         if (type != null) 'type': type!,
@@ -6706,7 +6703,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
         if (languageCode != null) 'languageCode': languageCode!,
         if (searchApplicationId != null)
@@ -6728,7 +6725,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
       };
 }
@@ -6746,7 +6743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedDebugInfo != null)
           'formattedDebugInfo': formattedDebugInfo!,
       };
@@ -6795,7 +6792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driveFollowUpRestrict != null)
           'driveFollowUpRestrict': driveFollowUpRestrict!.toJson(),
         if (driveLocationRestrict != null)
@@ -6824,7 +6821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sourceResultCounts != null)
           'sourceResultCounts':
               sourceResultCounts!.map((value) => value.toJson()).toList(),
@@ -6844,7 +6841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedDebugInfo != null)
           'formattedDebugInfo': formattedDebugInfo!,
       };
@@ -6876,7 +6873,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
         if (operatorName != null) 'operatorName': operatorName!,
         if (property != null) 'property': property!.toJson(),
@@ -6898,7 +6895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
       };
@@ -6925,7 +6922,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metalines != null)
           'metalines': metalines!.map((value) => value.toJson()).toList(),
         if (objectTypeLabel != null) 'objectTypeLabel': objectTypeLabel!,
@@ -6954,7 +6951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (importance != null) 'importance': importance!,
       };
 }
@@ -6989,7 +6986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectDefinitions != null)
           'objectDefinitions':
               objectDefinitions!.map((value) => value.toJson()).toList(),
@@ -7022,7 +7019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableFreshness != null) 'disableFreshness': disableFreshness!,
         if (disablePersonalization != null)
           'disablePersonalization': disablePersonalization!,
@@ -7111,7 +7108,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceRestrictions != null)
           'dataSourceRestrictions':
               dataSourceRestrictions!.map((value) => value.toJson()).toList(),
@@ -7151,7 +7148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (queryCountByStatus != null)
           'queryCountByStatus':
@@ -7180,7 +7177,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (searchSessionsCount != null)
           'searchSessionsCount': searchSessionsCount!,
@@ -7222,7 +7219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (oneDayActiveUsersCount != null)
           'oneDayActiveUsersCount': oneDayActiveUsersCount!,
@@ -7260,7 +7257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
         if (pageToken != null) 'pageToken': pageToken!,
         if (viewUrl != null) 'viewUrl': viewUrl!,
@@ -7288,7 +7285,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -7312,7 +7309,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quality != null) 'quality': quality!,
       };
 }
@@ -7389,7 +7386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceRestrictions != null)
           'dataSourceRestrictions':
               dataSourceRestrictions!.map((value) => value.toJson()).toList(),
@@ -7498,7 +7495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugInfo != null) 'debugInfo': debugInfo!.toJson(),
         if (errorInfo != null) 'errorInfo': errorInfo!.toJson(),
         if (facetResults != null)
@@ -7575,7 +7572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusteredResults != null)
           'clusteredResults':
               clusteredResults!.map((value) => value.toJson()).toList(),
@@ -7613,7 +7610,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matchRanges != null)
           'matchRanges': matchRanges!.map((value) => value.toJson()).toList(),
         if (snippet != null) 'snippet': snippet!,
@@ -7643,7 +7640,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorName != null) 'operatorName': operatorName!,
         if (sortOrder != null) 'sortOrder': sortOrder!,
       };
@@ -7680,7 +7677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (predefinedSource != null) 'predefinedSource': predefinedSource!,
       };
@@ -7714,7 +7711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (crowdingConfig != null) 'crowdingConfig': crowdingConfig!.toJson(),
         if (scoringConfig != null) 'scoringConfig': scoringConfig!.toJson(),
         if (source != null) 'source': source!.toJson(),
@@ -7749,7 +7746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numResults != null) 'numResults': numResults!,
         if (numSuggestions != null) 'numSuggestions': numSuggestions!,
       };
@@ -7787,7 +7784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hasMoreResults != null) 'hasMoreResults': hasMoreResults!,
         if (resultCountEstimate != null)
           'resultCountEstimate': resultCountEstimate!,
@@ -7815,7 +7812,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sourceImportance != null) 'sourceImportance': sourceImportance!,
       };
 }
@@ -7832,7 +7829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestedQuery != null) 'suggestedQuery': suggestedQuery!,
       };
 }
@@ -7859,7 +7856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectorName != null) 'connectorName': connectorName!,
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
       };
@@ -7898,8 +7895,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -7912,7 +7909,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -7937,7 +7934,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (properties != null)
           'properties': properties!.map((value) => value.toJson()).toList(),
       };
@@ -7957,7 +7954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (person != null) 'person': person!.toJson(),
       };
 }
@@ -7999,7 +7996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceRestrictions != null)
           'dataSourceRestrictions':
               dataSourceRestrictions!.map((value) => value.toJson()).toList(),
@@ -8024,7 +8021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestResults != null)
           'suggestResults':
               suggestResults!.map((value) => value.toJson()).toList(),
@@ -8070,7 +8067,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (peopleSuggestion != null)
           'peopleSuggestion': peopleSuggestion!.toJson(),
         if (querySuggestion != null)
@@ -8120,7 +8117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exactMatchWithOperator != null)
           'exactMatchWithOperator': exactMatchWithOperator!,
         if (operatorName != null) 'operatorName': operatorName!,
@@ -8149,7 +8146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorOptions != null)
           'operatorOptions': operatorOptions!.toJson(),
         if (retrievalImportance != null)
@@ -8172,7 +8169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -8229,7 +8226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (greaterThanOperatorName != null)
           'greaterThanOperatorName': greaterThanOperatorName!,
         if (lessThanOperatorName != null)
@@ -8252,7 +8249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorOptions != null)
           'operatorOptions': operatorOptions!.toJson(),
       };
@@ -8272,7 +8269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -8308,7 +8305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (externalIdentity != null)
           'externalIdentity': externalIdentity!.toJson(),
         if (resolutionStatusCode != null)
@@ -8343,7 +8340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectorName != null) 'connectorName': connectorName!,
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
         if (queue != null) 'queue': queue!,
@@ -8368,7 +8365,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
         if (source != null) 'source': source!.toJson(),
       };
@@ -8401,7 +8398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugOptions != null) 'debugOptions': debugOptions!.toJson(),
         if (schema != null) 'schema': schema!.toJson(),
         if (validateOnly != null) 'validateOnly': validateOnly!,
@@ -8426,7 +8423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -8464,7 +8461,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (booleanValue != null) 'booleanValue': booleanValue!,
         if (dateValue != null) 'dateValue': dateValue!.toJson(),
         if (doubleValue != null) 'doubleValue': doubleValue!,
@@ -8500,7 +8497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorName != null) 'operatorName': operatorName!,
         if (value != null) 'value': value!.toJson(),
       };
diff --git a/generated/googleapis/lib/cloudshell/v1.dart b/generated/googleapis/lib/cloudshell/v1.dart
index 6bc5191..a16fac2 100644
--- a/generated/googleapis/lib/cloudshell/v1.dart
+++ b/generated/googleapis/lib/cloudshell/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -502,7 +501,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for AddPublicKey.
@@ -523,7 +522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
       };
 }
@@ -541,7 +540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
       };
 }
@@ -555,7 +554,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for AuthorizeEnvironment.
@@ -586,7 +585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessToken != null) 'accessToken': accessToken!,
         if (expireTime != null) 'expireTime': expireTime!,
         if (idToken != null) 'idToken': idToken!,
@@ -601,7 +600,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The request message for Operations.CancelOperation.
@@ -612,7 +611,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Message included in the metadata field of operations returned from
@@ -624,7 +623,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Message included in the metadata field of operations returned from
@@ -636,7 +635,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -653,7 +652,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A Cloud Shell environment, which is defined as the combination of a Docker
@@ -766,7 +765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dockerImage != null) 'dockerImage': dockerImage!,
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
@@ -801,7 +800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -862,29 +861,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -902,7 +899,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for RemovePublicKey.
@@ -918,7 +915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
       };
 }
@@ -931,7 +928,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Message included in the metadata field of operations returned from
@@ -964,7 +961,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
       };
 }
@@ -995,7 +992,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessToken != null) 'accessToken': accessToken!,
         if (publicKeys != null) 'publicKeys': publicKeys!,
       };
@@ -1016,7 +1013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!.toJson(),
       };
 }
@@ -1054,8 +1051,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1068,7 +1065,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/cloudtasks/v2.dart b/generated/googleapis/lib/cloudtasks/v2.dart
index 54136c9..d22a981 100644
--- a/generated/googleapis/lib/cloudtasks/v2.dart
+++ b/generated/googleapis/lib/cloudtasks/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1139,13 +1138,12 @@
       body = _json['body'] as core.String;
     }
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('httpMethod')) {
       httpMethod = _json['httpMethod'] as core.String;
@@ -1155,7 +1153,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appEngineRouting != null)
           'appEngineRouting': appEngineRouting!.toJson(),
         if (body != null) 'body': body!,
@@ -1241,7 +1239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (instance != null) 'instance': instance!,
         if (service != null) 'service': service!,
@@ -1298,7 +1296,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dispatchTime != null) 'dispatchTime': dispatchTime!,
         if (responseStatus != null) 'responseStatus': responseStatus!.toJson(),
         if (responseTime != null) 'responseTime': responseTime!,
@@ -1372,7 +1370,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1440,7 +1438,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responseView != null) 'responseView': responseView!,
         if (task != null) 'task': task!.toJson(),
       };
@@ -1460,7 +1458,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -1524,7 +1522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1547,7 +1545,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -1574,7 +1572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -1683,13 +1681,12 @@
       body = _json['body'] as core.String;
     }
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('httpMethod')) {
       httpMethod = _json['httpMethod'] as core.String;
@@ -1707,7 +1704,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!,
         if (headers != null) 'headers': headers!,
         if (httpMethod != null) 'httpMethod': httpMethod!,
@@ -1739,7 +1736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1772,7 +1769,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (queues != null)
           'queues': queues!.map((value) => value.toJson()).toList(),
@@ -1804,7 +1801,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tasks != null)
           'tasks': tasks!.map((value) => value.toJson()).toList(),
@@ -1848,32 +1845,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1913,7 +1908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (scope != null) 'scope': scope!,
         if (serviceAccountEmail != null)
           'serviceAccountEmail': serviceAccountEmail!,
@@ -1950,7 +1945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audience != null) 'audience': audience!,
         if (serviceAccountEmail != null)
           'serviceAccountEmail': serviceAccountEmail!,
@@ -1965,7 +1960,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An Identity and Access Management (IAM) policy, which specifies access
@@ -2063,7 +2058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -2079,7 +2074,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A queue is a container of related tasks.
@@ -2214,7 +2209,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appEngineRoutingOverride != null)
           'appEngineRoutingOverride': appEngineRoutingOverride!.toJson(),
         if (name != null) 'name': name!,
@@ -2292,7 +2287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxBurstSize != null) 'maxBurstSize': maxBurstSize!,
         if (maxConcurrentDispatches != null)
           'maxConcurrentDispatches': maxConcurrentDispatches!,
@@ -2309,7 +2304,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Retry config.
@@ -2393,7 +2388,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxAttempts != null) 'maxAttempts': maxAttempts!,
         if (maxBackoff != null) 'maxBackoff': maxBackoff!,
         if (maxDoublings != null) 'maxDoublings': maxDoublings!,
@@ -2432,7 +2427,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responseView != null) 'responseView': responseView!,
       };
 }
@@ -2455,7 +2450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -2478,7 +2473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (samplingRatio != null) 'samplingRatio': samplingRatio!,
       };
 }
@@ -2516,8 +2511,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2530,7 +2525,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2687,7 +2682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appEngineHttpRequest != null)
           'appEngineHttpRequest': appEngineHttpRequest!.toJson(),
         if (createTime != null) 'createTime': createTime!,
@@ -2722,7 +2717,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2743,7 +2738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
diff --git a/generated/googleapis/lib/cloudtrace/v2.dart b/generated/googleapis/lib/cloudtrace/v2.dart
index d73a76d..ad082b8 100644
--- a/generated/googleapis/lib/cloudtrace/v2.dart
+++ b/generated/googleapis/lib/cloudtrace/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -207,7 +206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!.toJson(),
         if (description != null) 'description': description!.toJson(),
       };
@@ -239,7 +238,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (intValue != null) 'intValue': intValue!,
         if (stringValue != null) 'stringValue': stringValue!.toJson(),
@@ -268,22 +267,20 @@
 
   Attributes.fromJson(core.Map _json) {
     if (_json.containsKey('attributeMap')) {
-      attributeMap = (_json['attributeMap'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              AttributeValue.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      attributeMap =
+          (_json['attributeMap'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          AttributeValue.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('droppedAttributesCount')) {
       droppedAttributesCount = _json['droppedAttributesCount'] as core.int;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeMap != null)
           'attributeMap': attributeMap!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -313,7 +310,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (spans != null)
           'spans': spans!.map((value) => value.toJson()).toList(),
       };
@@ -333,7 +330,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A pointer from the current span to another span in the same trace or in a
@@ -379,7 +376,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!.toJson(),
         if (spanId != null) 'spanId': spanId!,
         if (traceId != null) 'traceId': traceId!,
@@ -412,7 +409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (droppedLinksCount != null) 'droppedLinksCount': droppedLinksCount!,
         if (link != null) 'link': link!.map((value) => value.toJson()).toList(),
       };
@@ -460,7 +457,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compressedSizeBytes != null)
           'compressedSizeBytes': compressedSizeBytes!,
         if (id != null) 'id': id!,
@@ -493,7 +490,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buildId != null) 'buildId': buildId!.toJson(),
         if (module != null) 'module': module!.toJson(),
       };
@@ -674,7 +671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!.toJson(),
         if (childSpanCount != null) 'childSpanCount': childSpanCount!,
         if (displayName != null) 'displayName': displayName!.toJson(),
@@ -754,7 +751,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnNumber != null) 'columnNumber': columnNumber!,
         if (fileName != null) 'fileName': fileName!.toJson(),
         if (functionName != null) 'functionName': functionName!.toJson(),
@@ -791,7 +788,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (droppedFramesCount != null)
           'droppedFramesCount': droppedFramesCount!,
         if (frame != null)
@@ -827,7 +824,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stackFrames != null) 'stackFrames': stackFrames!.toJson(),
         if (stackTraceHashId != null) 'stackTraceHashId': stackTraceHashId!,
       };
@@ -866,8 +863,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -880,7 +877,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -914,7 +911,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotation != null) 'annotation': annotation!.toJson(),
         if (messageEvent != null) 'messageEvent': messageEvent!.toJson(),
         if (time != null) 'time': time!,
@@ -958,7 +955,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (droppedAnnotationsCount != null)
           'droppedAnnotationsCount': droppedAnnotationsCount!,
         if (droppedMessageEventsCount != null)
@@ -995,7 +992,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (truncatedByteCount != null)
           'truncatedByteCount': truncatedByteCount!,
         if (value != null) 'value': value!,
diff --git a/generated/googleapis/lib/composer/v1.dart b/generated/googleapis/lib/composer/v1.dart
index 3ad72152..22a1109 100644
--- a/generated/googleapis/lib/composer/v1.dart
+++ b/generated/googleapis/lib/composer/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -599,7 +598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (value != null) 'value': value!,
       };
@@ -624,7 +623,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (machineType != null) 'machineType': machineType!,
       };
 }
@@ -669,7 +668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -690,7 +689,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The encryption options for the Cloud Composer environment and its
@@ -712,7 +711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
       };
 }
@@ -779,13 +778,12 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -801,7 +799,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (labels != null) 'labels': labels!,
@@ -922,7 +920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (airflowUri != null) 'airflowUri': airflowUri!,
         if (dagGcsPrefix != null) 'dagGcsPrefix': dagGcsPrefix!,
         if (databaseConfig != null) 'databaseConfig': databaseConfig!.toJson(),
@@ -1017,7 +1015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterIpv4CidrBlock != null)
           'clusterIpv4CidrBlock': clusterIpv4CidrBlock!,
         if (clusterSecondaryRangeName != null)
@@ -1079,7 +1077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationDisabled != null) 'creationDisabled': creationDisabled!,
         if (imageVersionId != null) 'imageVersionId': imageVersionId!,
         if (isDefault != null) 'isDefault': isDefault!,
@@ -1112,7 +1110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environments != null)
           'environments': environments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1141,7 +1139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageVersions != null)
           'imageVersions':
               imageVersions!.map((value) => value.toJson()).toList(),
@@ -1171,7 +1169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1324,7 +1322,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (diskSizeGb != null) 'diskSizeGb': diskSizeGb!,
         if (ipAllocationPolicy != null)
           'ipAllocationPolicy': ipAllocationPolicy!.toJson(),
@@ -1392,29 +1390,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1493,7 +1489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
         if (operationType != null) 'operationType': operationType!,
@@ -1542,7 +1538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enablePrivateEndpoint != null)
           'enablePrivateEndpoint': enablePrivateEndpoint!,
         if (masterIpv4CidrBlock != null)
@@ -1612,7 +1608,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudSqlIpv4CidrBlock != null)
           'cloudSqlIpv4CidrBlock': cloudSqlIpv4CidrBlock!,
         if (enablePrivateEnvironment != null)
@@ -1706,44 +1702,42 @@
 
   SoftwareConfig.fromJson(core.Map _json) {
     if (_json.containsKey('airflowConfigOverrides')) {
-      airflowConfigOverrides = (_json['airflowConfigOverrides'] as core.Map)
-          .cast<core.String, core.String>()
+      airflowConfigOverrides = (_json['airflowConfigOverrides']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('envVariables')) {
-      envVariables = (_json['envVariables'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      envVariables =
+          (_json['envVariables'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('imageVersion')) {
       imageVersion = _json['imageVersion'] as core.String;
     }
     if (_json.containsKey('pypiPackages')) {
-      pypiPackages = (_json['pypiPackages'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      pypiPackages =
+          (_json['pypiPackages'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('pythonVersion')) {
       pythonVersion = _json['pythonVersion'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (airflowConfigOverrides != null)
           'airflowConfigOverrides': airflowConfigOverrides!,
         if (envVariables != null) 'envVariables': envVariables!,
@@ -1786,8 +1780,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1800,7 +1794,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1827,7 +1821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (machineType != null) 'machineType': machineType!,
       };
 }
@@ -1848,7 +1842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedIpRanges != null)
           'allowedIpRanges':
               allowedIpRanges!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/compute/v1.dart b/generated/googleapis/lib/compute/v1.dart
index 043621c..6bc0300 100644
--- a/generated/googleapis/lib/compute/v1.dart
+++ b/generated/googleapis/lib/compute/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -41262,7 +41261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorCount != null) 'acceleratorCount': acceleratorCount!,
         if (acceleratorType != null) 'acceleratorType': acceleratorType!,
       };
@@ -41363,7 +41362,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (deprecated != null) 'deprecated': deprecated!.toJson(),
         if (description != null) 'description': description!,
@@ -41406,7 +41405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -41481,7 +41480,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -41537,15 +41536,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              AcceleratorTypesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          AcceleratorTypesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -41567,7 +41564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -41608,7 +41605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -41683,7 +41680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -41754,7 +41751,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -41794,7 +41791,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -41870,7 +41867,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -41904,7 +41901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorTypes != null)
           'acceleratorTypes':
               acceleratorTypes!.map((value) => value.toJson()).toList(),
@@ -41993,7 +41990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
         if (natIP != null) 'natIP': natIP!,
@@ -42232,7 +42229,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (addressType != null) 'addressType': addressType!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -42282,7 +42279,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -42357,7 +42354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -42412,15 +42409,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              AddressesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          AddressesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -42442,7 +42437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -42483,7 +42478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -42558,7 +42553,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -42629,7 +42624,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -42669,7 +42664,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -42745,7 +42740,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -42779,7 +42774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addresses != null)
           'addresses': addresses!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -42805,7 +42800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableNestedVirtualization != null)
           'enableNestedVirtualization': enableNestedVirtualization!,
       };
@@ -42838,7 +42833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
         if (subnetworkRangeName != null)
           'subnetworkRangeName': subnetworkRangeName!,
@@ -42871,7 +42866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (diskSizeGb != null) 'diskSizeGb': diskSizeGb!,
         if (interface != null) 'interface': interface!,
       };
@@ -42936,7 +42931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (guestAccelerators != null)
           'guestAccelerators':
               guestAccelerators!.map((value) => value.toJson()).toList(),
@@ -42979,7 +42974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (inUseCount != null) 'inUseCount': inUseCount!,
         if (instanceProperties != null)
@@ -43177,7 +43172,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoDelete != null) 'autoDelete': autoDelete!,
         if (boot != null) 'boot': boot!,
         if (deviceName != null) 'deviceName': deviceName!,
@@ -43344,13 +43339,12 @@
       diskType = _json['diskType'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('onUpdateAction')) {
       onUpdateAction = _json['onUpdateAction'] as core.String;
@@ -43381,7 +43375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (diskName != null) 'diskName': diskName!,
         if (diskSizeGb != null) 'diskSizeGb': diskSizeGb!,
@@ -43452,7 +43446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -43502,7 +43496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (ignoreChildExemptions != null)
           'ignoreChildExemptions': ignoreChildExemptions!,
@@ -43529,7 +43523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissionType != null) 'permissionType': permissionType!,
       };
 }
@@ -43703,7 +43697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscalingPolicy != null)
           'autoscalingPolicy': autoscalingPolicy!.toJson(),
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -43752,7 +43746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -43827,7 +43821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -43883,15 +43877,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              AutoscalersScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          AutoscalersScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -43913,7 +43905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -43954,7 +43946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -44029,7 +44021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -44100,7 +44092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -44190,7 +44182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (message != null) 'message': message!,
         if (type != null) 'type': type!,
       };
@@ -44225,7 +44217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -44301,7 +44293,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -44335,7 +44327,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscalers != null)
           'autoscalers': autoscalers!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -44426,7 +44418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coolDownPeriodSec != null) 'coolDownPeriodSec': coolDownPeriodSec!,
         if (cpuUtilization != null) 'cpuUtilization': cpuUtilization!.toJson(),
         if (customMetricUtilizations != null)
@@ -44466,7 +44458,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (utilizationTarget != null) 'utilizationTarget': utilizationTarget!,
       };
 }
@@ -44572,7 +44564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
         if (metric != null) 'metric': metric!,
         if (singleInstanceAssignment != null)
@@ -44599,7 +44591,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (utilizationTarget != null) 'utilizationTarget': utilizationTarget!,
       };
 }
@@ -44632,7 +44624,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxScaledInReplicas != null)
           'maxScaledInReplicas': maxScaledInReplicas!.toJson(),
         if (timeWindowSec != null) 'timeWindowSec': timeWindowSec!,
@@ -44800,7 +44792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (balancingMode != null) 'balancingMode': balancingMode!,
         if (capacityScaler != null) 'capacityScaler': capacityScaler!,
         if (description != null) 'description': description!,
@@ -44909,7 +44901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketName != null) 'bucketName': bucketName!,
         if (cdnPolicy != null) 'cdnPolicy': cdnPolicy!.toJson(),
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -45028,7 +45020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheMode != null) 'cacheMode': cacheMode!,
         if (clientTtl != null) 'clientTtl': clientTtl!,
         if (defaultTtl != null) 'defaultTtl': defaultTtl!,
@@ -45068,7 +45060,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -45143,7 +45135,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -45210,7 +45202,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -45708,7 +45700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (affinityCookieTtlSec != null)
           'affinityCookieTtlSec': affinityCookieTtlSec!,
         if (backends != null)
@@ -45782,7 +45774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -45857,7 +45849,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -45909,15 +45901,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              BackendServicesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          BackendServicesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -45939,7 +45929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -46062,7 +46052,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheKeyPolicy != null) 'cacheKeyPolicy': cacheKeyPolicy!.toJson(),
         if (cacheMode != null) 'cacheMode': cacheMode!,
         if (clientTtl != null) 'clientTtl': clientTtl!,
@@ -46124,7 +46114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableConnectionDrainOnFailover != null)
           'disableConnectionDrainOnFailover': disableConnectionDrainOnFailover!,
         if (dropTrafficIfUnhealthy != null)
@@ -46153,14 +46143,13 @@
 
   BackendServiceGroupHealth.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
-      annotations = (_json['annotations'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      annotations =
+          (_json['annotations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('healthStatus')) {
       healthStatus = (_json['healthStatus'] as core.List)
@@ -46173,7 +46162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotations != null) 'annotations': annotations!,
         if (healthStatus != null)
           'healthStatus': healthStatus!.map((value) => value.toJson()).toList(),
@@ -46223,7 +46212,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
         if (oauth2ClientId != null) 'oauth2ClientId': oauth2ClientId!,
         if (oauth2ClientSecret != null)
@@ -46262,7 +46251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -46337,7 +46326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -46408,7 +46397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -46446,7 +46435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enable != null) 'enable': enable!,
         if (sampleRate != null) 'sampleRate': sampleRate!,
       };
@@ -46463,7 +46452,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backendService != null) 'backendService': backendService!,
       };
 }
@@ -46497,7 +46486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -46571,7 +46560,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -46601,7 +46590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backendServices != null)
           'backendServices':
               backendServices!.map((value) => value.toJson()).toList(),
@@ -46700,7 +46689,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindingId != null) 'bindingId': bindingId!,
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
@@ -46782,22 +46771,22 @@
       namePattern = _json['namePattern'] as core.String;
     }
     if (_json.containsKey('perInstanceProperties')) {
-      perInstanceProperties = (_json['perInstanceProperties'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
+      perInstanceProperties = (_json['perInstanceProperties']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              BulkInsertInstanceResourcePerInstanceProperties.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          BulkInsertInstanceResourcePerInstanceProperties.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('sourceInstanceTemplate')) {
       sourceInstanceTemplate = _json['sourceInstanceTemplate'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (instanceProperties != null)
           'instanceProperties': instanceProperties!.toJson(),
@@ -46829,7 +46818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -46851,7 +46840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (path != null) 'path': path!,
       };
@@ -46911,7 +46900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeHost != null) 'includeHost': includeHost!,
         if (includeProtocol != null) 'includeProtocol': includeProtocol!,
         if (includeQueryString != null)
@@ -46973,7 +46962,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxConnections != null) 'maxConnections': maxConnections!,
         if (maxPendingRequests != null)
           'maxPendingRequests': maxPendingRequests!,
@@ -47158,7 +47147,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -47210,7 +47199,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -47285,7 +47274,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -47341,15 +47330,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              CommitmentsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          CommitmentsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -47371,7 +47358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -47412,7 +47399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -47487,7 +47474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -47558,7 +47545,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -47598,7 +47585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -47674,7 +47661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -47708,7 +47695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commitments != null)
           'commitments': commitments!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -47777,7 +47764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iam != null) 'iam': iam!,
         if (op != null) 'op': op!,
         if (svc != null) 'svc': svc!,
@@ -47800,7 +47787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableConfidentialCompute != null)
           'enableConfidentialCompute': enableConfidentialCompute!,
       };
@@ -47823,7 +47810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (drainingTimeoutSec != null)
           'drainingTimeoutSec': drainingTimeoutSec!,
       };
@@ -47866,7 +47853,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpCookie != null) 'httpCookie': httpCookie!.toJson(),
         if (httpHeaderName != null) 'httpHeaderName': httpHeaderName!,
         if (minimumRingSize != null) 'minimumRingSize': minimumRingSize!,
@@ -47900,7 +47887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (path != null) 'path': path!,
         if (ttl != null) 'ttl': ttl!.toJson(),
@@ -47991,7 +47978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowCredentials != null) 'allowCredentials': allowCredentials!,
         if (allowHeaders != null) 'allowHeaders': allowHeaders!,
         if (allowMethods != null) 'allowMethods': allowMethods!,
@@ -48041,7 +48028,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
         if (kmsKeyServiceAccount != null)
           'kmsKeyServiceAccount': kmsKeyServiceAccount!,
@@ -48073,7 +48060,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (diskEncryptionKey != null)
           'diskEncryptionKey': diskEncryptionKey!.toJson(),
         if (source != null) 'source': source!,
@@ -48144,7 +48131,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deleted != null) 'deleted': deleted!,
         if (deprecated != null) 'deprecated': deprecated!,
         if (obsolete != null) 'obsolete': obsolete!,
@@ -48494,13 +48481,12 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lastAttachTimestamp')) {
       lastAttachTimestamp = _json['lastAttachTimestamp'] as core.String;
@@ -48602,7 +48588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (diskEncryptionKey != null)
@@ -48680,7 +48666,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -48755,7 +48741,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -48811,15 +48797,12 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              DisksScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          DisksScopedList.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -48841,7 +48824,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -48910,7 +48893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoDelete != null) 'autoDelete': autoDelete!,
         if (customImage != null) 'customImage': customImage!,
         if (deviceName != null) 'deviceName': deviceName!,
@@ -48947,7 +48930,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -49021,7 +49004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -49092,7 +49075,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -49134,7 +49117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationZone != null) 'destinationZone': destinationZone!,
         if (targetDisk != null) 'targetDisk': targetDisk!,
       };
@@ -49265,7 +49248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (defaultDiskSizeGb != null) 'defaultDiskSizeGb': defaultDiskSizeGb!,
         if (deprecated != null) 'deprecated': deprecated!.toJson(),
@@ -49309,7 +49292,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -49384,7 +49367,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -49439,15 +49422,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              DiskTypesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          DiskTypesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -49469,7 +49450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -49510,7 +49491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -49585,7 +49566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -49656,7 +49637,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -49696,7 +49677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -49772,7 +49753,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -49806,7 +49787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (diskTypes != null)
           'diskTypes': diskTypes!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -49829,7 +49810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourcePolicies != null) 'resourcePolicies': resourcePolicies!,
       };
 }
@@ -49848,7 +49829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourcePolicies != null) 'resourcePolicies': resourcePolicies!,
       };
 }
@@ -49865,7 +49846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sizeGb != null) 'sizeGb': sizeGb!,
       };
 }
@@ -49899,7 +49880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -49975,7 +49956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -50009,7 +49990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disks != null)
           'disks': disks!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -50029,7 +50010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableDisplay != null) 'enableDisplay': enableDisplay!,
       };
 }
@@ -50051,7 +50032,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (zones != null)
           'zones': zones!.map((value) => value.toJson()).toList(),
       };
@@ -50072,7 +50053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (zone != null) 'zone': zone!,
       };
 }
@@ -50107,7 +50088,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nanos != null) 'nanos': nanos!,
         if (seconds != null) 'seconds': seconds!,
       };
@@ -50157,7 +50138,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destRange != null) 'destRange': destRange!,
         if (imported != null) 'imported': imported!,
         if (nextHopRegion != null) 'nextHopRegion': nextHopRegion!,
@@ -50195,7 +50176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -50270,7 +50251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -50341,7 +50322,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -50426,7 +50407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -50548,13 +50529,12 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -50567,7 +50547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (id != null) 'id': id!,
@@ -50609,7 +50589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (ipAddress != null) 'ipAddress': ipAddress!,
       };
@@ -50644,7 +50624,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -50719,7 +50699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -50795,7 +50775,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (items != null)
@@ -50835,7 +50815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (fileType != null) 'fileType': fileType!,
       };
@@ -50871,7 +50851,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (IPProtocol != null) 'IPProtocol': IPProtocol!,
         if (ports != null) 'ports': ports!,
       };
@@ -50907,7 +50887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (IPProtocol != null) 'IPProtocol': IPProtocol!,
         if (ports != null) 'ports': ports!,
       };
@@ -51161,7 +51141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowed != null)
           'allowed': allowed!.map((value) => value.toJson()).toList(),
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -51217,7 +51197,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -51292,7 +51272,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -51363,7 +51343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -51401,7 +51381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enable != null) 'enable': enable!,
         if (metadata != null) 'metadata': metadata!,
       };
@@ -51434,7 +51414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (associations != null)
           'associations': associations!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -51589,7 +51569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (associations != null)
           'associations': associations!.map((value) => value.toJson()).toList(),
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -51642,7 +51622,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachmentTarget != null) 'attachmentTarget': attachmentTarget!,
         if (displayName != null) 'displayName': displayName!,
         if (firewallPolicyId != null) 'firewallPolicyId': firewallPolicyId!,
@@ -51679,7 +51659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -51754,7 +51734,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -51816,7 +51796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -51953,7 +51933,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (description != null) 'description': description!,
         if (direction != null) 'direction': direction!,
@@ -52021,7 +52001,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destIpRanges != null) 'destIpRanges': destIpRanges!,
         if (layer4Configs != null)
           'layer4Configs':
@@ -52061,7 +52041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipProtocol != null) 'ipProtocol': ipProtocol!,
         if (ports != null) 'ports': ports!,
       };
@@ -52108,7 +52088,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calculated != null) 'calculated': calculated!,
         if (fixed != null) 'fixed': fixed!,
         if (percent != null) 'percent': percent!,
@@ -52532,13 +52512,12 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('loadBalancingScheme')) {
       loadBalancingScheme = _json['loadBalancingScheme'] as core.String;
@@ -52597,7 +52576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (IPAddress != null) 'IPAddress': IPAddress!,
         if (IPProtocol != null) 'IPProtocol': IPProtocol!,
         if (allPorts != null) 'allPorts': allPorts!,
@@ -52666,7 +52645,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -52741,7 +52720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -52796,15 +52775,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ForwardingRulesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ForwardingRulesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -52826,7 +52803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -52867,7 +52844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -52942,7 +52919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -53009,7 +52986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -53031,7 +53008,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (forwardingRule != null) 'forwardingRule': forwardingRule!,
       };
 }
@@ -53070,7 +53047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namespace != null) 'namespace': namespace!,
         if (service != null) 'service': service!,
         if (serviceDirectoryRegion != null)
@@ -53107,7 +53084,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -53181,7 +53158,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -53211,7 +53188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (forwardingRules != null)
           'forwardingRules':
               forwardingRules!.map((value) => value.toJson()).toList(),
@@ -53279,7 +53256,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (grpcServiceName != null) 'grpcServiceName': grpcServiceName!,
         if (port != null) 'port': port!,
         if (portName != null) 'portName': portName!,
@@ -53302,7 +53279,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (networkEndpoints != null)
           'networkEndpoints':
               networkEndpoints!.map((value) => value.toJson()).toList(),
@@ -53324,7 +53301,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (networkEndpoints != null)
           'networkEndpoints':
               networkEndpoints!.map((value) => value.toJson()).toList(),
@@ -53373,7 +53350,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -53417,17 +53394,16 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelFingerprint != null) 'labelFingerprint': labelFingerprint!,
         if (labels != null) 'labels': labels!,
       };
@@ -53475,7 +53451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -53540,7 +53516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (queryPath != null) 'queryPath': queryPath!,
         if (queryValue != null) 'queryValue': queryValue!.toJson(),
@@ -53575,7 +53551,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (namespace != null) 'namespace': namespace!,
         if (value != null) 'value': value!,
@@ -53597,7 +53573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
       };
@@ -53628,7 +53604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -53715,7 +53691,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (port != null) 'port': port!,
         if (portName != null) 'portName': portName!,
@@ -53808,7 +53784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (port != null) 'port': port!,
         if (portName != null) 'portName': portName!,
@@ -53901,7 +53877,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (port != null) 'port': port!,
         if (portName != null) 'portName': portName!,
@@ -54095,7 +54071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checkIntervalSec != null) 'checkIntervalSec': checkIntervalSec!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -54152,7 +54128,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -54227,7 +54203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -54294,7 +54270,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -54323,7 +54299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enable != null) 'enable': enable!,
       };
 }
@@ -54346,7 +54322,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healthCheck != null) 'healthCheck': healthCheck!,
       };
 }
@@ -54509,7 +54485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
@@ -54547,7 +54523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healthCheckService != null)
           'healthCheckService': healthCheckService!,
       };
@@ -54582,7 +54558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -54657,7 +54633,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -54727,7 +54703,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -54767,7 +54743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -54842,7 +54818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -54893,15 +54869,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              HealthChecksScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          HealthChecksScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -54923,7 +54897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -54964,7 +54938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -55038,7 +55012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -55068,7 +55042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healthChecks != null)
           'healthChecks': healthChecks!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -55111,14 +55085,13 @@
 
   HealthStatus.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
-      annotations = (_json['annotations'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      annotations =
+          (_json['annotations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('healthState')) {
       healthState = _json['healthState'] as core.String;
@@ -55140,7 +55113,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotations != null) 'annotations': annotations!,
         if (healthState != null) 'healthState': healthState!,
         if (instance != null) 'instance': instance!,
@@ -55201,7 +55174,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backendService != null) 'backendService': backendService!.toJson(),
         if (forwardingRule != null) 'forwardingRule': forwardingRule!.toJson(),
         if (healthCheck != null) 'healthCheck': healthCheck!.toJson(),
@@ -55250,7 +55223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (hosts != null) 'hosts': hosts!,
         if (pathMatcher != null) 'pathMatcher': pathMatcher!,
@@ -55279,7 +55252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpStatus != null) 'httpStatus': httpStatus!,
         if (percentage != null) 'percentage': percentage!,
       };
@@ -55308,7 +55281,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixedDelay != null) 'fixedDelay': fixedDelay!.toJson(),
         if (percentage != null) 'percentage': percentage!,
       };
@@ -55343,7 +55316,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (abort != null) 'abort': abort!.toJson(),
         if (delay != null) 'delay': delay!.toJson(),
       };
@@ -55395,7 +55368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestHeadersToAdd != null)
           'requestHeadersToAdd':
               requestHeadersToAdd!.map((value) => value.toJson()).toList(),
@@ -55517,7 +55490,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exactMatch != null) 'exactMatch': exactMatch!,
         if (headerName != null) 'headerName': headerName!,
         if (invertMatch != null) 'invertMatch': invertMatch!,
@@ -55559,7 +55532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headerName != null) 'headerName': headerName!,
         if (headerValue != null) 'headerValue': headerValue!,
         if (replace != null) 'replace': replace!,
@@ -55694,7 +55667,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checkIntervalSec != null) 'checkIntervalSec': checkIntervalSec!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -55741,7 +55714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -55816,7 +55789,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -55883,7 +55856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -55939,7 +55912,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exactMatch != null) 'exactMatch': exactMatch!,
         if (name != null) 'name': name!,
         if (presentMatch != null) 'presentMatch': presentMatch!,
@@ -56032,7 +56005,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hostRedirect != null) 'hostRedirect': hostRedirect!,
         if (httpsRedirect != null) 'httpsRedirect': httpsRedirect!,
         if (pathRedirect != null) 'pathRedirect': pathRedirect!,
@@ -56101,7 +56074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numRetries != null) 'numRetries': numRetries!,
         if (perTryTimeout != null) 'perTryTimeout': perTryTimeout!.toJson(),
         if (retryConditions != null) 'retryConditions': retryConditions!,
@@ -56212,7 +56185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (corsPolicy != null) 'corsPolicy': corsPolicy!.toJson(),
         if (faultInjectionPolicy != null)
           'faultInjectionPolicy': faultInjectionPolicy!.toJson(),
@@ -56332,7 +56305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (headerAction != null) 'headerAction': headerAction!.toJson(),
         if (matchRules != null)
@@ -56448,7 +56421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullPathMatch != null) 'fullPathMatch': fullPathMatch!,
         if (headerMatches != null)
           'headerMatches':
@@ -56589,7 +56562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checkIntervalSec != null) 'checkIntervalSec': checkIntervalSec!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -56636,7 +56609,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -56711,7 +56684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -56778,7 +56751,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -56828,7 +56801,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerType != null) 'containerType': containerType!,
         if (sha1Checksum != null) 'sha1Checksum': sha1Checksum!,
         if (source != null) 'source': source!,
@@ -57100,13 +57073,12 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('licenseCodes')) {
       licenseCodes = (_json['licenseCodes'] as core.List)
@@ -57182,7 +57154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (archiveSizeBytes != null) 'archiveSizeBytes': archiveSizeBytes!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (deprecated != null) 'deprecated': deprecated!.toJson(),
@@ -57254,7 +57226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -57328,7 +57300,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -57395,7 +57367,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -57448,7 +57420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dbs != null) 'dbs': dbs!.map((value) => value.toJson()).toList(),
         if (dbxs != null) 'dbxs': dbxs!.map((value) => value.toJson()).toList(),
         if (keks != null) 'keks': keks!.map((value) => value.toJson()).toList(),
@@ -57778,13 +57750,12 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lastStartTimestamp')) {
       lastStartTimestamp = _json['lastStartTimestamp'] as core.String;
@@ -57871,7 +57842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advancedMachineFeatures != null)
           'advancedMachineFeatures': advancedMachineFeatures!.toJson(),
         if (canIpForward != null) 'canIpForward': canIpForward!,
@@ -57959,7 +57930,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -58034,7 +58005,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -58090,15 +58061,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              InstancesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          InstancesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -58120,7 +58089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -58295,7 +58264,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
@@ -58342,7 +58311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -58417,7 +58386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -58471,15 +58440,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              InstanceGroupsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          InstanceGroupsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -58501,7 +58468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -58542,7 +58509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -58617,7 +58584,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -58687,7 +58654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -58943,7 +58910,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoHealingPolicies != null)
           'autoHealingPolicies':
               autoHealingPolicies!.map((value) => value.toJson()).toList(),
@@ -59084,7 +59051,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (abandoning != null) 'abandoning': abandoning!,
         if (creating != null) 'creating': creating!,
         if (creatingWithoutRetries != null)
@@ -59127,7 +59094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -59202,7 +59169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -59257,15 +59224,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              InstanceGroupManagersScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          InstanceGroupManagersScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -59287,7 +59252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -59324,7 +59289,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healthCheck != null) 'healthCheck': healthCheck!,
         if (initialDelaySec != null) 'initialDelaySec': initialDelaySec!,
       };
@@ -59359,7 +59324,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -59434,7 +59399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -59506,7 +59471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -59564,7 +59529,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscaler != null) 'autoscaler': autoscaler!,
         if (isStable != null) 'isStable': isStable!,
         if (stateful != null) 'stateful': stateful!.toJson(),
@@ -59603,7 +59568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hasStatefulConfig != null) 'hasStatefulConfig': hasStatefulConfig!,
         if (perInstanceConfigs != null)
           'perInstanceConfigs': perInstanceConfigs!.toJson(),
@@ -59625,7 +59590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allEffective != null) 'allEffective': allEffective!,
       };
 }
@@ -59648,7 +59613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isReached != null) 'isReached': isReached!,
       };
 }
@@ -59759,7 +59724,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceRedistributionType != null)
           'instanceRedistributionType': instanceRedistributionType!,
         if (maxSurge != null) 'maxSurge': maxSurge!.toJson(),
@@ -59815,7 +59780,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceTemplate != null) 'instanceTemplate': instanceTemplate!,
         if (name != null) 'name': name!,
         if (targetSize != null) 'targetSize': targetSize!.toJson(),
@@ -59839,7 +59804,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null) 'instances': instances!,
       };
 }
@@ -59914,7 +59879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allInstances != null) 'allInstances': allInstances!,
         if (instances != null) 'instances': instances!,
         if (minimalAction != null) 'minimalAction': minimalAction!,
@@ -59941,7 +59906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
       };
@@ -59964,7 +59929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null) 'instances': instances!,
       };
 }
@@ -59985,7 +59950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -60021,7 +59986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -60058,7 +60023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (managedInstances != null)
           'managedInstances':
               managedInstances!.map((value) => value.toJson()).toList(),
@@ -60096,7 +60061,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -60173,7 +60138,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -60219,7 +60184,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -60244,7 +60209,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (perInstanceConfigs != null)
           'perInstanceConfigs':
               perInstanceConfigs!.map((value) => value.toJson()).toList(),
@@ -60268,7 +60233,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null) 'instances': instances!,
       };
 }
@@ -60302,7 +60267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -60378,7 +60343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -60413,7 +60378,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceGroupManagers != null)
           'instanceGroupManagers':
               instanceGroupManagers!.map((value) => value.toJson()).toList(),
@@ -60439,7 +60404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceTemplate != null) 'instanceTemplate': instanceTemplate!,
       };
 }
@@ -60482,7 +60447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (targetPools != null) 'targetPools': targetPools!,
       };
@@ -60505,7 +60470,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (perInstanceConfigs != null)
           'perInstanceConfigs':
               perInstanceConfigs!.map((value) => value.toJson()).toList(),
@@ -60527,7 +60492,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
       };
@@ -60562,7 +60527,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -60637,7 +60602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -60707,7 +60672,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -60736,7 +60701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceState != null) 'instanceState': instanceState!,
       };
 }
@@ -60756,7 +60721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
       };
@@ -60791,7 +60756,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -60867,7 +60832,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -60901,7 +60866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceGroups != null)
           'instanceGroups':
               instanceGroups!.map((value) => value.toJson()).toList(),
@@ -60944,7 +60909,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (namedPorts != null)
           'namedPorts': namedPorts!.map((value) => value.toJson()).toList(),
@@ -60980,7 +60945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -61055,7 +61020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -61126,7 +61091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -61166,7 +61131,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -61241,7 +61206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -61312,7 +61277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -61362,7 +61327,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (instanceActionDetails != null)
           'instanceActionDetails': instanceActionDetails!.toJson(),
@@ -61420,7 +61385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (instance != null) 'instance': instance!,
         if (version != null) 'version': version!.toJson(),
@@ -61449,7 +61414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (message != null) 'message': message!,
       };
@@ -61486,7 +61451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationZone != null) 'destinationZone': destinationZone!,
         if (targetInstance != null) 'targetInstance': targetInstance!,
       };
@@ -61613,13 +61578,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('machineType')) {
       machineType = _json['machineType'] as core.String;
@@ -61670,7 +61634,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advancedMachineFeatures != null)
           'advancedMachineFeatures': advancedMachineFeatures!.toJson(),
         if (canIpForward != null) 'canIpForward': canIpForward!,
@@ -61716,7 +61680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!,
       };
 }
@@ -61818,7 +61782,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (id != null) 'id': id!,
@@ -61861,7 +61825,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -61936,7 +61900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -62006,7 +61970,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -62061,7 +62025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!,
         if (namedPorts != null)
           'namedPorts': namedPorts!.map((value) => value.toJson()).toList(),
@@ -62083,7 +62047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourcePolicies != null) 'resourcePolicies': resourcePolicies!,
       };
 }
@@ -62115,7 +62079,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firewallPolicys != null)
           'firewallPolicys':
               firewallPolicys!.map((value) => value.toJson()).toList(),
@@ -62167,7 +62131,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (rules != null)
@@ -62190,7 +62154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourcePolicies != null) 'resourcePolicies': resourcePolicies!,
       };
 }
@@ -62224,7 +62188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -62300,7 +62264,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -62334,7 +62298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -62365,17 +62329,16 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelFingerprint != null) 'labelFingerprint': labelFingerprint!,
         if (labels != null) 'labels': labels!,
       };
@@ -62397,7 +62360,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (guestAccelerators != null)
           'guestAccelerators':
               guestAccelerators!.map((value) => value.toJson()).toList(),
@@ -62419,7 +62382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (machineType != null) 'machineType': machineType!,
       };
 }
@@ -62436,7 +62399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minCpuPlatform != null) 'minCpuPlatform': minCpuPlatform!,
       };
 }
@@ -62461,7 +62424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (scopes != null) 'scopes': scopes!,
       };
@@ -62490,7 +62453,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disks != null)
           'disks': disks!.map((value) => value.toJson()).toList(),
       };
@@ -62516,7 +62479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rangeEnd != null) 'rangeEnd': rangeEnd!,
         if (rangeStart != null) 'rangeStart': rangeStart!,
       };
@@ -62778,7 +62741,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminEnabled != null) 'adminEnabled': adminEnabled!,
         if (circuitInfos != null)
           'circuitInfos': circuitInfos!.map((value) => value.toJson()).toList(),
@@ -63155,7 +63118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminEnabled != null) 'adminEnabled': adminEnabled!,
         if (bandwidth != null) 'bandwidth': bandwidth!,
         if (candidateSubnets != null) 'candidateSubnets': candidateSubnets!,
@@ -63219,7 +63182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -63294,7 +63257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -63350,15 +63313,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              InterconnectAttachmentsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          InterconnectAttachmentsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -63380,7 +63341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -63421,7 +63382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -63496,7 +63457,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -63570,7 +63531,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -63620,7 +63581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (interconnectName != null) 'interconnectName': interconnectName!,
         if (partnerName != null) 'partnerName': partnerName!,
         if (portalUrl != null) 'portalUrl': portalUrl!,
@@ -63644,7 +63605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag8021q != null) 'tag8021q': tag8021q!,
       };
 }
@@ -63678,7 +63639,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -63752,7 +63713,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -63783,7 +63744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (interconnectAttachments != null)
           'interconnectAttachments':
               interconnectAttachments!.map((value) => value.toJson()).toList(),
@@ -63823,7 +63784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerDemarcId != null) 'customerDemarcId': customerDemarcId!,
         if (googleCircuitId != null) 'googleCircuitId': googleCircuitId!,
         if (googleDemarcId != null) 'googleDemarcId': googleDemarcId!,
@@ -63869,7 +63830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arpCaches != null)
           'arpCaches': arpCaches!.map((value) => value.toJson()).toList(),
         if (links != null)
@@ -63897,7 +63858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (macAddress != null) 'macAddress': macAddress!,
       };
@@ -63935,7 +63896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (googleSystemId != null) 'googleSystemId': googleSystemId!,
         if (neighborSystemId != null) 'neighborSystemId': neighborSystemId!,
         if (state != null) 'state': state!,
@@ -63978,7 +63939,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
         if (value != null) 'value': value!,
       };
@@ -64039,7 +64000,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arpCaches != null)
           'arpCaches': arpCaches!.map((value) => value.toJson()).toList(),
         if (circuitId != null) 'circuitId': circuitId!,
@@ -64081,7 +64042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -64156,7 +64117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -64227,7 +64188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -64416,7 +64377,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (availabilityZone != null) 'availabilityZone': availabilityZone!,
         if (city != null) 'city': city!,
@@ -64467,7 +64428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -64542,7 +64503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -64614,7 +64575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -64658,7 +64619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expectedRttMs != null) 'expectedRttMs': expectedRttMs!,
         if (locationPresence != null) 'locationPresence': locationPresence!,
         if (region != null) 'region': region!,
@@ -64758,7 +64719,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (affectedCircuits != null) 'affectedCircuits': affectedCircuits!,
         if (description != null) 'description': description!,
         if (endTime != null) 'endTime': endTime!,
@@ -64783,7 +64744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
       };
 }
@@ -64882,7 +64843,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chargesUseFee != null) 'chargesUseFee': chargesUseFee!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -65001,7 +64962,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (id != null) 'id': id!,
@@ -65037,7 +64998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (selfLink != null) 'selfLink': selfLink!,
       };
@@ -65068,7 +65029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!,
         if (coresPerLicense != null) 'coresPerLicense': coresPerLicense!,
         if (license != null) 'license': license!,
@@ -65097,7 +65058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minGuestCpuCount != null) 'minGuestCpuCount': minGuestCpuCount!,
         if (minMemoryMb != null) 'minMemoryMb': minMemoryMb!,
       };
@@ -65132,7 +65093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -65207,7 +65168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -65267,7 +65228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -65305,7 +65266,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (diskCount != null) 'diskCount': diskCount!,
         if (diskSizeGb != null) 'diskSizeGb': diskSizeGb!,
         if (diskType != null) 'diskType': diskType!,
@@ -65325,19 +65286,18 @@
 
   LocationPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
-      locations = (_json['locations'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              LocationPolicyLocation.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      locations =
+          (_json['locations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          LocationPolicyLocation.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations':
               locations!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -65360,7 +65320,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (preference != null) 'preference': preference!,
       };
 }
@@ -65393,7 +65353,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudAudit != null) 'cloudAudit': cloudAudit!.toJson(),
         if (counter != null) 'counter': counter!.toJson(),
         if (dataAccess != null) 'dataAccess': dataAccess!.toJson(),
@@ -65425,7 +65385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorizationLoggingOptions != null)
           'authorizationLoggingOptions': authorizationLoggingOptions!.toJson(),
         if (logName != null) 'logName': logName!,
@@ -65481,7 +65441,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customFields != null)
           'customFields': customFields!.map((value) => value.toJson()).toList(),
         if (field != null) 'field': field!,
@@ -65514,7 +65474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -65536,7 +65496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logMode != null) 'logMode': logMode!,
       };
 }
@@ -65560,7 +65520,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (guestAcceleratorCount != null)
           'guestAcceleratorCount': guestAcceleratorCount!,
         if (guestAcceleratorType != null)
@@ -65580,7 +65540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (diskGb != null) 'diskGb': diskGb!,
       };
 }
@@ -65746,7 +65706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accelerators != null)
           'accelerators': accelerators!.map((value) => value.toJson()).toList(),
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -65799,7 +65759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -65874,7 +65834,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -65930,15 +65890,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              MachineTypesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          MachineTypesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -65960,7 +65918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -66001,7 +65959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -66076,7 +66034,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -66147,7 +66105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -66187,7 +66145,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -66262,7 +66220,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -66296,7 +66254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (machineTypes != null)
           'machineTypes': machineTypes!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -66443,7 +66401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentAction != null) 'currentAction': currentAction!,
         if (id != null) 'id': id!,
         if (instance != null) 'instance': instance!,
@@ -66489,7 +66447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detailedHealthState != null)
           'detailedHealthState': detailedHealthState!,
         if (healthCheck != null) 'healthCheck': healthCheck!,
@@ -66528,7 +66486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (location != null) 'location': location!,
         if (message != null) 'message': message!,
@@ -66556,7 +66514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -66578,7 +66536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null) 'errors': errors!.toJson(),
       };
 }
@@ -66608,7 +66566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceTemplate != null) 'instanceTemplate': instanceTemplate!,
         if (name != null) 'name': name!,
       };
@@ -66641,7 +66599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -66697,7 +66655,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -66758,7 +66716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filterLabels != null)
           'filterLabels': filterLabels!.map((value) => value.toJson()).toList(),
         if (filterMatchCriteria != null)
@@ -66789,7 +66747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -66818,7 +66776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (port != null) 'port': port!,
       };
@@ -66971,7 +66929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (IPv4Range != null) 'IPv4Range': IPv4Range!,
         if (autoCreateSubnetworks != null)
           'autoCreateSubnetworks': autoCreateSubnetworks!,
@@ -67027,14 +66985,13 @@
 
   NetworkEndpoint.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
-      annotations = (_json['annotations'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      annotations =
+          (_json['annotations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('fqdn')) {
       fqdn = _json['fqdn'] as core.String;
@@ -67050,7 +67007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotations != null) 'annotations': annotations!,
         if (fqdn != null) 'fqdn': fqdn!,
         if (instance != null) 'instance': instance!,
@@ -67173,14 +67130,13 @@
 
   NetworkEndpointGroup.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
-      annotations = (_json['annotations'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      annotations =
+          (_json['annotations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('appEngine')) {
       appEngine = NetworkEndpointGroupAppEngine.fromJson(
@@ -67235,7 +67191,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotations != null) 'annotations': annotations!,
         if (appEngine != null) 'appEngine': appEngine!.toJson(),
         if (cloudFunction != null) 'cloudFunction': cloudFunction!.toJson(),
@@ -67286,7 +67242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -67361,7 +67317,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -67416,15 +67372,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              NetworkEndpointGroupsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          NetworkEndpointGroupsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -67446,7 +67400,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -67507,7 +67461,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!,
         if (urlMask != null) 'urlMask': urlMask!,
         if (version != null) 'version': version!,
@@ -67550,7 +67504,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (function != null) 'function': function!,
         if (urlMask != null) 'urlMask': urlMask!,
       };
@@ -67605,7 +67559,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!,
         if (tag != null) 'tag': tag!,
         if (urlMask != null) 'urlMask': urlMask!,
@@ -67641,7 +67595,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -67716,7 +67670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -67785,7 +67739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -67811,7 +67765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (networkEndpoints != null)
           'networkEndpoints':
               networkEndpoints!.map((value) => value.toJson()).toList(),
@@ -67833,7 +67787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (networkEndpoints != null)
           'networkEndpoints':
               networkEndpoints!.map((value) => value.toJson()).toList(),
@@ -67859,7 +67813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healthStatus != null) 'healthStatus': healthStatus!,
       };
 }
@@ -67894,7 +67848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -67969,7 +67923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -68032,7 +67986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -68071,7 +68025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -68147,7 +68101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -68181,7 +68135,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (networkEndpointGroups != null)
           'networkEndpointGroups':
               networkEndpointGroups!.map((value) => value.toJson()).toList(),
@@ -68216,7 +68170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healths != null)
           'healths': healths!.map((value) => value.toJson()).toList(),
         if (networkEndpoint != null)
@@ -68356,7 +68310,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessConfigs != null)
           'accessConfigs':
               accessConfigs!.map((value) => value.toJson()).toList(),
@@ -68403,7 +68357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -68478,7 +68432,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -68549,7 +68503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -68680,7 +68634,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoCreateRoutes != null) 'autoCreateRoutes': autoCreateRoutes!,
         if (exchangeSubnetRoutes != null)
           'exchangeSubnetRoutes': exchangeSubnetRoutes!,
@@ -68724,7 +68678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (routingMode != null) 'routingMode': routingMode!,
       };
 }
@@ -68776,7 +68730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoCreateRoutes != null) 'autoCreateRoutes': autoCreateRoutes!,
         if (name != null) 'name': name!,
         if (networkPeering != null) 'networkPeering': networkPeering!.toJson(),
@@ -68811,7 +68765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firewallPolicys != null)
           'firewallPolicys':
               firewallPolicys!.map((value) => value.toJson()).toList(),
@@ -68864,7 +68818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (rules != null)
@@ -68885,7 +68839,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -68902,7 +68856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (networkPeering != null) 'networkPeering': networkPeering!.toJson(),
       };
 }
@@ -69062,7 +69016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscalingPolicy != null)
           'autoscalingPolicy': autoscalingPolicy!.toJson(),
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -69112,7 +69066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -69187,7 +69141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -69241,15 +69195,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              NodeGroupsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          NodeGroupsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -69271,7 +69223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -69317,7 +69269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxNodes != null) 'maxNodes': maxNodes!,
         if (minNodes != null) 'minNodes': minNodes!,
         if (mode != null) 'mode': mode!,
@@ -69353,7 +69305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -69428,7 +69380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -69497,7 +69449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -69536,7 +69488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maintenanceDuration != null)
           'maintenanceDuration': maintenanceDuration!.toJson(),
         if (startTime != null) 'startTime': startTime!,
@@ -69630,7 +69582,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accelerators != null)
           'accelerators': accelerators!.map((value) => value.toJson()).toList(),
         if (cpuOvercommitType != null) 'cpuOvercommitType': cpuOvercommitType!,
@@ -69658,7 +69610,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalNodeCount != null)
           'additionalNodeCount': additionalNodeCount!,
       };
@@ -69678,7 +69630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodes != null) 'nodes': nodes!,
       };
 }
@@ -69712,7 +69664,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -69787,7 +69739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -69856,7 +69808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -69896,7 +69848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -69971,7 +69923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -70004,7 +69956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodeGroups != null)
           'nodeGroups': nodeGroups!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -70024,7 +69976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodeTemplate != null) 'nodeTemplate': nodeTemplate!,
       };
 }
@@ -70170,14 +70122,14 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('nodeAffinityLabels')) {
-      nodeAffinityLabels = (_json['nodeAffinityLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      nodeAffinityLabels =
+          (_json['nodeAffinityLabels'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('nodeType')) {
       nodeType = _json['nodeType'] as core.String;
@@ -70204,7 +70156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accelerators != null)
           'accelerators': accelerators!.map((value) => value.toJson()).toList(),
         if (cpuOvercommitType != null) 'cpuOvercommitType': cpuOvercommitType!,
@@ -70257,7 +70209,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -70332,7 +70284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -70386,15 +70338,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              NodeTemplatesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          NodeTemplatesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -70416,7 +70366,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -70457,7 +70407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -70532,7 +70482,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -70602,7 +70552,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -70632,7 +70582,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpus != null) 'cpus': cpus!,
         if (localSsd != null) 'localSsd': localSsd!,
         if (memory != null) 'memory': memory!,
@@ -70668,7 +70618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -70743,7 +70693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -70777,7 +70727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodeTemplates != null)
           'nodeTemplates':
               nodeTemplates!.map((value) => value.toJson()).toList(),
@@ -70900,7 +70850,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpuPlatform != null) 'cpuPlatform': cpuPlatform!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (deprecated != null) 'deprecated': deprecated!.toJson(),
@@ -70945,7 +70895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -71020,7 +70970,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -71074,15 +71024,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              NodeTypesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          NodeTypesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -71104,7 +71052,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -71145,7 +71093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -71220,7 +71168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -71289,7 +71237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -71329,7 +71277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -71404,7 +71352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -71437,7 +71385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodeTypes != null)
           'nodeTypes': nodeTypes!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -71537,7 +71485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (grpcSettings != null) 'grpcSettings': grpcSettings!.toJson(),
@@ -71607,7 +71555,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authority != null) 'authority': authority!,
         if (endpoint != null) 'endpoint': endpoint!,
         if (payloadName != null) 'payloadName': payloadName!,
@@ -71645,7 +71593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -71720,7 +71668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -71790,7 +71738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -71833,7 +71781,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (location != null) 'location': location!,
         if (message != null) 'message': message!,
@@ -71861,7 +71809,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -71896,7 +71844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -71967,7 +71915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -72235,7 +72183,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientOperationId != null) 'clientOperationId': clientOperationId!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -72294,7 +72242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -72369,7 +72317,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -72429,15 +72377,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              OperationsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          OperationsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -72459,7 +72405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -72500,7 +72446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -72575,7 +72521,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -72650,7 +72596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -72690,7 +72636,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -72766,7 +72712,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -72800,7 +72746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -72931,7 +72877,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseEjectionTime != null)
           'baseEjectionTime': baseEjectionTime!.toJson(),
         if (consecutiveErrors != null) 'consecutiveErrors': consecutiveErrors!,
@@ -73102,7 +73048,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collectorIlb != null) 'collectorIlb': collectorIlb!.toJson(),
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -73149,7 +73095,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -73224,7 +73170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -73276,15 +73222,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              PacketMirroringsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          PacketMirroringsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -73306,7 +73250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -73361,7 +73305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (IPProtocols != null) 'IPProtocols': IPProtocols!,
         if (cidrRanges != null) 'cidrRanges': cidrRanges!,
         if (direction != null) 'direction': direction!,
@@ -73389,7 +73333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalUrl != null) 'canonicalUrl': canonicalUrl!,
         if (url != null) 'url': url!,
       };
@@ -73424,7 +73368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -73499,7 +73443,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -73570,7 +73514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -73631,7 +73575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (subnetworks != null)
@@ -73660,7 +73604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalUrl != null) 'canonicalUrl': canonicalUrl!,
         if (url != null) 'url': url!,
       };
@@ -73687,7 +73631,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalUrl != null) 'canonicalUrl': canonicalUrl!,
         if (url != null) 'url': url!,
       };
@@ -73713,7 +73657,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalUrl != null) 'canonicalUrl': canonicalUrl!,
         if (url != null) 'url': url!,
       };
@@ -73748,7 +73692,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -73822,7 +73766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -73852,7 +73796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (packetMirrorings != null)
           'packetMirrorings':
               packetMirrorings!.map((value) => value.toJson()).toList(),
@@ -73985,7 +73929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultRouteAction != null)
           'defaultRouteAction': defaultRouteAction!.toJson(),
         if (defaultService != null) 'defaultService': defaultService!,
@@ -74063,7 +74007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (paths != null) 'paths': paths!,
         if (routeAction != null) 'routeAction': routeAction!.toJson(),
         if (service != null) 'service': service!,
@@ -74130,7 +74074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (name != null) 'name': name!,
         if (preservedState != null) 'preservedState': preservedState!.toJson(),
@@ -74284,7 +74228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -74312,7 +74256,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expressionSets != null)
           'expressionSets':
               expressionSets!.map((value) => value.toJson()).toList(),
@@ -74333,28 +74277,25 @@
 
   PreservedState.fromJson(core.Map _json) {
     if (_json.containsKey('disks')) {
-      disks = (_json['disks'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              PreservedStatePreservedDisk.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      disks = (_json['disks'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          PreservedStatePreservedDisk.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disks != null)
           'disks': disks!.map((key, item) => core.MapEntry(key, item.toJson())),
         if (metadata != null) 'metadata': metadata!,
@@ -74399,7 +74340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoDelete != null) 'autoDelete': autoDelete!,
         if (mode != null) 'mode': mode!,
         if (source != null) 'source': source!,
@@ -74542,7 +74483,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonInstanceMetadata != null)
           'commonInstanceMetadata': commonInstanceMetadata!.toJson(),
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -74577,7 +74518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (xpnResource != null) 'xpnResource': xpnResource!.toJson(),
       };
 }
@@ -74595,7 +74536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (xpnResource != null) 'xpnResource': xpnResource!.toJson(),
       };
 }
@@ -74640,7 +74581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -74663,7 +74604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (organization != null) 'organization': organization!,
       };
 }
@@ -74683,7 +74624,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (networkTier != null) 'networkTier': networkTier!,
       };
 }
@@ -74841,7 +74782,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (limit != null) 'limit': limit!,
         if (metric != null) 'metric': metric!,
         if (owner != null) 'owner': owner!,
@@ -74887,7 +74828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (referenceType != null) 'referenceType': referenceType!,
         if (referrer != null) 'referrer': referrer!,
@@ -75008,7 +74949,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (deprecated != null) 'deprecated': deprecated!.toJson(),
         if (description != null) 'description': description!,
@@ -75053,7 +74994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -75128,7 +75069,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -75195,7 +75136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -75235,7 +75176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -75310,7 +75251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -75380,7 +75321,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -75405,7 +75346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourcePolicies != null) 'resourcePolicies': resourcePolicies!,
       };
 }
@@ -75424,7 +75365,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourcePolicies != null) 'resourcePolicies': resourcePolicies!,
       };
 }
@@ -75441,7 +75382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sizeGb != null) 'sizeGb': sizeGb!,
       };
 }
@@ -75475,7 +75416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -75550,7 +75491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -75617,7 +75558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -75644,7 +75585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -75678,7 +75619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -75753,7 +75694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -75823,7 +75764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -75851,7 +75792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (perInstanceConfigs != null)
           'perInstanceConfigs':
               perInstanceConfigs!.map((value) => value.toJson()).toList(),
@@ -75875,7 +75816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (perInstanceConfigs != null)
           'perInstanceConfigs':
               perInstanceConfigs!.map((value) => value.toJson()).toList(),
@@ -75899,7 +75840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null) 'instances': instances!,
       };
 }
@@ -75974,7 +75915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allInstances != null) 'allInstances': allInstances!,
         if (instances != null) 'instances': instances!,
         if (minimalAction != null) 'minimalAction': minimalAction!,
@@ -76001,7 +75942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
       };
@@ -76024,7 +75965,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null) 'instances': instances!,
       };
 }
@@ -76060,7 +76001,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -76097,7 +76038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -76175,7 +76116,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -76222,7 +76163,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -76258,7 +76199,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (managedInstances != null)
           'managedInstances':
               managedInstances!.map((value) => value.toJson()).toList(),
@@ -76283,7 +76224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null) 'instances': instances!,
       };
 }
@@ -76323,7 +76264,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (targetPools != null) 'targetPools': targetPools!,
       };
@@ -76342,7 +76283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceTemplate != null) 'instanceTemplate': instanceTemplate!,
       };
 }
@@ -76376,7 +76317,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -76451,7 +76392,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -76518,7 +76459,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -76556,7 +76497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceState != null) 'instanceState': instanceState!,
         if (portName != null) 'portName': portName!,
       };
@@ -76596,7 +76537,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (namedPorts != null)
           'namedPorts': namedPorts!.map((value) => value.toJson()).toList(),
@@ -76632,7 +76573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -76706,7 +76647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -76777,7 +76718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -76815,17 +76756,16 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelFingerprint != null) 'labelFingerprint': labelFingerprint!,
         if (labels != null) 'labels': labels!,
       };
@@ -76873,7 +76813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -76898,7 +76838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sslCertificates != null) 'sslCertificates': sslCertificates!,
       };
 }
@@ -76916,7 +76856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resource != null) 'resource': resource!.toJson(),
       };
 }
@@ -76939,7 +76879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backendService != null) 'backendService': backendService!,
       };
 }
@@ -77071,7 +77011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commitment != null) 'commitment': commitment!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -77129,7 +77069,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumeReservationType != null)
           'consumeReservationType': consumeReservationType!,
         if (key != null) 'key': key!,
@@ -77166,7 +77106,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -77241,7 +77181,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -77293,15 +77233,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ReservationsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ReservationsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -77323,7 +77261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -77364,7 +77302,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -77439,7 +77377,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -77511,7 +77449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -77535,7 +77473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (specificSkuCount != null) 'specificSkuCount': specificSkuCount!,
       };
 }
@@ -77569,7 +77507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -77643,7 +77581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -77673,7 +77611,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reservations != null)
           'reservations': reservations!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -77721,7 +77659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorType != null) 'acceleratorType': acceleratorType!,
         if (amount != null) 'amount': amount!,
         if (type != null) 'type': type!,
@@ -77741,7 +77679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (group != null) 'group': group!,
       };
 }
@@ -77775,7 +77713,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -77849,7 +77787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -77879,7 +77817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourcePolicies != null)
           'resourcePolicies':
               resourcePolicies!.map((value) => value.toJson()).toList(),
@@ -78004,7 +77942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (groupPlacementPolicy != null)
@@ -78052,7 +77990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -78127,7 +78065,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -78184,15 +78122,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ResourcePoliciesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ResourcePoliciesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -78214,7 +78150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (items != null)
@@ -78260,7 +78196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (daysInCycle != null) 'daysInCycle': daysInCycle!,
         if (duration != null) 'duration': duration!,
         if (startTime != null) 'startTime': startTime!,
@@ -78300,7 +78236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availabilityDomainCount != null)
           'availabilityDomainCount': availabilityDomainCount!,
         if (collocation != null) 'collocation': collocation!,
@@ -78340,7 +78276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (hoursInCycle != null) 'hoursInCycle': hoursInCycle!,
         if (startTime != null) 'startTime': startTime!,
@@ -78394,7 +78330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expirationTime != null) 'expirationTime': expirationTime!,
         if (startTime != null) 'startTime': startTime!,
         if (timeZone != null) 'timeZone': timeZone!,
@@ -78417,7 +78353,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (schedule != null) 'schedule': schedule!,
       };
 }
@@ -78451,7 +78387,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -78526,7 +78462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -78604,7 +78540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (items != null)
@@ -78642,7 +78578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceSchedulePolicy != null)
           'instanceSchedulePolicy': instanceSchedulePolicy!.toJson(),
       };
@@ -78676,7 +78612,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastRunStartTime != null) 'lastRunStartTime': lastRunStartTime!,
         if (nextRunStartTime != null) 'nextRunStartTime': nextRunStartTime!,
       };
@@ -78721,7 +78657,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (retentionPolicy != null)
           'retentionPolicy': retentionPolicy!.toJson(),
         if (schedule != null) 'schedule': schedule!.toJson(),
@@ -78754,7 +78690,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxRetentionDays != null) 'maxRetentionDays': maxRetentionDays!,
         if (onSourceDiskDelete != null)
           'onSourceDiskDelete': onSourceDiskDelete!,
@@ -78784,7 +78720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dailySchedule != null) 'dailySchedule': dailySchedule!.toJson(),
         if (hourlySchedule != null) 'hourlySchedule': hourlySchedule!.toJson(),
         if (weeklySchedule != null) 'weeklySchedule': weeklySchedule!.toJson(),
@@ -78821,13 +78757,12 @@
       guestFlush = _json['guestFlush'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('storageLocations')) {
       storageLocations = (_json['storageLocations'] as core.List)
@@ -78836,7 +78771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chainName != null) 'chainName': chainName!,
         if (guestFlush != null) 'guestFlush': guestFlush!,
         if (labels != null) 'labels': labels!,
@@ -78861,7 +78796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dayOfWeeks != null)
           'dayOfWeeks': dayOfWeeks!.map((value) => value.toJson()).toList(),
       };
@@ -78908,7 +78843,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (duration != null) 'duration': duration!,
         if (startTime != null) 'startTime': startTime!,
@@ -78944,7 +78879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -79015,7 +78950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -79200,7 +79135,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (destRange != null) 'destRange': destRange!,
@@ -79252,7 +79187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -79326,7 +79261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -79393,7 +79328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -79529,7 +79464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bgp != null) 'bgp': bgp!.toJson(),
         if (bgpPeers != null)
           'bgpPeers': bgpPeers!.map((value) => value.toJson()).toList(),
@@ -79568,7 +79503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (range != null) 'range': range!,
       };
@@ -79603,7 +79538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -79678,7 +79613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -79730,15 +79665,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              RoutersScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          RoutersScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -79760,7 +79693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -79827,7 +79760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiseMode != null) 'advertiseMode': advertiseMode!,
         if (advertisedGroups != null) 'advertisedGroups': advertisedGroups!,
         if (advertisedIpRanges != null)
@@ -79958,7 +79891,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiseMode != null) 'advertiseMode': advertiseMode!,
         if (advertisedGroups != null) 'advertisedGroups': advertisedGroups!,
         if (advertisedIpRanges != null)
@@ -80045,7 +79978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipRange != null) 'ipRange': ipRange!,
         if (linkedInterconnectAttachment != null)
           'linkedInterconnectAttachment': linkedInterconnectAttachment!,
@@ -80084,7 +80017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -80158,7 +80091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -80229,7 +80162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -80393,7 +80326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (drainNatIps != null) 'drainNatIps': drainNatIps!,
         if (enableEndpointIndependentMapping != null)
           'enableEndpointIndependentMapping': enableEndpointIndependentMapping!,
@@ -80448,7 +80381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enable != null) 'enable': enable!,
         if (filter != null) 'filter': filter!,
       };
@@ -80492,7 +80425,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (secondaryIpRangeNames != null)
           'secondaryIpRangeNames': secondaryIpRangeNames!,
@@ -80546,7 +80479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bestRoutes != null)
           'bestRoutes': bestRoutes!.map((value) => value.toJson()).toList(),
         if (bestRoutesForRouter != null)
@@ -80640,7 +80573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertisedRoutes != null)
           'advertisedRoutes':
               advertisedRoutes!.map((value) => value.toJson()).toList(),
@@ -80737,7 +80670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoAllocatedNatIps != null)
           'autoAllocatedNatIps': autoAllocatedNatIps!,
         if (drainAutoAllocatedNatIps != null)
@@ -80773,7 +80706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (result != null) 'result': result!.toJson(),
       };
@@ -80792,7 +80725,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resource != null) 'resource': resource!.toJson(),
       };
 }
@@ -80826,7 +80759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -80900,7 +80833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -80930,7 +80863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (routers != null)
           'routers': routers!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -81013,7 +80946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
@@ -81101,7 +81034,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (port != null) 'port': port!,
         if (portName != null) 'portName': portName!,
         if (portSpecification != null) 'portSpecification': portSpecification!,
@@ -81185,7 +81118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (automaticRestart != null) 'automaticRestart': automaticRestart!,
         if (locationHint != null) 'locationHint': locationHint!,
         if (minNodeCpus != null) 'minNodeCpus': minNodeCpus!,
@@ -81231,7 +81164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (operator != null) 'operator': operator!,
         if (values != null) 'values': values!,
@@ -81263,7 +81196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contents != null) 'contents': contents!,
         if (kind != null) 'kind': kind!,
       };
@@ -81283,7 +81216,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (preconfiguredExpressionSets != null)
           'preconfiguredExpressionSets': preconfiguredExpressionSets!.toJson(),
       };
@@ -81301,7 +81234,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (wafRules != null) 'wafRules': wafRules!.toJson(),
       };
 }
@@ -81410,7 +81343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
@@ -81452,7 +81385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -81527,7 +81460,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -81589,7 +81522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -81610,7 +81543,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (securityPolicy != null) 'securityPolicy': securityPolicy!,
       };
 }
@@ -81675,7 +81608,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (description != null) 'description': description!,
         if (kind != null) 'kind': kind!,
@@ -81726,7 +81659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (expr != null) 'expr': expr!.toJson(),
         if (versionedExpr != null) 'versionedExpr': versionedExpr!,
@@ -81749,7 +81682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (srcIpRanges != null) 'srcIpRanges': srcIpRanges!,
       };
 }
@@ -81798,7 +81731,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientTlsPolicy != null) 'clientTlsPolicy': clientTlsPolicy!,
         if (subjectAltNames != null) 'subjectAltNames': subjectAltNames!,
       };
@@ -81860,7 +81793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contents != null) 'contents': contents!,
         if (kind != null) 'kind': kind!,
         if (next != null) 'next': next!,
@@ -81885,7 +81818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -81911,7 +81844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (scopes != null) 'scopes': scopes!,
       };
@@ -81949,7 +81882,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableIntegrityMonitoring != null)
           'enableIntegrityMonitoring': enableIntegrityMonitoring!,
         if (enableSecureBoot != null) 'enableSecureBoot': enableSecureBoot!,
@@ -81991,7 +81924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encryptionKey != null) 'encryptionKey': encryptionKey!.toJson(),
         if (kind != null) 'kind': kind!,
         if (signingKey != null) 'signingKey': signingKey!.toJson(),
@@ -82019,7 +81952,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ekCert != null) 'ekCert': ekCert!,
         if (ekPub != null) 'ekPub': ekPub!,
       };
@@ -82040,7 +81973,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (updateAutoLearnPolicy != null)
           'updateAutoLearnPolicy': updateAutoLearnPolicy!,
       };
@@ -82074,7 +82007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyName != null) 'keyName': keyName!,
         if (keyValue != null) 'keyValue': keyValue!,
       };
@@ -82304,13 +82237,12 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('licenseCodes')) {
       licenseCodes = (_json['licenseCodes'] as core.List)
@@ -82366,7 +82298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoCreated != null) 'autoCreated': autoCreated!,
         if (chainName != null) 'chainName': chainName!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -82426,7 +82358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -82501,7 +82433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -82568,7 +82500,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -82602,7 +82534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (diskConfigs != null)
           'diskConfigs': diskConfigs!.map((value) => value.toJson()).toList(),
       };
@@ -82772,7 +82704,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificate != null) 'certificate': certificate!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -82820,7 +82752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -82895,7 +82827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -82950,15 +82882,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              SslCertificatesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          SslCertificatesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -82980,7 +82910,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -83021,7 +82951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -83096,7 +83026,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -83163,7 +83093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -83205,14 +83135,13 @@
 
   SslCertificateManagedSslCertificate.fromJson(core.Map _json) {
     if (_json.containsKey('domainStatus')) {
-      domainStatus = (_json['domainStatus'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      domainStatus =
+          (_json['domainStatus'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('domains')) {
       domains = (_json['domains'] as core.List)
@@ -83224,7 +83153,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domainStatus != null) 'domainStatus': domainStatus!,
         if (domains != null) 'domains': domains!,
         if (status != null) 'status': status!,
@@ -83256,7 +83185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificate != null) 'certificate': certificate!,
         if (privateKey != null) 'privateKey': privateKey!,
       };
@@ -83291,7 +83220,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -83365,7 +83294,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -83395,7 +83324,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sslCertificates != null)
           'sslCertificates':
               sslCertificates!.map((value) => value.toJson()).toList(),
@@ -83432,7 +83361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -83507,7 +83436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -83577,7 +83506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -83601,7 +83530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (features != null) 'features': features!,
       };
 }
@@ -83635,7 +83564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -83706,7 +83635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -83867,7 +83796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (customFeatures != null) 'customFeatures': customFeatures!,
         if (description != null) 'description': description!,
@@ -83899,7 +83828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sslPolicy != null) 'sslPolicy': sslPolicy!,
       };
 }
@@ -83916,7 +83845,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (preservedState != null) 'preservedState': preservedState!.toJson(),
       };
 }
@@ -83933,19 +83862,17 @@
 
   StatefulPolicyPreservedState.fromJson(core.Map _json) {
     if (_json.containsKey('disks')) {
-      disks = (_json['disks'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              StatefulPolicyPreservedStateDiskDevice.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      disks = (_json['disks'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          StatefulPolicyPreservedStateDiskDevice.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disks != null)
           'disks': disks!.map((key, item) => core.MapEntry(key, item.toJson())),
       };
@@ -83972,7 +83899,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoDelete != null) 'autoDelete': autoDelete!,
       };
 }
@@ -84231,7 +84158,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (enableFlowLogs != null) 'enableFlowLogs': enableFlowLogs!,
@@ -84288,7 +84215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -84363,7 +84290,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -84419,15 +84346,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              SubnetworksScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          SubnetworksScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -84449,7 +84374,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -84490,7 +84415,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -84565,7 +84490,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -84636,7 +84561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -84721,7 +84646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregationInterval != null)
           'aggregationInterval': aggregationInterval!,
         if (enable != null) 'enable': enable!,
@@ -84760,7 +84685,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
         if (rangeName != null) 'rangeName': rangeName!,
       };
@@ -84783,7 +84708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
       };
 }
@@ -84817,7 +84742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -84890,7 +84815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -84919,7 +84844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (subnetworks != null)
           'subnetworks': subnetworks!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -84937,7 +84862,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (privateIpGoogleAccess != null)
           'privateIpGoogleAccess': privateIpGoogleAccess!,
       };
@@ -85018,7 +84943,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (port != null) 'port': port!,
         if (portName != null) 'portName': portName!,
         if (portSpecification != null) 'portSpecification': portSpecification!,
@@ -85065,7 +84990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (items != null) 'items': items!,
       };
@@ -85195,7 +85120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
@@ -85239,7 +85164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -85314,7 +85239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -85384,7 +85309,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -85424,7 +85349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -85498,7 +85423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -85528,7 +85453,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetHttpProxies != null)
           'targetHttpProxies':
               targetHttpProxies!.map((value) => value.toJson()).toList(),
@@ -85673,7 +85598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
@@ -85731,15 +85656,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              TargetHttpProxiesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          TargetHttpProxiesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -85757,7 +85680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -85797,7 +85720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -85872,7 +85795,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -85941,7 +85864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -85981,7 +85904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -86055,7 +85978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -86085,7 +86008,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetHttpsProxies != null)
           'targetHttpsProxies':
               targetHttpsProxies!.map((value) => value.toJson()).toList(),
@@ -86109,7 +86032,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quicOverride != null) 'quicOverride': quicOverride!,
       };
 }
@@ -86131,7 +86054,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sslCertificates != null) 'sslCertificates': sslCertificates!,
       };
 }
@@ -86328,7 +86251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorizationPolicy != null)
           'authorizationPolicy': authorizationPolicy!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -86376,7 +86299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -86451,7 +86374,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -86507,15 +86430,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              TargetHttpsProxiesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          TargetHttpsProxiesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -86537,7 +86458,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -86578,7 +86499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -86653,7 +86574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -86722,7 +86643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -86840,7 +86761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (id != null) 'id': id!,
@@ -86882,7 +86803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -86957,7 +86878,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -87008,15 +86929,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              TargetInstancesScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          TargetInstancesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -87038,7 +86957,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -87079,7 +86998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -87154,7 +87073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -87221,7 +87140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -87261,7 +87180,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -87335,7 +87254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -87365,7 +87284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetInstances != null)
           'targetInstances':
               targetInstances!.map((value) => value.toJson()).toList(),
@@ -87537,7 +87456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupPool != null) 'backupPool': backupPool!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -87582,7 +87501,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -87657,7 +87576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -87713,15 +87632,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              TargetPoolsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          TargetPoolsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -87743,7 +87660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -87780,7 +87697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healthStatus != null)
           'healthStatus': healthStatus!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -87816,7 +87733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -87891,7 +87808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -87962,7 +87879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -87988,7 +87905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healthChecks != null)
           'healthChecks': healthChecks!.map((value) => value.toJson()).toList(),
       };
@@ -88016,7 +87933,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
       };
@@ -88044,7 +87961,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healthChecks != null)
           'healthChecks': healthChecks!.map((value) => value.toJson()).toList(),
       };
@@ -88065,7 +87982,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
       };
@@ -88100,7 +88017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -88174,7 +88091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -88204,7 +88121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetPools != null)
           'targetPools': targetPools!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -88222,7 +88139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (target != null) 'target': target!,
       };
 }
@@ -88239,7 +88156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!,
       };
 }
@@ -88261,7 +88178,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (proxyHeader != null) 'proxyHeader': proxyHeader!,
       };
 }
@@ -88283,7 +88200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sslCertificates != null) 'sslCertificates': sslCertificates!,
       };
 }
@@ -88398,7 +88315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (id != null) 'id': id!,
@@ -88441,7 +88358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -88516,7 +88433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -88583,7 +88500,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -88606,7 +88523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!,
       };
 }
@@ -88628,7 +88545,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (proxyHeader != null) 'proxyHeader': proxyHeader!,
       };
 }
@@ -88740,7 +88657,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (id != null) 'id': id!,
@@ -88782,7 +88699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -88857,7 +88774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -88924,7 +88841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -89063,7 +88980,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (forwardingRules != null) 'forwardingRules': forwardingRules!,
@@ -89107,7 +89024,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -89182,7 +89099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -89237,15 +89154,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              TargetVpnGatewaysScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          TargetVpnGatewaysScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -89267,7 +89182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -89308,7 +89223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -89383,7 +89298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -89454,7 +89369,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -89494,7 +89409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -89570,7 +89485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -89604,7 +89519,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetVpnGateways != null)
           'targetVpnGateways':
               targetVpnGateways!.map((value) => value.toJson()).toList(),
@@ -89682,7 +89597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actualOutputUrl != null) 'actualOutputUrl': actualOutputUrl!,
         if (actualRedirectResponseCode != null)
           'actualRedirectResponseCode': actualRedirectResponseCode!,
@@ -89714,7 +89629,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -89734,7 +89649,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -89954,7 +89869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (defaultRouteAction != null)
           'defaultRouteAction': defaultRouteAction!.toJson(),
@@ -90007,7 +89922,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -90081,7 +89996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -90148,7 +90063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -90170,7 +90085,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (urlMap != null) 'urlMap': urlMap!,
       };
 }
@@ -90254,7 +90169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expectedOutputUrl != null) 'expectedOutputUrl': expectedOutputUrl!,
         if (expectedRedirectResponseCode != null)
@@ -90286,7 +90201,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -90329,7 +90244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (loadErrors != null) 'loadErrors': loadErrors!,
         if (loadSucceeded != null) 'loadSucceeded': loadSucceeded!,
         if (testFailures != null)
@@ -90367,7 +90282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -90442,7 +90357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -90493,15 +90408,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              UrlMapsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          UrlMapsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -90523,7 +90436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -90564,7 +90477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -90638,7 +90551,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -90668,7 +90581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (urlMaps != null)
           'urlMaps': urlMaps!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -90688,7 +90601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resource != null) 'resource': resource!.toJson(),
       };
 }
@@ -90705,7 +90618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
       };
 }
@@ -90734,7 +90647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hostRewrite != null) 'hostRewrite': hostRewrite!,
         if (pathPrefixRewrite != null) 'pathPrefixRewrite': pathPrefixRewrite!,
       };
@@ -90775,7 +90688,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
         if (network != null) 'network': network!,
         if (secondaryIpRanges != null)
@@ -90808,7 +90721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
         if (rangeName != null) 'rangeName': rangeName!,
       };
@@ -90843,7 +90756,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -90918,7 +90831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -90991,7 +90904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -91035,7 +90948,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketName != null) 'bucketName': bucketName!,
         if (reportNamePrefix != null) 'reportNamePrefix': reportNamePrefix!,
       };
@@ -91062,7 +90975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceName != null) 'instanceName': instanceName!,
         if (interfaceNatMappings != null)
           'interfaceNatMappings':
@@ -91132,7 +91045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (drainNatIpPortRanges != null)
           'drainNatIpPortRanges': drainNatIpPortRanges!,
         if (natIpPortRanges != null) 'natIpPortRanges': natIpPortRanges!,
@@ -91174,7 +91087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -91249,7 +91162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -91325,7 +91238,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -91441,13 +91354,12 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -91470,7 +91382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (id != null) 'id': id!,
@@ -91516,7 +91428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -91591,7 +91503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -91646,15 +91558,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              VpnGatewaysScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          VpnGatewaysScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -91676,7 +91586,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -91717,7 +91627,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -91792,7 +91702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -91863,7 +91773,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -91890,7 +91800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vpnConnections != null)
           'vpnConnections':
               vpnConnections!.map((value) => value.toJson()).toList(),
@@ -91927,7 +91837,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
         if (unsatisfiedReason != null) 'unsatisfiedReason': unsatisfiedReason!,
       };
@@ -91959,7 +91869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (localGatewayInterface != null)
           'localGatewayInterface': localGatewayInterface!,
         if (peerGatewayInterface != null)
@@ -92013,7 +91923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (peerExternalGateway != null)
           'peerExternalGateway': peerExternalGateway!,
         if (peerGcpGateway != null) 'peerGcpGateway': peerGcpGateway!,
@@ -92044,7 +91954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (ipAddress != null) 'ipAddress': ipAddress!,
       };
@@ -92062,7 +91972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
       };
 }
@@ -92096,7 +92006,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -92172,7 +92082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -92206,7 +92116,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vpnGateways != null)
           'vpnGateways': vpnGateways!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -92466,7 +92376,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
         if (detailedStatus != null) 'detailedStatus': detailedStatus!,
@@ -92526,7 +92436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -92601,7 +92511,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -92656,15 +92566,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              VpnTunnelsScopedList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          VpnTunnelsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -92686,7 +92594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -92727,7 +92635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -92802,7 +92710,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -92873,7 +92781,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -92913,7 +92821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -92987,7 +92895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -93017,7 +92925,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vpnTunnels != null)
           'vpnTunnels': vpnTunnels!.map((value) => value.toJson()).toList(),
         if (warning != null) 'warning': warning!.toJson(),
@@ -93061,7 +92969,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliases != null) 'aliases': aliases!,
         if (expressions != null)
           'expressions': expressions!.map((value) => value.toJson()).toList(),
@@ -93086,7 +92994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
       };
 }
@@ -93139,7 +93047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backendService != null) 'backendService': backendService!,
         if (headerAction != null) 'headerAction': headerAction!.toJson(),
         if (weight != null) 'weight': weight!,
@@ -93175,7 +93083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -93250,7 +93158,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -93322,7 +93230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -93358,7 +93266,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (type != null) 'type': type!,
       };
@@ -93475,7 +93383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableCpuPlatforms != null)
           'availableCpuPlatforms': availableCpuPlatforms!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -93520,7 +93428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -93594,7 +93502,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -93661,7 +93569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -93699,17 +93607,16 @@
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelFingerprint != null) 'labelFingerprint': labelFingerprint!,
         if (labels != null) 'labels': labels!,
       };
@@ -93757,7 +93664,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
diff --git a/generated/googleapis/lib/container/v1.dart b/generated/googleapis/lib/container/v1.dart
index 2f58e84..a651977 100644
--- a/generated/googleapis/lib/container/v1.dart
+++ b/generated/googleapis/lib/container/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3560,7 +3559,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorCount != null) 'acceleratorCount': acceleratorCount!,
         if (acceleratorType != null) 'acceleratorType': acceleratorType!,
       };
@@ -3647,7 +3646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudRunConfig != null) 'cloudRunConfig': cloudRunConfig!.toJson(),
         if (configConnectorConfig != null)
           'configConnectorConfig': configConnectorConfig!.toJson(),
@@ -3688,7 +3687,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
         if (securityGroup != null) 'securityGroup': securityGroup!,
       };
@@ -3721,7 +3720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoUpgradeStartTime != null)
           'autoUpgradeStartTime': autoUpgradeStartTime!,
         if (description != null) 'description': description!,
@@ -3743,7 +3742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -3834,7 +3833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bootDiskKmsKey != null) 'bootDiskKmsKey': bootDiskKmsKey!,
         if (diskSizeGb != null) 'diskSizeGb': diskSizeGb!,
         if (diskType != null) 'diskType': diskType!,
@@ -3862,7 +3861,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetId != null) 'datasetId': datasetId!,
       };
 }
@@ -3883,7 +3882,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -3936,7 +3935,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (operationId != null) 'operationId': operationId!,
         if (projectId != null) 'projectId': projectId!,
@@ -3963,7 +3962,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cidrBlock != null) 'cidrBlock': cidrBlock!,
         if (displayName != null) 'displayName': displayName!,
       };
@@ -3982,7 +3981,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (issueClientCertificate != null)
           'issueClientCertificate': issueClientCertificate!,
       };
@@ -4014,7 +4013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disabled != null) 'disabled': disabled!,
         if (loadBalancerType != null) 'loadBalancerType': loadBalancerType!,
       };
@@ -4509,14 +4508,13 @@
           _json['releaseChannel'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resourceLabels')) {
-      resourceLabels = (_json['resourceLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      resourceLabels =
+          (_json['resourceLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('resourceUsageExportConfig')) {
       resourceUsageExportConfig = ResourceUsageExportConfig.fromJson(
@@ -4560,7 +4558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addonsConfig != null) 'addonsConfig': addonsConfig!.toJson(),
         if (authenticatorGroupsConfig != null)
           'authenticatorGroupsConfig': authenticatorGroupsConfig!.toJson(),
@@ -4683,7 +4681,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoprovisioningLocations != null)
           'autoprovisioningLocations': autoprovisioningLocations!,
         if (autoprovisioningNodePoolDefaults != null)
@@ -4933,7 +4931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (desiredAddonsConfig != null)
           'desiredAddonsConfig': desiredAddonsConfig!.toJson(),
         if (desiredBinaryAuthorization != null)
@@ -5034,7 +5032,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (name != null) 'name': name!,
         if (projectId != null) 'projectId': projectId!,
@@ -5055,7 +5053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -5076,7 +5074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -5129,7 +5127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cluster != null) 'cluster': cluster!.toJson(),
         if (parent != null) 'parent': parent!,
         if (projectId != null) 'projectId': projectId!,
@@ -5195,7 +5193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (nodePool != null) 'nodePool': nodePool!.toJson(),
         if (parent != null) 'parent': parent!,
@@ -5232,7 +5230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -5265,7 +5263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyName != null) 'keyName': keyName!,
         if (state != null) 'state': state!,
       };
@@ -5285,7 +5283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disabled != null) 'disabled': disabled!,
       };
 }
@@ -5303,7 +5301,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -5322,7 +5320,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Configuration for the Compute Engine PD CSI driver.
@@ -5338,7 +5336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -5368,7 +5366,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheHeader != null) 'cacheHeader': cacheHeader!.toJson(),
         if (keys != null) 'keys': keys!.map((value) => value.toJson()).toList(),
       };
@@ -5444,7 +5442,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheHeader != null) 'cacheHeader': cacheHeader!.toJson(),
         if (claimsSupported != null) 'claims_supported': claimsSupported!,
         if (grantTypes != null) 'grant_types': grantTypes!,
@@ -5478,7 +5476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disabled != null) 'disabled': disabled!,
       };
 }
@@ -5508,7 +5506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (age != null) 'age': age!,
         if (directive != null) 'directive': directive!,
         if (expires != null) 'expires': expires!,
@@ -5532,7 +5530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disabled != null) 'disabled': disabled!,
       };
 }
@@ -5682,7 +5680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterIpv4Cidr != null) 'clusterIpv4Cidr': clusterIpv4Cidr!,
         if (clusterIpv4CidrBlock != null)
           'clusterIpv4CidrBlock': clusterIpv4CidrBlock!,
@@ -5717,7 +5715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -5783,7 +5781,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alg != null) 'alg': alg!,
         if (crv != null) 'crv': crv!,
         if (e != null) 'e': e!,
@@ -5809,7 +5807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disabled != null) 'disabled': disabled!,
       };
 }
@@ -5832,7 +5830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -5852,17 +5850,16 @@
 
   LinuxNodeConfig.fromJson(core.Map _json) {
     if (_json.containsKey('sysctls')) {
-      sysctls =
-          (_json['sysctls'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      sysctls = (_json['sysctls'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sysctls != null) 'sysctls': sysctls!,
       };
 }
@@ -5893,7 +5890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusters != null)
           'clusters': clusters!.map((value) => value.toJson()).toList(),
         if (missingZones != null) 'missingZones': missingZones!,
@@ -5916,7 +5913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodePools != null)
           'nodePools': nodePools!.map((value) => value.toJson()).toList(),
       };
@@ -5947,7 +5944,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (missingZones != null) 'missingZones': missingZones!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -5981,7 +5978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (subnetworks != null)
           'subnetworks': subnetworks!.map((value) => value.toJson()).toList(),
@@ -6014,7 +6011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceVersion != null) 'resourceVersion': resourceVersion!,
         if (window != null) 'window': window!.toJson(),
       };
@@ -6046,14 +6043,14 @@
               as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maintenanceExclusions')) {
-      maintenanceExclusions = (_json['maintenanceExclusions'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
+      maintenanceExclusions = (_json['maintenanceExclusions']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              TimeWindow.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          TimeWindow.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('recurringWindow')) {
       recurringWindow = RecurringTimeWindow.fromJson(
@@ -6061,7 +6058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dailyMaintenanceWindow != null)
           'dailyMaintenanceWindow': dailyMaintenanceWindow!.toJson(),
         if (maintenanceExclusions != null)
@@ -6146,7 +6143,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientCertificate != null) 'clientCertificate': clientCertificate!,
         if (clientCertificateConfig != null)
           'clientCertificateConfig': clientCertificateConfig!.toJson(),
@@ -6185,7 +6182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cidrBlocks != null)
           'cidrBlocks': cidrBlocks!.map((value) => value.toJson()).toList(),
         if (enabled != null) 'enabled': enabled!,
@@ -6205,7 +6202,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxPodsPerNode != null) 'maxPodsPerNode': maxPodsPerNode!,
       };
 }
@@ -6243,7 +6240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (doubleValue != null) 'doubleValue': doubleValue!,
         if (intValue != null) 'intValue': intValue!,
         if (name != null) 'name': name!,
@@ -6320,7 +6317,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultSnatStatus != null)
           'defaultSnatStatus': defaultSnatStatus!.toJson(),
         if (enableIntraNodeVisibility != null)
@@ -6356,7 +6353,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
         if (provider != null) 'provider': provider!,
       };
@@ -6378,7 +6375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disabled != null) 'disabled': disabled!,
       };
 }
@@ -6560,13 +6557,12 @@
           _json['kubeletConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('linuxNodeConfig')) {
       linuxNodeConfig = LinuxNodeConfig.fromJson(
@@ -6579,13 +6575,12 @@
       machineType = _json['machineType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('minCpuPlatform')) {
       minCpuPlatform = _json['minCpuPlatform'] as core.String;
@@ -6635,7 +6630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accelerators != null)
           'accelerators': accelerators!.map((value) => value.toJson()).toList(),
         if (bootDiskKmsKey != null) 'bootDiskKmsKey': bootDiskKmsKey!,
@@ -6711,7 +6706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpuCfsQuota != null) 'cpuCfsQuota': cpuCfsQuota!,
         if (cpuCfsQuotaPeriod != null) 'cpuCfsQuotaPeriod': cpuCfsQuotaPeriod!,
         if (cpuManagerPolicy != null) 'cpuManagerPolicy': cpuManagerPolicy!,
@@ -6754,7 +6749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoRepair != null) 'autoRepair': autoRepair!,
         if (autoUpgrade != null) 'autoUpgrade': autoUpgrade!,
         if (upgradeOptions != null) 'upgradeOptions': upgradeOptions!.toJson(),
@@ -6923,7 +6918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscaling != null) 'autoscaling': autoscaling!.toJson(),
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
@@ -6982,7 +6977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoprovisioned != null) 'autoprovisioned': autoprovisioned!,
         if (enabled != null) 'enabled': enabled!,
         if (maxNodeCount != null) 'maxNodeCount': maxNodeCount!,
@@ -7025,7 +7020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (effect != null) 'effect': effect!,
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
@@ -7046,7 +7041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pubsub != null) 'pubsub': pubsub!.toJson(),
       };
 }
@@ -7196,7 +7191,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterConditions != null)
           'clusterConditions':
               clusterConditions!.map((value) => value.toJson()).toList(),
@@ -7268,7 +7263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null)
           'metrics': metrics!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -7343,7 +7338,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enablePrivateEndpoint != null)
           'enablePrivateEndpoint': enablePrivateEndpoint!,
         if (enablePrivateNodes != null)
@@ -7371,7 +7366,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -7397,7 +7392,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
         if (topic != null) 'topic': topic!,
       };
@@ -7440,7 +7435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (recurrence != null) 'recurrence': recurrence!,
         if (window != null) 'window': window!.toJson(),
       };
@@ -7474,7 +7469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channel != null) 'channel': channel!,
       };
 }
@@ -7517,7 +7512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channel != null) 'channel': channel!,
         if (defaultVersion != null) 'defaultVersion': defaultVersion!,
         if (validVersions != null) 'validVersions': validVersions!,
@@ -7563,7 +7558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumeReservationType != null)
           'consumeReservationType': consumeReservationType!,
         if (key != null) 'key': key!,
@@ -7598,7 +7593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maximum != null) 'maximum': maximum!,
         if (minimum != null) 'minimum': minimum!,
         if (resourceType != null) 'resourceType': resourceType!,
@@ -7637,7 +7632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigqueryDestination != null)
           'bigqueryDestination': bigqueryDestination!.toJson(),
         if (consumptionMeteringConfig != null)
@@ -7710,7 +7705,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (name != null) 'name': name!,
         if (nodePoolId != null) 'nodePoolId': nodePoolId!,
@@ -7735,7 +7730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -7792,7 +7787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channels != null)
           'channels': channels!.map((value) => value.toJson()).toList(),
         if (defaultClusterVersion != null)
@@ -7863,7 +7858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addonsConfig != null) 'addonsConfig': addonsConfig!.toJson(),
         if (clusterId != null) 'clusterId': clusterId!,
         if (name != null) 'name': name!,
@@ -7937,21 +7932,20 @@
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('resourceLabels')) {
-      resourceLabels = (_json['resourceLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      resourceLabels =
+          (_json['resourceLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (labelFingerprint != null) 'labelFingerprint': labelFingerprint!,
         if (name != null) 'name': name!,
@@ -8019,7 +8013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (enabled != null) 'enabled': enabled!,
         if (name != null) 'name': name!,
@@ -8093,7 +8087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (locations != null) 'locations': locations!,
         if (name != null) 'name': name!,
@@ -8166,7 +8160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (loggingService != null) 'loggingService': loggingService!,
         if (name != null) 'name': name!,
@@ -8229,7 +8223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (maintenancePolicy != null)
           'maintenancePolicy': maintenancePolicy!.toJson(),
@@ -8312,7 +8306,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (clusterId != null) 'clusterId': clusterId!,
         if (name != null) 'name': name!,
@@ -8386,7 +8380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (monitoringService != null) 'monitoringService': monitoringService!,
         if (name != null) 'name': name!,
@@ -8453,7 +8447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (name != null) 'name': name!,
         if (networkPolicy != null) 'networkPolicy': networkPolicy!.toJson(),
@@ -8531,7 +8525,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscaling != null) 'autoscaling': autoscaling!.toJson(),
         if (clusterId != null) 'clusterId': clusterId!,
         if (name != null) 'name': name!,
@@ -8611,7 +8605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (management != null) 'management': management!.toJson(),
         if (name != null) 'name': name!,
@@ -8689,7 +8683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (name != null) 'name': name!,
         if (nodeCount != null) 'nodeCount': nodeCount!,
@@ -8728,7 +8722,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableIntegrityMonitoring != null)
           'enableIntegrityMonitoring': enableIntegrityMonitoring!,
         if (enableSecureBoot != null) 'enableSecureBoot': enableSecureBoot!,
@@ -8748,7 +8742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -8809,7 +8803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (name != null) 'name': name!,
         if (projectId != null) 'projectId': projectId!,
@@ -8849,7 +8843,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (message != null) 'message': message!,
       };
@@ -8876,7 +8870,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -8939,7 +8933,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (name != null) 'name': name!,
         if (projectId != null) 'projectId': projectId!,
@@ -9011,7 +9005,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (masterVersion != null) 'masterVersion': masterVersion!,
         if (name != null) 'name': name!,
@@ -9146,7 +9140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterId != null) 'clusterId': clusterId!,
         if (imageType != null) 'imageType': imageType!,
         if (kubeletConfig != null) 'kubeletConfig': kubeletConfig!.toJson(),
@@ -9216,7 +9210,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentVersion != null) 'currentVersion': currentVersion!,
         if (operation != null) 'operation': operation!,
         if (operationStartTime != null)
@@ -9265,7 +9259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxSurge != null) 'maxSurge': maxSurge!,
         if (maxUnavailable != null) 'maxUnavailable': maxUnavailable!,
       };
@@ -9321,7 +9315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
         if (network != null) 'network': network!,
         if (secondaryIpRanges != null)
@@ -9369,7 +9363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
         if (rangeName != null) 'rangeName': rangeName!,
         if (status != null) 'status': status!,
@@ -9391,7 +9385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -9410,7 +9404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (workloadPool != null) 'workloadPool': workloadPool!,
       };
 }
@@ -9438,7 +9432,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mode != null) 'mode': mode!,
       };
 }
diff --git a/generated/googleapis/lib/content/v2_1.dart b/generated/googleapis/lib/content/v2_1.dart
index 0c50544..d7bf994 100644
--- a/generated/googleapis/lib/content/v2_1.dart
+++ b/generated/googleapis/lib/content/v2_1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -7360,7 +7359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adsLinks != null)
           'adsLinks': adsLinks!.map((value) => value.toJson()).toList(),
         if (adultContent != null) 'adultContent': adultContent!,
@@ -7429,7 +7428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (locality != null) 'locality': locality!,
         if (postalCode != null) 'postalCode': postalCode!,
@@ -7467,7 +7466,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adsId != null) 'adsId': adsId!,
         if (status != null) 'status': status!,
       };
@@ -7499,7 +7498,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!.toJson(),
         if (customerService != null)
           'customerService': customerService!.toJson(),
@@ -7531,7 +7530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
         if (url != null) 'url': url!,
@@ -7571,7 +7570,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gmbAccountId != null) 'gmbAccountId': gmbAccountId!,
         if (gmbEmail != null) 'gmbEmail': gmbEmail!,
         if (status != null) 'status': status!,
@@ -7597,7 +7596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregatorId != null) 'aggregatorId': aggregatorId!,
         if (merchantId != null) 'merchantId': merchantId!,
       };
@@ -7651,7 +7650,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (description != null) 'description': description!,
         if (labelId != null) 'labelId': labelId!,
@@ -7702,7 +7701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrierAccountId != null) 'carrierAccountId': carrierAccountId!,
         if (carrierAccountName != null)
           'carrierAccountName': carrierAccountName!,
@@ -7761,7 +7760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (accountLevelIssues != null)
           'accountLevelIssues':
@@ -7826,7 +7825,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (destination != null) 'destination': destination!,
         if (detail != null) 'detail': detail!,
@@ -7891,7 +7890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeName != null) 'attributeName': attributeName!,
         if (code != null) 'code': code!,
         if (description != null) 'description': description!,
@@ -7946,7 +7945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channel != null) 'channel': channel!,
         if (country != null) 'country': country!,
         if (destination != null) 'destination': destination!,
@@ -7987,7 +7986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (active != null) 'active': active!,
         if (disapproved != null) 'disapproved': disapproved!,
         if (expiring != null) 'expiring': expiring!,
@@ -8032,7 +8031,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (kind != null) 'kind': kind!,
         if (rules != null)
@@ -8084,7 +8083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (locationId != null) 'locationId': locationId!,
         if (ratePercent != null) 'ratePercent': ratePercent!,
@@ -8129,7 +8128,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (admin != null) 'admin': admin!,
         if (emailAddress != null) 'emailAddress': emailAddress!,
         if (orderManager != null) 'orderManager': orderManager!,
@@ -8167,7 +8166,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (status != null) 'status': status!,
       };
@@ -8200,7 +8199,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountIdentifiers != null)
           'accountIdentifiers':
               accountIdentifiers!.map((value) => value.toJson()).toList(),
@@ -8222,7 +8221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -8243,7 +8242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -8334,7 +8333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!.toJson(),
         if (accountId != null) 'accountId': accountId!,
         if (batchId != null) 'batchId': batchId!,
@@ -8388,7 +8387,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (linkType != null) 'linkType': linkType!,
         if (linkedAccountId != null) 'linkedAccountId': linkedAccountId!,
@@ -8420,7 +8419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -8464,7 +8463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!.toJson(),
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
@@ -8511,7 +8510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (linkType != null) 'linkType': linkType!,
         if (linkedAccountId != null) 'linkedAccountId': linkedAccountId!,
@@ -8533,7 +8532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -8567,7 +8566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (links != null)
           'links': links!.map((value) => value.toJson()).toList(),
@@ -8602,7 +8601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -8624,7 +8623,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelIds != null) 'labelIds': labelIds!,
       };
 }
@@ -8643,7 +8642,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -8664,7 +8663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -8712,7 +8711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (batchId != null) 'batchId': batchId!,
         if (destinations != null) 'destinations': destinations!,
@@ -8745,7 +8744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -8781,7 +8780,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountStatus != null) 'accountStatus': accountStatus!.toJson(),
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
@@ -8815,7 +8814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -8839,7 +8838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -8887,7 +8886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (accountTax != null) 'accountTax': accountTax!.toJson(),
         if (batchId != null) 'batchId': batchId!,
@@ -8920,7 +8919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -8962,7 +8961,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountTax != null) 'accountTax': accountTax!.toJson(),
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
@@ -8997,7 +8996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -9029,7 +9028,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (priceAmount != null) 'priceAmount': priceAmount!.toJson(),
         if (taxAmount != null) 'taxAmount': taxAmount!.toJson(),
       };
@@ -9051,7 +9050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (businessDays != null) 'businessDays': businessDays!,
       };
 }
@@ -9095,7 +9094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerServicePendingEmail != null)
           'customerServicePendingEmail': customerServicePendingEmail!,
         if (customerServiceVerifiedEmail != null)
@@ -9165,7 +9164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrierName != null) 'carrierName': carrierName!,
         if (carrierService != null) 'carrierService': carrierService!,
         if (flatAdjustment != null) 'flatAdjustment': flatAdjustment!.toJson(),
@@ -9208,7 +9207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (name != null) 'name': name!,
         if (services != null) 'services': services!,
@@ -9341,7 +9340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customLabel0 != null) 'customLabel0': customLabel0!,
         if (customLabel1 != null) 'customLabel1': customLabel1!,
         if (customLabel2 != null) 'customLabel2': customLabel2!,
@@ -9391,7 +9390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (offerId != null) 'offerId': offerId!,
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
@@ -9449,7 +9448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collectionLevelIssuses != null)
           'collectionLevelIssuses':
               collectionLevelIssuses!.map((value) => value.toJson()).toList(),
@@ -9481,7 +9480,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!,
         if (status != null) 'status': status!,
       };
@@ -9542,7 +9541,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeName != null) 'attributeName': attributeName!,
         if (code != null) 'code': code!,
         if (description != null) 'description': description!,
@@ -9613,7 +9612,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cssDomainId != null) 'cssDomainId': cssDomainId!,
         if (cssGroupId != null) 'cssGroupId': cssGroupId!,
         if (displayName != null) 'displayName': displayName!,
@@ -9654,7 +9653,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupValues != null)
           'groupValues': groupValues!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -9686,7 +9685,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (reasonCode != null) 'reasonCode': reasonCode!,
       };
@@ -9725,7 +9724,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hour != null) 'hour': hour!,
         if (minute != null) 'minute': minute!,
         if (timezone != null) 'timezone': timezone!,
@@ -9815,7 +9814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeLanguage != null) 'attributeLanguage': attributeLanguage!,
         if (contentType != null) 'contentType': contentType!,
         if (fetchSchedule != null) 'fetchSchedule': fetchSchedule!.toJson(),
@@ -9905,7 +9904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dayOfMonth != null) 'dayOfMonth': dayOfMonth!,
         if (fetchUrl != null) 'fetchUrl': fetchUrl!,
         if (hour != null) 'hour': hour!,
@@ -9953,7 +9952,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnDelimiter != null) 'columnDelimiter': columnDelimiter!,
         if (fileEncoding != null) 'fileEncoding': fileEncoding!,
         if (quotingMode != null) 'quotingMode': quotingMode!,
@@ -10044,7 +10043,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (datafeedId != null) 'datafeedId': datafeedId!,
         if (errors != null)
@@ -10094,7 +10093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (count != null) 'count': count!,
         if (examples != null)
@@ -10128,7 +10127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (itemId != null) 'itemId': itemId!,
         if (lineNumber != null) 'lineNumber': lineNumber!,
         if (value != null) 'value': value!,
@@ -10179,7 +10178,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (excludedDestinations != null)
           'excludedDestinations': excludedDestinations!,
@@ -10205,7 +10204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -10252,7 +10251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (datafeed != null) 'datafeed': datafeed!.toJson(),
         if (datafeedId != null) 'datafeedId': datafeedId!,
@@ -10285,7 +10284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -10321,7 +10320,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (datafeed != null) 'datafeed': datafeed!.toJson(),
         if (errors != null) 'errors': errors!.toJson(),
@@ -10342,7 +10341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -10374,7 +10373,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -10398,7 +10397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -10455,7 +10454,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (country != null) 'country': country!,
         if (datafeedId != null) 'datafeedId': datafeedId!,
@@ -10489,7 +10488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -10525,7 +10524,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (datafeedStatus != null) 'datafeedStatus': datafeedStatus!.toJson(),
         if (errors != null) 'errors': errors!.toJson(),
@@ -10559,7 +10558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -10607,7 +10606,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -10724,7 +10723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
@@ -10831,7 +10830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cutoffTime != null) 'cutoffTime': cutoffTime!.toJson(),
         if (handlingBusinessDayConfig != null)
           'handlingBusinessDayConfig': handlingBusinessDayConfig!.toJson(),
@@ -10878,7 +10877,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domain != null) 'domain': domain!,
         if (message != null) 'message': message!,
         if (reason != null) 'reason': reason!,
@@ -10913,7 +10912,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
@@ -10942,7 +10941,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (gmbAccounts != null)
           'gmbAccounts': gmbAccounts!.map((value) => value.toJson()).toList(),
@@ -10979,7 +10978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (listingCount != null) 'listingCount': listingCount!,
         if (name != null) 'name': name!,
@@ -11064,7 +11063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (numberOfItems != null) 'numberOfItems': numberOfItems!,
@@ -11127,7 +11126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deadlineDate != null) 'deadlineDate': deadlineDate!,
         if (deadlineHour != null) 'deadlineHour': deadlineHour!,
         if (deadlineTimezone != null) 'deadlineTimezone': deadlineTimezone!,
@@ -11197,7 +11196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countryCode != null) 'countryCode': countryCode!,
         if (date != null) 'date': date!,
         if (deliveryGuaranteeDate != null)
@@ -11242,7 +11241,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inapplicableCount != null) 'inapplicableCount': inapplicableCount!,
         if (inapplicableReason != null)
           'inapplicableReason': inapplicableReason!,
@@ -11268,7 +11267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (months != null) 'months': months!,
       };
@@ -11300,7 +11299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalChargeSummaries != null)
           'additionalChargeSummaries': additionalChargeSummaries!
               .map((value) => value.toJson())
@@ -11334,7 +11333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (totalAmount != null) 'totalAmount': totalAmount!.toJson(),
         if (type != null) 'type': type!,
       };
@@ -11355,7 +11354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelIds != null) 'labelIds': labelIds!,
       };
 }
@@ -11380,7 +11379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!,
         if (url != null) 'url': url!,
       };
@@ -11441,7 +11440,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (about != null) 'about': about!.toJson(),
         if (country != null) 'country': country!,
         if (hostedLocalStorefrontActive != null)
@@ -11492,7 +11491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inventoryVerificationContactEmail != null)
           'inventoryVerificationContactEmail':
               inventoryVerificationContactEmail!,
@@ -11525,7 +11524,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (shippingCostPolicyUrl != null)
           'shippingCostPolicyUrl': shippingCostPolicyUrl!,
         if (status != null) 'status': status!,
@@ -11550,7 +11549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (posDataProviderId != null) 'posDataProviderId': posDataProviderId!,
         if (posExternalAccountId != null)
           'posExternalAccountId': posExternalAccountId!,
@@ -11591,7 +11590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (countrySettings != null)
           'countrySettings':
@@ -11616,7 +11615,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -11711,7 +11710,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (batchId != null) 'batchId': batchId!,
         if (contactEmail != null) 'contactEmail': contactEmail!,
@@ -11751,7 +11750,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -11808,7 +11807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
         if (gmbAccounts != null) 'gmbAccounts': gmbAccounts!.toJson(),
@@ -11850,7 +11849,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (gmbAccounts != null)
           'gmbAccounts': gmbAccounts!.map((value) => value.toJson()).toList(),
@@ -11881,7 +11880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (posDataProviders != null)
           'posDataProviders':
@@ -11916,7 +11915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -11938,7 +11937,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -11958,7 +11957,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -11978,7 +11977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -11997,7 +11996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -12024,7 +12023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!,
         if (status != null) 'status': status!,
       };
@@ -12051,7 +12050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (linkedAccountId != null) 'linkedAccountId': linkedAccountId!,
         if (services != null)
           'services': services!.map((value) => value.toJson()).toList(),
@@ -12082,7 +12081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountLabels != null)
           'accountLabels':
               accountLabels!.map((value) => value.toJson()).toList(),
@@ -12106,7 +12105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountReturnCarriers != null)
           'accountReturnCarriers':
               accountReturnCarriers!.map((value) => value.toJson()).toList(),
@@ -12137,7 +12136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
           'resources': resources!.map((value) => value.toJson()).toList(),
@@ -12168,7 +12167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
           'resources': resources!.map((value) => value.toJson()).toList(),
@@ -12199,7 +12198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (csses != null)
           'csses': csses!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -12230,7 +12229,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (regions != null)
           'regions': regions!.map((value) => value.toJson()).toList(),
@@ -12262,7 +12261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (repricingProductReports != null)
           'repricingProductReports':
@@ -12294,7 +12293,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (repricingRuleReports != null)
           'repricingRuleReports':
@@ -12326,7 +12325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (repricingRules != null)
           'repricingRules':
@@ -12350,7 +12349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (returnPolicies != null)
           'returnPolicies':
               returnPolicies!.map((value) => value.toJson()).toList(),
@@ -12451,7 +12450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availability != null) 'availability': availability!,
         if (instoreProductLocation != null)
           'instoreProductLocation': instoreProductLocation!,
@@ -12483,7 +12482,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -12529,7 +12528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (localInventory != null) 'localInventory': localInventory!.toJson(),
         if (merchantId != null) 'merchantId': merchantId!,
@@ -12562,7 +12561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -12597,7 +12596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -12620,7 +12619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locationIds != null) 'locationIds': locationIds!,
       };
 }
@@ -12655,7 +12654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (pointsValue != null) 'pointsValue': pointsValue!,
         if (ratio != null) 'ratio': ratio!,
@@ -12722,7 +12721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationDate != null) 'creationDate': creationDate!,
         if (merchantOrderId != null) 'merchantOrderId': merchantOrderId!,
         if (orderId != null) 'orderId': orderId!,
@@ -12828,7 +12827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerReturnReason != null)
           'customerReturnReason': customerReturnReason!.toJson(),
         if (itemId != null) 'itemId': itemId!,
@@ -12865,7 +12864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (reasonCode != null) 'reasonCode': reasonCode!,
       };
@@ -12900,7 +12899,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clicks != null) 'clicks': clicks!,
         if (ctr != null) 'ctr': ctr!,
         if (impressions != null) 'impressions': impressions!,
@@ -12922,7 +12921,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (storeCodeSetWithMovs != null)
           'storeCodeSetWithMovs':
               storeCodeSetWithMovs!.map((value) => value.toJson()).toList(),
@@ -12956,7 +12955,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (storeCodes != null) 'storeCodes': storeCodes!,
         if (value != null) 'value': value!.toJson(),
       };
@@ -12989,7 +12988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (priceAmount != null) 'priceAmount': priceAmount!.toJson(),
         if (taxAmount != null) 'taxAmount': taxAmount!.toJson(),
       };
@@ -13008,7 +13007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerServiceEmail != null)
           'customerServiceEmail': customerServiceEmail!,
       };
@@ -13215,7 +13214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acknowledged != null) 'acknowledged': acknowledged!,
         if (annotations != null)
           'annotations': annotations!.map((value) => value.toJson()).toList(),
@@ -13314,7 +13313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (fullAddress != null) 'fullAddress': fullAddress!,
         if (isPostOfficeBox != null) 'isPostOfficeBox': isPostOfficeBox!,
@@ -13383,7 +13382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actor != null) 'actor': actor!,
         if (creationDate != null) 'creationDate': creationDate!,
         if (quantity != null) 'quantity': quantity!,
@@ -13432,7 +13431,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullName != null) 'fullName': fullName!,
         if (invoiceReceivingEmail != null)
           'invoiceReceivingEmail': invoiceReceivingEmail!,
@@ -13460,7 +13459,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (loyaltyNumber != null) 'loyaltyNumber': loyaltyNumber!,
         if (name != null) 'name': name!,
       };
@@ -13503,7 +13502,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (explicitMarketingPreference != null)
           'explicitMarketingPreference': explicitMarketingPreference!,
         if (lastUpdatedTimestamp != null)
@@ -13532,7 +13531,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!.toJson(),
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
       };
@@ -13679,7 +13678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adjustments != null)
           'adjustments': adjustments!.map((value) => value.toJson()).toList(),
         if (annotations != null)
@@ -13737,7 +13736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (priceAdjustment != null)
           'priceAdjustment': priceAdjustment!.toJson(),
         if (taxAdjustment != null) 'taxAdjustment': taxAdjustment!.toJson(),
@@ -13856,7 +13855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (brand != null) 'brand': brand!,
         if (condition != null) 'condition': condition!,
         if (contentLanguage != null) 'contentLanguage': contentLanguage!,
@@ -13896,7 +13895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (name != null) 'name': name!,
       };
@@ -13920,7 +13919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!,
         if (value != null) 'value': value!,
       };
@@ -13956,7 +13955,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (daysToReturn != null) 'daysToReturn': daysToReturn!,
         if (isReturnable != null) 'isReturnable': isReturnable!,
         if (policyUrl != null) 'policyUrl': policyUrl!,
@@ -14011,7 +14010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deliverByDate != null) 'deliverByDate': deliverByDate!,
         if (method != null) 'method': method!.toJson(),
         if (pickupPromiseInMinutes != null)
@@ -14059,7 +14058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrier != null) 'carrier': carrier!,
         if (maxDaysInTransit != null) 'maxDaysInTransit': maxDaysInTransit!,
         if (methodName != null) 'methodName': methodName!,
@@ -14087,7 +14086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -14111,7 +14110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -14158,7 +14157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!.toJson(),
         if (collectors != null)
           'collectors': collectors!.map((value) => value.toJson()).toList(),
@@ -14185,7 +14184,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
       };
@@ -14319,7 +14318,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicableItems != null)
           'applicableItems':
               applicableItems!.map((value) => value.toJson()).toList(),
@@ -14377,7 +14376,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (offerId != null) 'offerId': offerId!,
         if (productId != null) 'productId': productId!,
@@ -14446,7 +14445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actor != null) 'actor': actor!,
         if (amount != null) 'amount': amount!.toJson(),
         if (creationDate != null) 'creationDate': creationDate!,
@@ -14496,7 +14495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disbursementAmount != null)
           'disbursementAmount': disbursementAmount!.toJson(),
         if (disbursementCreationDate != null)
@@ -14570,7 +14569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disbursementAmount != null)
           'disbursementAmount': disbursementAmount!.toJson(),
         if (disbursementCreationDate != null)
@@ -14632,7 +14631,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actor != null) 'actor': actor!,
         if (creationDate != null) 'creationDate': creationDate!,
         if (quantity != null) 'quantity': quantity!,
@@ -14744,7 +14743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrier != null) 'carrier': carrier!,
         if (creationDate != null) 'creationDate': creationDate!,
         if (deliveryDate != null) 'deliveryDate': deliveryDate!,
@@ -14789,7 +14788,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (productId != null) 'productId': productId!,
         if (quantity != null) 'quantity': quantity!,
@@ -14817,7 +14816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrierPhoneNumber != null)
           'carrierPhoneNumber': carrierPhoneNumber!,
         if (scheduledDate != null) 'scheduledDate': scheduledDate!,
@@ -14927,7 +14926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerShippingFee != null)
           'customerShippingFee': customerShippingFee!.toJson(),
         if (deliveryPostalCode != null)
@@ -14994,7 +14993,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gtin != null) 'gtin': gtin!,
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (mpn != null) 'mpn': mpn!,
@@ -15035,7 +15034,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (quantity != null) 'quantity': quantity!,
         if (shipmentId != null) 'shipmentId': shipmentId!,
@@ -15153,7 +15152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actualDeliveryTime != null)
           'actualDeliveryTime': actualDeliveryTime!.toJson(),
         if (carrierName != null) 'carrierName': carrierName!,
@@ -15226,7 +15225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (invoiceId != null) 'invoiceId': invoiceId!,
         if (invoiceSummary != null) 'invoiceSummary': invoiceSummary!.toJson(),
         if (lineItemInvoices != null)
@@ -15260,7 +15259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -15322,7 +15321,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (invoiceId != null) 'invoiceId': invoiceId!,
         if (operationId != null) 'operationId': operationId!,
         if (refundOnlyOption != null)
@@ -15357,7 +15356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -15404,7 +15403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (reason != null) 'reason': reason!,
       };
@@ -15438,7 +15437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (reason != null) 'reason': reason!,
       };
@@ -15474,7 +15473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disbursements != null)
           'disbursements':
               disbursements!.map((value) => value.toJson()).toList(),
@@ -15513,7 +15512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (transactions != null)
@@ -15536,7 +15535,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationId != null) 'operationId': operationId!,
       };
 }
@@ -15563,7 +15562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -15604,7 +15603,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItems != null)
           'lineItems': lineItems!.map((value) => value.toJson()).toList(),
         if (operationId != null) 'operationId': operationId!,
@@ -15642,7 +15641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
         if (orderReturn != null) 'orderReturn': orderReturn!.toJson(),
@@ -15669,7 +15668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (quantity != null) 'quantity': quantity!,
       };
@@ -15702,7 +15701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -15733,7 +15732,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (priceAmount != null) 'priceAmount': priceAmount!.toJson(),
         if (taxAmount != null) 'taxAmount': taxAmount!.toJson(),
       };
@@ -15778,7 +15777,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullChargeReturnShippingCost != null)
           'fullChargeReturnShippingCost': fullChargeReturnShippingCost!,
         if (operationId != null) 'operationId': operationId!,
@@ -15811,7 +15810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -15863,7 +15862,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullRefund != null) 'fullRefund': fullRefund!,
         if (partialRefund != null) 'partialRefund': partialRefund!.toJson(),
         if (paymentType != null) 'paymentType': paymentType!,
@@ -15891,7 +15890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reason != null) 'reason': reason!,
         if (reasonText != null) 'reasonText': reasonText!,
       };
@@ -15925,7 +15924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (refund != null) 'refund': refund!.toJson(),
         if (reject != null) 'reject': reject!.toJson(),
         if (returnItemId != null) 'returnItemId': returnItemId!,
@@ -15946,7 +15945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationId != null) 'operationId': operationId!,
       };
 }
@@ -15973,7 +15972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -15993,7 +15992,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -16052,7 +16051,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (operationId != null) 'operationId': operationId!,
         if (productId != null) 'productId': productId!,
@@ -16084,7 +16083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -16121,7 +16120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationId != null) 'operationId': operationId!,
         if (reason != null) 'reason': reason!,
         if (reasonText != null) 'reasonText': reasonText!,
@@ -16150,7 +16149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -16171,7 +16170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reason != null) 'reason': reason!,
       };
 }
@@ -16190,7 +16189,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -16229,7 +16228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (templateName != null) 'templateName': templateName!,
         if (testOrder != null) 'testOrder': testOrder!.toJson(),
@@ -16256,7 +16255,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (orderId != null) 'orderId': orderId!,
       };
@@ -16278,7 +16277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
       };
@@ -16304,7 +16303,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (returnId != null) 'returnId': returnId!,
       };
@@ -16329,7 +16328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (quantity != null) 'quantity': quantity!,
       };
@@ -16383,7 +16382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (fullRefund != null) 'fullRefund': fullRefund!,
         if (lineItemId != null) 'lineItemId': lineItemId!,
@@ -16418,7 +16417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (fullRefund != null) 'fullRefund': fullRefund!,
       };
@@ -16456,7 +16455,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrier != null) 'carrier': carrier!,
         if (shipmentId != null) 'shipmentId': shipmentId!,
         if (trackingId != null) 'trackingId': trackingId!,
@@ -16485,7 +16484,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrierPhoneNumber != null)
           'carrierPhoneNumber': carrierPhoneNumber!,
         if (scheduledDate != null) 'scheduledDate': scheduledDate!,
@@ -16513,7 +16512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (order != null) 'order': order!.toJson(),
       };
@@ -16540,7 +16539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (template != null) 'template': template!.toJson(),
       };
@@ -16621,7 +16620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (operationId != null) 'operationId': operationId!,
         if (priceAmount != null) 'priceAmount': priceAmount!.toJson(),
@@ -16655,7 +16654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -16688,7 +16687,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -16750,7 +16749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (operationId != null) 'operationId': operationId!,
@@ -16782,7 +16781,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -16834,7 +16833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (fullRefund != null) 'fullRefund': fullRefund!,
         if (operationId != null) 'operationId': operationId!,
@@ -16865,7 +16864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -16923,7 +16922,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (operationId != null) 'operationId': operationId!,
         if (productId != null) 'productId': productId!,
@@ -16955,7 +16954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -17039,7 +17038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (operationId != null) 'operationId': operationId!,
         if (priceAmount != null) 'priceAmount': priceAmount!.toJson(),
@@ -17073,7 +17072,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -17119,7 +17118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotations != null)
           'annotations': annotations!.map((value) => value.toJson()).toList(),
         if (lineItemId != null) 'lineItemId': lineItemId!,
@@ -17150,7 +17149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -17202,7 +17201,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItems != null)
           'lineItems': lineItems!.map((value) => value.toJson()).toList(),
         if (operationId != null) 'operationId': operationId!,
@@ -17235,7 +17234,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -17290,7 +17289,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deliverByDate != null) 'deliverByDate': deliverByDate!,
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (operationId != null) 'operationId': operationId!,
@@ -17322,7 +17321,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -17350,7 +17349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (merchantOrderId != null) 'merchantOrderId': merchantOrderId!,
         if (operationId != null) 'operationId': operationId!,
       };
@@ -17378,7 +17377,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -17473,7 +17472,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrier != null) 'carrier': carrier!,
         if (deliveryDate != null) 'deliveryDate': deliveryDate!,
         if (lastPickupDate != null) 'lastPickupDate': lastPickupDate!,
@@ -17510,7 +17509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionStatus != null) 'executionStatus': executionStatus!,
         if (kind != null) 'kind': kind!,
       };
@@ -17538,7 +17537,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrierName != null) 'carrierName': carrierName!,
         if (serviceName != null) 'serviceName': serviceName!,
       };
@@ -17574,7 +17573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrierName != null) 'carrierName': carrierName!,
         if (country != null) 'country': country!,
         if (serviceName != null) 'serviceName': serviceName!,
@@ -17597,7 +17596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -17671,7 +17670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (inventory != null) 'inventory': inventory!.toJson(),
         if (merchantId != null) 'merchantId': merchantId!,
@@ -17707,7 +17706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -17762,7 +17761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
         if (inventory != null) 'inventory': inventory!.toJson(),
@@ -17794,7 +17793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (posDataProviders != null)
           'posDataProviders':
@@ -17826,7 +17825,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (fullName != null) 'fullName': fullName!,
         if (providerId != null) 'providerId': providerId!,
@@ -17914,7 +17913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentLanguage != null) 'contentLanguage': contentLanguage!,
         if (gtin != null) 'gtin': gtin!,
         if (itemId != null) 'itemId': itemId!,
@@ -17999,7 +17998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentLanguage != null) 'contentLanguage': contentLanguage!,
         if (gtin != null) 'gtin': gtin!,
         if (itemId != null) 'itemId': itemId!,
@@ -18091,7 +18090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentLanguage != null) 'contentLanguage': contentLanguage!,
         if (gtin != null) 'gtin': gtin!,
         if (itemId != null) 'itemId': itemId!,
@@ -18125,7 +18124,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (resources != null)
           'resources': resources!.map((value) => value.toJson()).toList(),
@@ -18221,7 +18220,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentLanguage != null) 'contentLanguage': contentLanguage!,
         if (gtin != null) 'gtin': gtin!,
         if (itemId != null) 'itemId': itemId!,
@@ -18315,7 +18314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentLanguage != null) 'contentLanguage': contentLanguage!,
         if (gtin != null) 'gtin': gtin!,
         if (itemId != null) 'itemId': itemId!,
@@ -18416,7 +18415,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentLanguage != null) 'contentLanguage': contentLanguage!,
         if (gtin != null) 'gtin': gtin!,
         if (itemId != null) 'itemId': itemId!,
@@ -18461,7 +18460,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (storeAddress != null) 'storeAddress': storeAddress!,
         if (storeCode != null) 'storeCode': storeCode!,
@@ -18501,7 +18500,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (name != null) 'name': name!,
         if (postalCodeRanges != null)
@@ -18539,7 +18538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (postalCodeRangeBegin != null)
           'postalCodeRangeBegin': postalCodeRangeBegin!,
         if (postalCodeRangeEnd != null)
@@ -18565,7 +18564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currency != null) 'currency': currency!,
         if (value != null) 'value': value!,
       };
@@ -18590,7 +18589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currency != null) 'currency': currency!,
         if (value != null) 'value': value!,
       };
@@ -19218,7 +19217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalImageLinks != null)
           'additionalImageLinks': additionalImageLinks!,
         if (adsGrouping != null) 'adsGrouping': adsGrouping!,
@@ -19350,7 +19349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (priceAmount != null) 'priceAmount': priceAmount!.toJson(),
         if (remittedTaxAmount != null)
           'remittedTaxAmount': remittedTaxAmount!.toJson(),
@@ -19382,7 +19381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeName != null) 'attributeName': attributeName!,
         if (attributeValue != null) 'attributeValue': attributeValue!,
         if (sectionName != null) 'sectionName': sectionName!,
@@ -19442,7 +19441,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (locationGroupName != null) 'locationGroupName': locationGroupName!,
         if (locationId != null) 'locationId': locationId!,
@@ -19472,7 +19471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unit != null) 'unit': unit!,
         if (value != null) 'value': value!,
       };
@@ -19496,7 +19495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unit != null) 'unit': unit!,
         if (value != null) 'value': value!,
       };
@@ -19574,7 +19573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationDate != null) 'creationDate': creationDate!,
         if (destinationStatuses != null)
           'destinationStatuses':
@@ -19635,7 +19634,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approvedCountries != null) 'approvedCountries': approvedCountries!,
         if (destination != null) 'destination': destination!,
         if (disapprovedCountries != null)
@@ -19708,7 +19707,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicableCountries != null)
           'applicableCountries': applicableCountries!,
         if (attributeName != null) 'attributeName': attributeName!,
@@ -19747,7 +19746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (period != null) 'period': period!,
         if (periodLength != null) 'periodLength': periodLength!,
@@ -19802,7 +19801,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (locationId != null) 'locationId': locationId!,
         if (postalCode != null) 'postalCode': postalCode!,
@@ -19830,7 +19829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unit != null) 'unit': unit!,
         if (value != null) 'value': value!,
       };
@@ -19854,7 +19853,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unit != null) 'unit': unit!,
         if (value != null) 'value': value!,
       };
@@ -19876,7 +19875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -19932,7 +19931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (feedId != null) 'feedId': feedId!,
         if (merchantId != null) 'merchantId': merchantId!,
@@ -19966,7 +19965,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -20010,7 +20009,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -20045,7 +20044,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -20069,7 +20068,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -20121,7 +20120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (destinations != null) 'destinations': destinations!,
         if (includeAttributes != null) 'includeAttributes': includeAttributes!,
@@ -20155,7 +20154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -20200,7 +20199,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -20235,7 +20234,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -20275,7 +20274,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudTopicName != null) 'cloudTopicName': cloudTopicName!,
         if (kind != null) 'kind': kind!,
         if (registeredEvents != null) 'registeredEvents': registeredEvents!,
@@ -20350,7 +20349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicableShippingLabels != null)
           'applicableShippingLabels': applicableShippingLabels!,
         if (carrierRates != null)
@@ -20401,7 +20400,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (reasonCode != null) 'reasonCode': reasonCode!,
       };
@@ -20473,7 +20472,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (geotargetArea != null) 'geotargetArea': geotargetArea!.toJson(),
         if (merchantId != null) 'merchantId': merchantId!,
@@ -20505,7 +20504,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (geotargetCriteriaIds != null)
           'geotargetCriteriaIds': geotargetCriteriaIds!,
       };
@@ -20541,7 +20540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (postalCodes != null)
           'postalCodes': postalCodes!.map((value) => value.toJson()).toList(),
         if (regionCode != null) 'regionCode': regionCode!,
@@ -20582,7 +20581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (begin != null) 'begin': begin!,
         if (end != null) 'end': end!,
       };
@@ -20655,7 +20654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availability != null) 'availability': availability!,
         if (customAttributes != null)
           'customAttributes':
@@ -20685,7 +20684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -20731,7 +20730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (merchantId != null) 'merchantId': merchantId!,
         if (method != null) 'method': method!,
@@ -20765,7 +20764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -20808,7 +20807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -20843,7 +20842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null) 'metrics': metrics!.toJson(),
         if (segments != null) 'segments': segments!.toJson(),
       };
@@ -20961,7 +20960,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicationCount != null) 'applicationCount': applicationCount!,
         if (buyboxWinningProductStats != null)
           'buyboxWinningProductStats': buyboxWinningProductStats!.toJson(),
@@ -20992,7 +20991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buyboxWinsCount != null) 'buyboxWinsCount': buyboxWinsCount!,
       };
 }
@@ -21119,7 +21118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cogsBasedRule != null) 'cogsBasedRule': cogsBasedRule!.toJson(),
         if (countryCode != null) 'countryCode': countryCode!,
         if (effectiveTimePeriod != null)
@@ -21160,7 +21159,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (percentageDelta != null) 'percentageDelta': percentageDelta!,
         if (priceDelta != null) 'priceDelta': priceDelta!,
       };
@@ -21184,7 +21183,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixedTimePeriods != null)
           'fixedTimePeriods':
               fixedTimePeriods!.map((value) => value.toJson()).toList(),
@@ -21214,7 +21213,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -21278,7 +21277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (brandMatcher != null) 'brandMatcher': brandMatcher!.toJson(),
         if (itemGroupIdMatcher != null)
           'itemGroupIdMatcher': itemGroupIdMatcher!.toJson(),
@@ -21309,7 +21308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (strAttributes != null) 'strAttributes': strAttributes!,
       };
 }
@@ -21421,7 +21420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buyboxWinningRuleStats != null)
           'buyboxWinningRuleStats': buyboxWinningRuleStats!.toJson(),
         if (date != null) 'date': date!.toJson(),
@@ -21452,7 +21451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buyboxWonProductCount != null)
           'buyboxWonProductCount': buyboxWonProductCount!,
       };
@@ -21495,7 +21494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (floor != null) 'floor': floor!.toJson(),
         if (useAutoPricingMinPrice != null)
           'useAutoPricingMinPrice': useAutoPricingMinPrice!,
@@ -21530,7 +21529,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (percentageDelta != null) 'percentageDelta': percentageDelta!,
         if (priceDelta != null) 'priceDelta': priceDelta!,
       };
@@ -21561,7 +21560,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (percentageDelta != null) 'percentageDelta': percentageDelta!,
         if (priceDelta != null) 'priceDelta': priceDelta!,
       };
@@ -21623,7 +21622,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!.toJson(),
         if (country != null) 'country': country!,
         if (kind != null) 'kind': kind!,
@@ -21685,7 +21684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (locality != null) 'locality': locality!,
         if (postalCode != null) 'postalCode': postalCode!,
@@ -21776,7 +21775,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (kind != null) 'kind': kind!,
         if (label != null) 'label': label!,
@@ -21898,7 +21897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countries != null) 'countries': countries!,
         if (itemConditions != null) 'itemConditions': itemConditions!,
         if (label != null) 'label': label!,
@@ -21942,7 +21941,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (days != null) 'days': days!,
         if (type != null) 'type': type!,
       };
@@ -21972,7 +21971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixedFee != null) 'fixedFee': fixedFee!.toJson(),
         if (microPercent != null) 'microPercent': microPercent!,
       };
@@ -22017,7 +22016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (returnLabelSource != null) 'returnLabelSource': returnLabelSource!,
         if (returnReasonCategory != null)
           'returnReasonCategory': returnReasonCategory!,
@@ -22057,7 +22056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixedFee != null) 'fixedFee': fixedFee!.toJson(),
         if (type != null) 'type': type!,
       };
@@ -22107,7 +22106,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastReturnDate != null) 'lastReturnDate': lastReturnDate!,
         if (numberOfDays != null) 'numberOfDays': numberOfDays!,
         if (type != null) 'type': type!,
@@ -22157,7 +22156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!,
         if (name != null) 'name': name!,
         if (policy != null) 'policy': policy!.toJson(),
@@ -22217,7 +22216,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chargeReturnShippingFee != null)
           'chargeReturnShippingFee': chargeReturnShippingFee!,
         if (maxReturnShippingFee != null)
@@ -22291,7 +22290,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationDate != null) 'creationDate': creationDate!,
         if (deliveryDate != null) 'deliveryDate': deliveryDate!,
         if (returnMethodType != null) 'returnMethodType': returnMethodType!,
@@ -22320,7 +22319,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -22369,7 +22368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (merchantId != null) 'merchantId': merchantId!,
         if (method != null) 'method': method!,
@@ -22402,7 +22401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -22443,7 +22442,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -22478,7 +22477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -22502,7 +22501,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -22551,7 +22550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (merchantId != null) 'merchantId': merchantId!,
         if (method != null) 'method': method!,
@@ -22584,7 +22583,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -22625,7 +22624,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -22654,7 +22653,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (resources != null)
           'resources': resources!.map((value) => value.toJson()).toList(),
@@ -22679,7 +22678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cells != null)
           'cells': cells!.map((value) => value.toJson()).toList(),
       };
@@ -22721,7 +22720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
         if (query != null) 'query': query!,
@@ -22752,7 +22751,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
@@ -22797,7 +22796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (offerId != null) 'offerId': offerId!,
         if (program != null) 'program': program!,
@@ -22913,7 +22912,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (active != null) 'active': active!,
         if (currency != null) 'currency': currency!,
         if (deliveryCountry != null) 'deliveryCountry': deliveryCountry!,
@@ -23002,7 +23001,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!,
         if (kind != null) 'kind': kind!,
         if (previousBalance != null)
@@ -23051,7 +23050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (identifiers != null) 'identifiers': identifiers!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -23111,7 +23110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commission != null) 'commission': commission!.toJson(),
         if (description != null) 'description': description!,
         if (transactionAmount != null)
@@ -23156,7 +23155,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (rate != null) 'rate': rate!,
       };
@@ -23206,7 +23205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adjustmentId != null) 'adjustmentId': adjustmentId!,
         if (merchantOrderId != null) 'merchantOrderId': merchantOrderId!,
         if (orderItemId != null) 'orderItemId': orderItemId!,
@@ -23241,7 +23240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (postDate != null) 'postDate': postDate!,
         if (type != null) 'type': type!,
       };
@@ -23274,7 +23273,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -23309,7 +23308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -23355,7 +23354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (invoiceSummary != null) 'invoiceSummary': invoiceSummary!.toJson(),
         if (lineItemInvoices != null)
           'lineItemInvoices':
@@ -23411,7 +23410,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItemId != null) 'lineItemId': lineItemId!,
         if (productId != null) 'productId': productId!,
         if (shipmentUnitIds != null) 'shipmentUnitIds': shipmentUnitIds!,
@@ -23444,7 +23443,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrier != null) 'carrier': carrier!,
         if (trackingNumber != null) 'trackingNumber': trackingNumber!,
       };
@@ -23490,7 +23489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (postalCodeGroups != null)
           'postalCodeGroups':
@@ -23516,7 +23515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -23564,7 +23563,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (batchId != null) 'batchId': batchId!,
         if (merchantId != null) 'merchantId': merchantId!,
@@ -23598,7 +23597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -23641,7 +23640,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchId != null) 'batchId': batchId!,
         if (errors != null) 'errors': errors!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -23676,7 +23675,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carriers != null)
           'carriers': carriers!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -23709,7 +23708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (holidays != null)
           'holidays': holidays!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -23743,7 +23742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (pickupServices != null)
           'pickupServices':
@@ -23778,7 +23777,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
@@ -23829,7 +23828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnHeaders != null) 'columnHeaders': columnHeaders!.toJson(),
         if (name != null) 'name': name!,
         if (rowHeaders != null) 'rowHeaders': rowHeaders!.toJson(),
@@ -23967,7 +23966,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deliveryDetails != null)
           'deliveryDetails': deliveryDetails!.toJson(),
         if (enableOrderinvoices != null)
@@ -24057,7 +24056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (fullAddress != null) 'fullAddress': fullAddress!,
         if (isPostOfficeBox != null) 'isPostOfficeBox': isPostOfficeBox!,
@@ -24094,7 +24093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!.toJson(),
         if (isScheduledDelivery != null)
           'isScheduledDelivery': isScheduledDelivery!,
@@ -24143,7 +24142,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (product != null) 'product': product!.toJson(),
         if (quantityOrdered != null) 'quantityOrdered': quantityOrdered!,
         if (returnInfo != null) 'returnInfo': returnInfo!.toJson(),
@@ -24279,7 +24278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (brand != null) 'brand': brand!,
         if (condition != null) 'condition': condition!,
         if (contentLanguage != null) 'contentLanguage': contentLanguage!,
@@ -24342,7 +24341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locationCode != null) 'locationCode': locationCode!,
         if (pickupLocationAddress != null)
           'pickupLocationAddress': pickupLocationAddress!.toJson(),
@@ -24376,7 +24375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
       };
@@ -24404,7 +24403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (version != null) 'version': version!,
       };
@@ -24447,7 +24446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (postalCodeGroupNames != null)
           'postalCodeGroupNames': postalCodeGroupNames!,
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
@@ -24470,7 +24469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
       };
@@ -24496,7 +24495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxTransitTimeInDays != null)
           'maxTransitTimeInDays': maxTransitTimeInDays!,
         if (minTransitTimeInDays != null)
@@ -24539,7 +24538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalCharges != null)
           'additionalCharges':
               additionalCharges!.map((value) => value.toJson()).toList(),
@@ -24575,7 +24574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalChargeAmount != null)
           'additionalChargeAmount': additionalChargeAmount!.toJson(),
         if (type != null) 'type': type!,
@@ -24615,7 +24614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (taxAmount != null) 'taxAmount': taxAmount!.toJson(),
         if (taxName != null) 'taxName': taxName!,
         if (taxType != null) 'taxType': taxType!,
@@ -24676,7 +24675,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (carrierRateName != null) 'carrierRateName': carrierRateName!,
         if (flatRate != null) 'flatRate': flatRate!.toJson(),
         if (noShipping != null) 'noShipping': noShipping!,
@@ -24709,7 +24708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unit != null) 'unit': unit!,
         if (value != null) 'value': value!,
       };
diff --git a/generated/googleapis/lib/customsearch/v1.dart b/generated/googleapis/lib/customsearch/v1.dart
index df63b0e..4f4ccf1 100644
--- a/generated/googleapis/lib/customsearch/v1.dart
+++ b/generated/googleapis/lib/customsearch/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -694,7 +693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (htmlTitle != null) 'htmlTitle': htmlTitle!,
         if (link != null) 'link': link!,
         if (title != null) 'title': title!,
@@ -727,7 +726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (source != null) 'source': source!,
         if (width != null) 'width': width!,
@@ -785,7 +784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bodyLines != null)
           'bodyLines': bodyLines!.map((value) => value.toJson()).toList(),
         if (displayLink != null) 'displayLink': displayLink!,
@@ -845,7 +844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (byteSize != null) 'byteSize': byteSize!,
         if (contextLink != null) 'contextLink': contextLink!,
         if (height != null) 'height': height!,
@@ -885,7 +884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labelWithOp != null) 'label_with_op': labelWithOp!,
         if (name != null) 'name': name!,
@@ -992,13 +991,12 @@
       mime = _json['mime'] as core.String;
     }
     if (_json.containsKey('pagemap')) {
-      pagemap =
-          (_json['pagemap'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      pagemap = (_json['pagemap'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('snippet')) {
       snippet = _json['snippet'] as core.String;
@@ -1008,7 +1006,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheId != null) 'cacheId': cacheId!,
         if (displayLink != null) 'displayLink': displayLink!,
         if (fileFormat != null) 'fileFormat': fileFormat!,
@@ -1359,7 +1357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (cr != null) 'cr': cr!,
         if (cx != null) 'cx': cx!,
@@ -1731,7 +1729,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (cr != null) 'cr': cr!,
         if (cx != null) 'cx': cx!,
@@ -2103,7 +2101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (cr != null) 'cr': cr!,
         if (cx != null) 'cx': cx!,
@@ -2179,7 +2177,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPage != null)
           'nextPage': nextPage!.map((value) => value.toJson()).toList(),
         if (previousPage != null)
@@ -2221,7 +2219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedSearchTime != null)
           'formattedSearchTime': formattedSearchTime!,
         if (formattedTotalResults != null)
@@ -2250,7 +2248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (correctedQuery != null) 'correctedQuery': correctedQuery!,
         if (htmlCorrectedQuery != null)
           'htmlCorrectedQuery': htmlCorrectedQuery!,
@@ -2279,7 +2277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (template != null) 'template': template!,
         if (type != null) 'type': type!,
       };
@@ -2329,13 +2327,12 @@
 
   Search.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
-      context =
-          (_json['context'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      context = (_json['context'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
@@ -2370,7 +2367,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/datafusion/v1.dart b/generated/googleapis/lib/datafusion/v1.dart
index cc791ee..21bf0ad 100644
--- a/generated/googleapis/lib/datafusion/v1.dart
+++ b/generated/googleapis/lib/datafusion/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -907,7 +906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorType != null) 'acceleratorType': acceleratorType!,
         if (state != null) 'state': state!,
       };
@@ -954,7 +953,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -996,7 +995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1068,7 +1067,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1083,7 +1082,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -1100,7 +1099,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -1164,7 +1163,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1359,13 +1358,12 @@
       gcsBucket = _json['gcsBucket'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1375,13 +1373,12 @@
           _json['networkConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('options')) {
-      options =
-          (_json['options'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      options = (_json['options'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('p4ServiceAccount')) {
       p4ServiceAccount = _json['p4ServiceAccount'] as core.String;
@@ -1418,7 +1415,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accelerators != null)
           'accelerators': accelerators!.map((value) => value.toJson()).toList(),
         if (apiEndpoint != null) 'apiEndpoint': apiEndpoint!,
@@ -1476,7 +1473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableVersions != null)
           'availableVersions':
               availableVersions!.map((value) => value.toJson()).toList(),
@@ -1515,7 +1512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1545,7 +1542,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1574,7 +1571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1618,32 +1615,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1687,7 +1682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipAllocation != null) 'ipAllocation': ipAllocation!,
         if (network != null) 'network': network!,
       };
@@ -1747,29 +1742,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1814,14 +1807,14 @@
 
   OperationMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('additionalStatus')) {
-      additionalStatus = (_json['additionalStatus'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      additionalStatus =
+          (_json['additionalStatus'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('apiVersion')) {
       apiVersion = _json['apiVersion'] as core.String;
@@ -1846,7 +1839,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalStatus != null) 'additionalStatus': additionalStatus!,
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
@@ -1963,7 +1956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -1981,7 +1974,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for `SetIamPolicy` method.
@@ -2011,7 +2004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -2050,8 +2043,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2064,7 +2057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2090,7 +2083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2111,7 +2104,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2146,7 +2139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableFeatures != null) 'availableFeatures': availableFeatures!,
         if (defaultVersion != null) 'defaultVersion': defaultVersion!,
         if (versionNumber != null) 'versionNumber': versionNumber!,
diff --git a/generated/googleapis/lib/dataproc/v1.dart b/generated/googleapis/lib/dataproc/v1.dart
index 1591eb9..00a3a7b 100644
--- a/generated/googleapis/lib/dataproc/v1.dart
+++ b/generated/googleapis/lib/dataproc/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3593,7 +3592,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorCount != null) 'acceleratorCount': acceleratorCount!,
         if (acceleratorTypeUri != null)
           'acceleratorTypeUri': acceleratorTypeUri!,
@@ -3621,7 +3620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policyUri != null) 'policyUri': policyUri!,
       };
 }
@@ -3686,7 +3685,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicAlgorithm != null) 'basicAlgorithm': basicAlgorithm!.toJson(),
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
@@ -3723,7 +3722,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cooldownPeriod != null) 'cooldownPeriod': cooldownPeriod!,
         if (yarnConfig != null) 'yarnConfig': yarnConfig!.toJson(),
       };
@@ -3811,7 +3810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gracefulDecommissionTimeout != null)
           'gracefulDecommissionTimeout': gracefulDecommissionTimeout!,
         if (scaleDownFactor != null) 'scaleDownFactor': scaleDownFactor!,
@@ -3890,7 +3889,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -3905,7 +3904,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Describes the identifying information, config, and status of a cluster of
@@ -3982,13 +3981,12 @@
           _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('metrics')) {
       metrics = ClusterMetrics.fromJson(
@@ -4009,7 +4007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterName != null) 'clusterName': clusterName!,
         if (clusterUuid != null) 'clusterUuid': clusterUuid!,
         if (config != null) 'config': config!.toJson(),
@@ -4188,7 +4186,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscalingConfig != null)
           'autoscalingConfig': autoscalingConfig!.toJson(),
         if (configBucket != null) 'configBucket': configBucket!,
@@ -4229,28 +4227,26 @@
 
   ClusterMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('hdfsMetrics')) {
-      hdfsMetrics = (_json['hdfsMetrics'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      hdfsMetrics =
+          (_json['hdfsMetrics'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('yarnMetrics')) {
-      yarnMetrics = (_json['yarnMetrics'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      yarnMetrics =
+          (_json['yarnMetrics'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hdfsMetrics != null) 'hdfsMetrics': hdfsMetrics!,
         if (yarnMetrics != null) 'yarnMetrics': yarnMetrics!,
       };
@@ -4287,7 +4283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!,
         if (operationId != null) 'operationId': operationId!,
@@ -4349,13 +4345,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('operationType')) {
       operationType = _json['operationType'] as core.String;
@@ -4378,7 +4373,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterName != null) 'clusterName': clusterName!,
         if (clusterUuid != null) 'clusterUuid': clusterUuid!,
         if (description != null) 'description': description!,
@@ -4436,7 +4431,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!,
         if (innerState != null) 'innerState': innerState!,
         if (state != null) 'state': state!,
@@ -4465,21 +4460,20 @@
 
   ClusterSelector.fromJson(core.Map _json) {
     if (_json.containsKey('clusterLabels')) {
-      clusterLabels = (_json['clusterLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      clusterLabels =
+          (_json['clusterLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterLabels != null) 'clusterLabels': clusterLabels!,
         if (zone != null) 'zone': zone!,
       };
@@ -4542,7 +4536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detail != null) 'detail': detail!,
         if (state != null) 'state': state!,
         if (stateStartTime != null) 'stateStartTime': stateStartTime!,
@@ -4558,7 +4552,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The location of diagnostic output.
@@ -4579,7 +4573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputUri != null) 'outputUri': outputUri!,
       };
 }
@@ -4625,7 +4619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bootDiskSizeGb != null) 'bootDiskSizeGb': bootDiskSizeGb!,
         if (bootDiskType != null) 'bootDiskType': bootDiskType!,
         if (numLocalSsds != null) 'numLocalSsds': numLocalSsds!,
@@ -4646,7 +4640,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Encryption settings for the cluster.
@@ -4665,7 +4659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcePdKmsKeyName != null) 'gcePdKmsKeyName': gcePdKmsKeyName!,
       };
 }
@@ -4695,16 +4689,16 @@
     }
     if (_json.containsKey('httpPorts')) {
       httpPorts =
-          (_json['httpPorts'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+          (_json['httpPorts'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableHttpPortAccess != null)
           'enableHttpPortAccess': enableHttpPortAccess!,
         if (httpPorts != null) 'httpPorts': httpPorts!,
@@ -4772,7 +4766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -4906,13 +4900,12 @@
       internalIpOnly = _json['internalIpOnly'] as core.bool;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('networkUri')) {
       networkUri = _json['networkUri'] as core.String;
@@ -4954,7 +4947,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (internalIpOnly != null) 'internalIpOnly': internalIpOnly!,
         if (metadata != null) 'metadata': metadata!,
         if (networkUri != null) 'networkUri': networkUri!,
@@ -4990,7 +4983,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -5017,7 +5010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -5120,18 +5113,17 @@
       mainJarFileUri = _json['mainJarFileUri'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (archiveUris != null) 'archiveUris': archiveUris!,
         if (args != null) 'args': args!,
         if (fileUris != null) 'fileUris': fileUris!,
@@ -5195,14 +5187,13 @@
           .toList();
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('queryFileUri')) {
       queryFileUri = _json['queryFileUri'] as core.String;
@@ -5212,18 +5203,17 @@
           _json['queryList'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scriptVariables')) {
-      scriptVariables = (_json['scriptVariables'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      scriptVariables =
+          (_json['scriptVariables'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (continueOnFailure != null) 'continueOnFailure': continueOnFailure!,
         if (jarFileUris != null) 'jarFileUris': jarFileUris!,
         if (properties != null) 'properties': properties!,
@@ -5259,7 +5249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterUuid != null) 'clusterUuid': clusterUuid!,
         if (credentialsCiphertext != null)
           'credentialsCiphertext': credentialsCiphertext!,
@@ -5321,7 +5311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxInstances != null) 'maxInstances': maxInstances!,
         if (minInstances != null) 'minInstances': minInstances!,
         if (weight != null) 'weight': weight!,
@@ -5477,7 +5467,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accelerators != null)
           'accelerators': accelerators!.map((value) => value.toJson()).toList(),
         if (diskConfig != null) 'diskConfig': diskConfig!.toJson(),
@@ -5521,7 +5511,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceId != null) 'instanceId': instanceId!,
         if (instanceName != null) 'instanceName': instanceName!,
         if (publicKey != null) 'publicKey': publicKey!,
@@ -5563,14 +5553,13 @@
 
   InstantiateWorkflowTemplateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('requestId')) {
       requestId = _json['requestId'] as core.String;
@@ -5580,7 +5569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null) 'parameters': parameters!,
         if (requestId != null) 'requestId': requestId!,
         if (version != null) 'version': version!,
@@ -5735,13 +5724,12 @@
       jobUuid = _json['jobUuid'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('pigJob')) {
       pigJob = PigJob.fromJson(
@@ -5797,7 +5785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (driverControlFilesUri != null)
           'driverControlFilesUri': driverControlFilesUri!,
@@ -5866,7 +5854,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobId != null) 'jobId': jobId!,
         if (operationType != null) 'operationType': operationType!,
         if (startTime != null) 'startTime': startTime!,
@@ -5896,14 +5884,13 @@
 
   JobPlacement.fromJson(core.Map _json) {
     if (_json.containsKey('clusterLabels')) {
-      clusterLabels = (_json['clusterLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      clusterLabels =
+          (_json['clusterLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('clusterName')) {
       clusterName = _json['clusterName'] as core.String;
@@ -5913,7 +5900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterLabels != null) 'clusterLabels': clusterLabels!,
         if (clusterName != null) 'clusterName': clusterName!,
         if (clusterUuid != null) 'clusterUuid': clusterUuid!,
@@ -5949,7 +5936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobId != null) 'jobId': jobId!,
         if (projectId != null) 'projectId': projectId!,
       };
@@ -5984,7 +5971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxFailuresPerHour != null)
           'maxFailuresPerHour': maxFailuresPerHour!,
         if (maxFailuresTotal != null) 'maxFailuresTotal': maxFailuresTotal!,
@@ -6057,7 +6044,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!,
         if (state != null) 'state': state!,
         if (stateStartTime != null) 'stateStartTime': stateStartTime!,
@@ -6221,7 +6208,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (crossRealmTrustAdminServer != null)
           'crossRealmTrustAdminServer': crossRealmTrustAdminServer!,
         if (crossRealmTrustKdc != null)
@@ -6302,7 +6289,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoDeleteTime != null) 'autoDeleteTime': autoDeleteTime!,
         if (autoDeleteTtl != null) 'autoDeleteTtl': autoDeleteTtl!,
         if (idleDeleteTtl != null) 'idleDeleteTtl': idleDeleteTtl!,
@@ -6336,7 +6323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (policies != null)
           'policies': policies!.map((value) => value.toJson()).toList(),
@@ -6372,7 +6359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusters != null)
           'clusters': clusters!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6408,7 +6395,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -6436,7 +6423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -6472,7 +6459,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (templates != null)
           'templates': templates!.map((value) => value.toJson()).toList(),
@@ -6491,18 +6478,17 @@
 
   LoggingConfig.fromJson(core.Map _json) {
     if (_json.containsKey('driverLogLevels')) {
-      driverLogLevels = (_json['driverLogLevels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      driverLogLevels =
+          (_json['driverLogLevels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driverLogLevels != null) 'driverLogLevels': driverLogLevels!,
       };
 }
@@ -6545,17 +6531,16 @@
           _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterName != null) 'clusterName': clusterName!,
         if (config != null) 'config': config!.toJson(),
         if (labels != null) 'labels': labels!,
@@ -6586,7 +6571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceGroupManagerName != null)
           'instanceGroupManagerName': instanceGroupManagerName!,
         if (instanceTemplateName != null)
@@ -6611,7 +6596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataprocMetastoreService != null)
           'dataprocMetastoreService': dataprocMetastoreService!,
       };
@@ -6640,7 +6625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodeGroupUri != null) 'nodeGroupUri': nodeGroupUri!,
       };
 }
@@ -6675,7 +6660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executableFile != null) 'executableFile': executableFile!,
         if (executionTimeout != null) 'executionTimeout': executionTimeout!,
       };
@@ -6735,29 +6720,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -6854,13 +6837,12 @@
           _json['hiveJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('pigJob')) {
       pigJob = PigJob.fromJson(
@@ -6900,7 +6882,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hadoopJob != null) 'hadoopJob': hadoopJob!.toJson(),
         if (hiveJob != null) 'hiveJob': hiveJob!.toJson(),
         if (labels != null) 'labels': labels!,
@@ -6938,7 +6920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (regex != null) 'regex': regex!.toJson(),
         if (values != null) 'values': values!.toJson(),
       };
@@ -7005,14 +6987,13 @@
           _json['loggingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('queryFileUri')) {
       queryFileUri = _json['queryFileUri'] as core.String;
@@ -7022,18 +7003,17 @@
           _json['queryList'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scriptVariables')) {
-      scriptVariables = (_json['scriptVariables'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      scriptVariables =
+          (_json['scriptVariables'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (continueOnFailure != null) 'continueOnFailure': continueOnFailure!,
         if (jarFileUris != null) 'jarFileUris': jarFileUris!,
         if (loggingConfig != null) 'loggingConfig': loggingConfig!.toJson(),
@@ -7137,7 +7117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -7210,14 +7190,13 @@
       outputFormat = _json['outputFormat'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('queryFileUri')) {
       queryFileUri = _json['queryFileUri'] as core.String;
@@ -7228,7 +7207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientTags != null) 'clientTags': clientTags!,
         if (continueOnFailure != null) 'continueOnFailure': continueOnFailure!,
         if (loggingConfig != null) 'loggingConfig': loggingConfig!.toJson(),
@@ -7332,14 +7311,13 @@
       mainPythonFileUri = _json['mainPythonFileUri'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('pythonFileUris')) {
       pythonFileUris = (_json['pythonFileUris'] as core.List)
@@ -7348,7 +7326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (archiveUris != null) 'archiveUris': archiveUris!,
         if (args != null) 'args': args!,
         if (fileUris != null) 'fileUris': fileUris!,
@@ -7383,7 +7361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queries != null) 'queries': queries!,
       };
 }
@@ -7408,7 +7386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (regexes != null) 'regexes': regexes!,
       };
 }
@@ -7452,7 +7430,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumeReservationType != null)
           'consumeReservationType': consumeReservationType!,
         if (key != null) 'key': key!,
@@ -7476,7 +7454,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kerberosConfig != null) 'kerberosConfig': kerberosConfig!.toJson(),
       };
 }
@@ -7499,7 +7477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -7537,7 +7515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableIntegrityMonitoring != null)
           'enableIntegrityMonitoring': enableIntegrityMonitoring!,
         if (enableSecureBoot != null) 'enableSecureBoot': enableSecureBoot!,
@@ -7589,18 +7567,17 @@
           .toList();
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageVersion != null) 'imageVersion': imageVersion!,
         if (optionalComponents != null)
           'optionalComponents': optionalComponents!,
@@ -7698,18 +7675,17 @@
       mainJarFileUri = _json['mainJarFileUri'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (archiveUris != null) 'archiveUris': archiveUris!,
         if (args != null) 'args': args!,
         if (fileUris != null) 'fileUris': fileUris!,
@@ -7795,18 +7771,17 @@
       mainRFileUri = _json['mainRFileUri'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (archiveUris != null) 'archiveUris': archiveUris!,
         if (args != null) 'args': args!,
         if (fileUris != null) 'fileUris': fileUris!,
@@ -7863,14 +7838,13 @@
           _json['loggingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('queryFileUri')) {
       queryFileUri = _json['queryFileUri'] as core.String;
@@ -7880,18 +7854,17 @@
           _json['queryList'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scriptVariables')) {
-      scriptVariables = (_json['scriptVariables'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      scriptVariables =
+          (_json['scriptVariables'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jarFileUris != null) 'jarFileUris': jarFileUris!,
         if (loggingConfig != null) 'loggingConfig': loggingConfig!.toJson(),
         if (properties != null) 'properties': properties!,
@@ -7934,7 +7907,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterUuid != null) 'clusterUuid': clusterUuid!,
         if (requestId != null) 'requestId': requestId!,
       };
@@ -7973,8 +7946,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -7987,7 +7960,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -8027,7 +8000,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterUuid != null) 'clusterUuid': clusterUuid!,
         if (requestId != null) 'requestId': requestId!,
       };
@@ -8065,7 +8038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (job != null) 'job': job!.toJson(),
         if (requestId != null) 'requestId': requestId!,
       };
@@ -8150,7 +8123,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (fields != null) 'fields': fields!,
         if (name != null) 'name': name!,
@@ -8177,7 +8150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -8197,7 +8170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -8219,7 +8192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -8242,7 +8215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodes != null)
           'nodes': nodes!.map((value) => value.toJson()).toList(),
       };
@@ -8367,14 +8340,13 @@
           _json['graph'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -8390,7 +8362,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterName != null) 'clusterName': clusterName!,
         if (clusterUuid != null) 'clusterUuid': clusterUuid!,
         if (createCluster != null) 'createCluster': createCluster!.toJson(),
@@ -8465,7 +8437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!,
         if (jobId != null) 'jobId': jobId!,
         if (prerequisiteStepIds != null)
@@ -8575,13 +8547,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -8604,7 +8575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (dagTimeout != null) 'dagTimeout': dagTimeout!,
         if (id != null) 'id': id!,
@@ -8644,7 +8615,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterSelector != null)
           'clusterSelector': clusterSelector!.toJson(),
         if (managedCluster != null) 'managedCluster': managedCluster!.toJson(),
@@ -8709,7 +8680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (progress != null) 'progress': progress!,
         if (state != null) 'state': state!,
diff --git a/generated/googleapis/lib/datastore/v1.dart b/generated/googleapis/lib/datastore/v1.dart
index 7cf7d38..5e7aa37 100644
--- a/generated/googleapis/lib/datastore/v1.dart
+++ b/generated/googleapis/lib/datastore/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -880,7 +879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keys != null) 'keys': keys!.map((value) => value.toJson()).toList(),
       };
 }
@@ -902,7 +901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keys != null) 'keys': keys!.map((value) => value.toJson()).toList(),
       };
 }
@@ -926,7 +925,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
       };
@@ -946,7 +945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transactionOptions != null)
           'transactionOptions': transactionOptions!.toJson(),
       };
@@ -972,7 +971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transaction != null) 'transaction': transaction!,
       };
 }
@@ -1031,7 +1030,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mode != null) 'mode': mode!,
         if (mutations != null)
           'mutations': mutations!.map((value) => value.toJson()).toList(),
@@ -1064,7 +1063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexUpdates != null) 'indexUpdates': indexUpdates!,
         if (mutationResults != null)
           'mutationResults':
@@ -1100,7 +1099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filters != null)
           'filters': filters!.map((value) => value.toJson()).toList(),
         if (op != null) 'op': op!,
@@ -1121,7 +1120,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A Datastore data object.
@@ -1151,18 +1150,17 @@
       key = Key.fromJson(_json['key'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Value.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Value.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!.toJson(),
         if (properties != null)
           'properties':
@@ -1210,7 +1208,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cursor != null) 'cursor': cursor!,
         if (entity != null) 'entity': entity!.toJson(),
         if (version != null) 'version': version!,
@@ -1238,7 +1236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compositeFilter != null)
           'compositeFilter': compositeFilter!.toJson(),
         if (propertyFilter != null) 'propertyFilter': propertyFilter!.toJson(),
@@ -1293,13 +1291,12 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('operationType')) {
       operationType = _json['operationType'] as core.String;
@@ -1312,7 +1309,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (labels != null) 'labels': labels!,
         if (operationType != null) 'operationType': operationType!,
@@ -1358,7 +1355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kinds != null) 'kinds': kinds!,
         if (namespaceIds != null) 'namespaceIds': namespaceIds!,
       };
@@ -1410,7 +1407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (common != null) 'common': common!.toJson(),
         if (entityFilter != null) 'entityFilter': entityFilter!.toJson(),
         if (outputUrlPrefix != null) 'outputUrlPrefix': outputUrlPrefix!,
@@ -1455,20 +1452,19 @@
           _json['entityFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('outputUrlPrefix')) {
       outputUrlPrefix = _json['outputUrlPrefix'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityFilter != null) 'entityFilter': entityFilter!.toJson(),
         if (labels != null) 'labels': labels!,
         if (outputUrlPrefix != null) 'outputUrlPrefix': outputUrlPrefix!,
@@ -1493,7 +1489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputUrl != null) 'outputUrl': outputUrl!,
       };
 }
@@ -1542,7 +1538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (common != null) 'common': common!.toJson(),
         if (entityFilter != null) 'entityFilter': entityFilter!.toJson(),
         if (inputUrl != null) 'inputUrl': inputUrl!,
@@ -1593,17 +1589,16 @@
       inputUrl = _json['inputUrl'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityFilter != null) 'entityFilter': entityFilter!.toJson(),
         if (inputUrl != null) 'inputUrl': inputUrl!,
         if (labels != null) 'labels': labels!,
@@ -1691,7 +1686,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ancestor != null) 'ancestor': ancestor!,
         if (indexId != null) 'indexId': indexId!,
         if (kind != null) 'kind': kind!,
@@ -1729,7 +1724,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (common != null) 'common': common!.toJson(),
         if (indexId != null) 'indexId': indexId!,
         if (progressEntities != null)
@@ -1768,7 +1763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (direction != null) 'direction': direction!,
         if (name != null) 'name': name!,
       };
@@ -1797,7 +1792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexes != null)
           'indexes': indexes!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1827,7 +1822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (workCompleted != null) 'workCompleted': workCompleted!,
         if (workEstimated != null) 'workEstimated': workEstimated!,
       };
@@ -1879,13 +1874,12 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('operationType')) {
       operationType = _json['operationType'] as core.String;
@@ -1898,7 +1892,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (labels != null) 'labels': labels!,
         if (operationType != null) 'operationType': operationType!,
@@ -1944,7 +1938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kinds != null) 'kinds': kinds!,
         if (namespaceIds != null) 'namespaceIds': namespaceIds!,
       };
@@ -1996,7 +1990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (common != null) 'common': common!.toJson(),
         if (entityFilter != null) 'entityFilter': entityFilter!.toJson(),
         if (outputUrlPrefix != null) 'outputUrlPrefix': outputUrlPrefix!,
@@ -2025,7 +2019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputUrl != null) 'outputUrl': outputUrl!,
       };
 }
@@ -2074,7 +2068,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (common != null) 'common': common!.toJson(),
         if (entityFilter != null) 'entityFilter': entityFilter!.toJson(),
         if (inputUrl != null) 'inputUrl': inputUrl!,
@@ -2107,7 +2101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (workCompleted != null) 'workCompleted': workCompleted!,
         if (workEstimated != null) 'workEstimated': workEstimated!,
       };
@@ -2136,7 +2130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -2197,29 +2191,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2263,15 +2255,14 @@
       allowLiterals = _json['allowLiterals'] as core.bool;
     }
     if (_json.containsKey('namedBindings')) {
-      namedBindings = (_json['namedBindings'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GqlQueryParameter.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      namedBindings =
+          (_json['namedBindings'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GqlQueryParameter.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('positionalBindings')) {
       positionalBindings = (_json['positionalBindings'] as core.List)
@@ -2284,7 +2275,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowLiterals != null) 'allowLiterals': allowLiterals!,
         if (namedBindings != null)
           'namedBindings': namedBindings!
@@ -2324,7 +2315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cursor != null) 'cursor': cursor!,
         if (value != null) 'value': value!.toJson(),
       };
@@ -2373,7 +2364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (partitionId != null) 'partitionId': partitionId!.toJson(),
         if (path != null) 'path': path!.map((value) => value.toJson()).toList(),
       };
@@ -2392,7 +2383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -2424,7 +2415,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
@@ -2455,7 +2446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keys != null) 'keys': keys!.map((value) => value.toJson()).toList(),
         if (readOptions != null) 'readOptions': readOptions!.toJson(),
       };
@@ -2504,7 +2495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deferred != null)
           'deferred': deferred!.map((value) => value.toJson()).toList(),
         if (found != null)
@@ -2569,7 +2560,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseVersion != null) 'baseVersion': baseVersion!,
         if (delete != null) 'delete': delete!.toJson(),
         if (insert != null) 'insert': insert!.toJson(),
@@ -2613,7 +2604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conflictDetected != null) 'conflictDetected': conflictDetected!,
         if (key != null) 'key': key!.toJson(),
         if (version != null) 'version': version!,
@@ -2649,7 +2640,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namespaceId != null) 'namespaceId': namespaceId!,
         if (projectId != null) 'projectId': projectId!,
       };
@@ -2692,7 +2683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -2713,7 +2704,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (property != null) 'property': property!.toJson(),
       };
 }
@@ -2753,7 +2744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (op != null) 'op': op!,
         if (property != null) 'property': property!.toJson(),
         if (value != null) 'value': value!.toJson(),
@@ -2786,7 +2777,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (direction != null) 'direction': direction!,
         if (property != null) 'property': property!.toJson(),
       };
@@ -2807,7 +2798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -2919,7 +2910,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (distinctOn != null)
           'distinctOn': distinctOn!.map((value) => value.toJson()).toList(),
         if (endCursor != null) 'endCursor': endCursor!,
@@ -3026,7 +3017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endCursor != null) 'endCursor': endCursor!,
         if (entityResultType != null) 'entityResultType': entityResultType!,
         if (entityResults != null)
@@ -3047,7 +3038,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The options shared by read requests.
@@ -3086,7 +3077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (readConsistency != null) 'readConsistency': readConsistency!,
         if (transaction != null) 'transaction': transaction!,
       };
@@ -3112,7 +3103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (previousTransaction != null)
           'previousTransaction': previousTransaction!,
       };
@@ -3143,7 +3134,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (databaseId != null) 'databaseId': databaseId!,
         if (keys != null) 'keys': keys!.map((value) => value.toJson()).toList(),
       };
@@ -3157,7 +3148,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The request for Datastore.Rollback.
@@ -3183,7 +3174,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transaction != null) 'transaction': transaction!,
       };
 }
@@ -3198,7 +3189,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The request for Datastore.RunQuery.
@@ -3239,7 +3230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gqlQuery != null) 'gqlQuery': gqlQuery!.toJson(),
         if (partitionId != null) 'partitionId': partitionId!.toJson(),
         if (query != null) 'query': query!.toJson(),
@@ -3268,7 +3259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batch != null) 'batch': batch!.toJson(),
         if (query != null) 'query': query!.toJson(),
       };
@@ -3307,8 +3298,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3321,7 +3312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -3353,7 +3344,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (readOnly != null) 'readOnly': readOnly!.toJson(),
         if (readWrite != null) 'readWrite': readWrite!.toJson(),
       };
@@ -3473,7 +3464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arrayValue != null) 'arrayValue': arrayValue!.toJson(),
         if (blobValue != null) 'blobValue': blobValue!,
         if (booleanValue != null) 'booleanValue': booleanValue!,
diff --git a/generated/googleapis/lib/deploymentmanager/v2.dart b/generated/googleapis/lib/deploymentmanager/v2.dart
index 8ac5261..f39736d 100644
--- a/generated/googleapis/lib/deploymentmanager/v2.dart
+++ b/generated/googleapis/lib/deploymentmanager/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1284,7 +1283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1326,7 +1325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1398,7 +1397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1417,7 +1416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
       };
 }
@@ -1551,7 +1550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (id != null) 'id': id!,
@@ -1587,7 +1586,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -1633,7 +1632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (labels != null)
           'labels': labels!.map((value) => value.toJson()).toList(),
@@ -1660,7 +1659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -1694,7 +1693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fingerprint != null) 'fingerprint': fingerprint!,
       };
 }
@@ -1726,7 +1725,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployments != null)
           'deployments': deployments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1761,7 +1760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fingerprint != null) 'fingerprint': fingerprint!,
       };
 }
@@ -1827,7 +1826,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1877,7 +1876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -1903,7 +1902,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (name != null) 'name': name!,
       };
@@ -1996,7 +1995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (expandedConfig != null) 'expandedConfig': expandedConfig!,
         if (id != null) 'id': id!,
@@ -2039,7 +2038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (manifests != null)
           'manifests': manifests!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2078,7 +2077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (location != null) 'location': location!,
         if (message != null) 'message': message!,
@@ -2106,7 +2105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -2141,7 +2140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -2233,7 +2232,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -2492,7 +2491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientOperationId != null) 'clientOperationId': clientOperationId!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
         if (description != null) 'description': description!,
@@ -2549,7 +2548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -2660,7 +2659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -2699,7 +2698,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -2791,7 +2790,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -2908,7 +2907,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessControl != null) 'accessControl': accessControl!.toJson(),
         if (finalProperties != null) 'finalProperties': finalProperties!,
         if (id != null) 'id': id!,
@@ -2938,7 +2937,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcpIamPolicy != null) 'gcpIamPolicy': gcpIamPolicy!,
       };
 }
@@ -2975,7 +2974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (location != null) 'location': location!,
         if (message != null) 'message': message!,
@@ -3004,7 +3003,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -3039,7 +3038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -3132,7 +3131,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (message != null) 'message': message!,
@@ -3237,7 +3236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessControl != null) 'accessControl': accessControl!.toJson(),
         if (error != null) 'error': error!.toJson(),
         if (finalProperties != null) 'finalProperties': finalProperties!,
@@ -3273,7 +3272,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
           'resources': resources!.map((value) => value.toJson()).toList(),
@@ -3305,7 +3304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (imports != null)
           'imports': imports!.map((value) => value.toJson()).toList(),
@@ -3328,7 +3327,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3348,7 +3347,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3397,7 +3396,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (insertTime != null) 'insertTime': insertTime!,
         if (name != null) 'name': name!,
@@ -3430,7 +3429,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (types != null)
           'types': types!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/dfareporting/v3_4.dart b/generated/googleapis/lib/dfareporting/v3_4.dart
index 609f0a3..b7009ba 100644
--- a/generated/googleapis/lib/dfareporting/v3_4.dart
+++ b/generated/googleapis/lib/dfareporting/v3_4.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -11403,7 +11402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountPermissionIds != null)
           'accountPermissionIds': accountPermissionIds!,
         if (accountProfile != null) 'accountProfile': accountProfile!,
@@ -11480,7 +11479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (activeAds != null) 'activeAds': activeAds!,
         if (activeAdsLimitTier != null)
@@ -11547,7 +11546,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountProfiles != null) 'accountProfiles': accountProfiles!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -11586,7 +11585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -11619,7 +11618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountPermissionGroups != null)
           'accountPermissionGroups':
               accountPermissionGroups!.map((value) => value.toJson()).toList(),
@@ -11651,7 +11650,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountPermissions != null)
           'accountPermissions':
               accountPermissions!.map((value) => value.toJson()).toList(),
@@ -11809,7 +11808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (active != null) 'active': active!,
         if (advertiserFilter != null)
@@ -11860,7 +11859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountUserProfiles != null)
           'accountUserProfiles':
               accountUserProfiles!.map((value) => value.toJson()).toList(),
@@ -11899,7 +11898,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accounts != null)
           'accounts': accounts!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -11940,7 +11939,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filters != null)
           'filters': filters!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -12328,7 +12327,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (active != null) 'active': active!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
@@ -12440,7 +12439,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clickThroughUrl != null) 'clickThroughUrl': clickThroughUrl!,
         if (creativeBundleId != null) 'creativeBundleId': creativeBundleId!,
         if (enabled != null) 'enabled': enabled!,
@@ -12521,7 +12520,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comment != null) 'comment': comment!,
         if (compatibility != null) 'compatibility': compatibility!,
         if (height != null) 'height': height!,
@@ -12563,7 +12562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ads != null) 'ads': ads!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -12711,7 +12710,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserGroupId != null) 'advertiserGroupId': advertiserGroupId!,
         if (clickThroughUrlSuffix != null)
@@ -12779,7 +12778,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -12817,7 +12816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserGroups != null)
           'advertiserGroups':
               advertiserGroups!.map((value) => value.toJson()).toList(),
@@ -12856,7 +12855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (landingPages != null)
           'landingPages': landingPages!.map((value) => value.toJson()).toList(),
@@ -12894,7 +12893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertisers != null)
           'advertisers': advertisers!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -12935,7 +12934,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allocation != null) 'allocation': allocation!,
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
@@ -12976,7 +12975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audienceSegments != null)
           'audienceSegments':
               audienceSegments!.map((value) => value.toJson()).toList(),
@@ -13050,7 +13049,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (browserVersionId != null) 'browserVersionId': browserVersionId!,
         if (dartId != null) 'dartId': dartId!,
         if (kind != null) 'kind': kind!,
@@ -13084,7 +13083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (browsers != null)
           'browsers': browsers!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -13321,7 +13320,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (adBlockingConfiguration != null)
           'adBlockingConfiguration': adBlockingConfiguration!.toJson(),
@@ -13400,7 +13399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeId != null) 'creativeId': creativeId!,
         if (kind != null) 'kind': kind!,
       };
@@ -13439,7 +13438,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (campaignCreativeAssociations != null)
           'campaignCreativeAssociations': campaignCreativeAssociations!
               .map((value) => value.toJson())
@@ -13494,7 +13493,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adId != null) 'adId': adId!,
         if (campaignId != null) 'campaignId': campaignId!,
         if (creativeId != null) 'creativeId': creativeId!,
@@ -13534,7 +13533,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (campaigns != null)
           'campaigns': campaigns!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -13638,7 +13637,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (action != null) 'action': action!,
         if (changeTime != null) 'changeTime': changeTime!.toIso8601String(),
@@ -13686,7 +13685,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changeLogs != null)
           'changeLogs': changeLogs!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -13728,7 +13727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fallbackName != null) 'fallbackName': fallbackName!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -13768,7 +13767,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disjunctiveMatchStatements != null)
           'disjunctiveMatchStatements': disjunctiveMatchStatements!
               .map((value) => value.toJson())
@@ -13802,7 +13801,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cities != null)
           'cities': cities!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -13874,7 +13873,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countryCode != null) 'countryCode': countryCode!,
         if (countryDartId != null) 'countryDartId': countryDartId!,
         if (dartId != null) 'dartId': dartId!,
@@ -13921,7 +13920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clickThroughUrl != null)
           'clickThroughUrl': clickThroughUrl!.toJson(),
         if (eventName != null) 'eventName': eventName!,
@@ -13973,7 +13972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (computedClickThroughUrl != null)
           'computedClickThroughUrl': computedClickThroughUrl!,
         if (customClickThroughUrl != null)
@@ -14006,7 +14005,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clickThroughUrlSuffix != null)
           'clickThroughUrlSuffix': clickThroughUrlSuffix!,
         if (overrideInheritedSuffix != null)
@@ -14034,7 +14033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clickThroughUrl != null)
           'clickThroughUrl': clickThroughUrl!.toJson(),
         if (creativeId != null) 'creativeId': creativeId!,
@@ -14079,7 +14078,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (companionsDisabled != null)
           'companionsDisabled': companionsDisabled!,
         if (enabledSizes != null)
@@ -14171,7 +14170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (crossDimensionReachReportCompatibleFields != null)
           'crossDimensionReachReportCompatibleFields':
               crossDimensionReachReportCompatibleFields!.toJson(),
@@ -14224,7 +14223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -14255,7 +14254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectionTypes != null)
           'connectionTypes':
               connectionTypes!.map((value) => value.toJson()).toList(),
@@ -14293,7 +14292,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentCategories != null)
           'contentCategories':
               contentCategories!.map((value) => value.toJson()).toList(),
@@ -14342,7 +14341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -14527,7 +14526,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childDirectedTreatment != null)
           'childDirectedTreatment': childDirectedTreatment!,
         if (customVariables != null)
@@ -14589,7 +14588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (kind != null) 'kind': kind!,
         if (message != null) 'message': message!,
@@ -14628,7 +14627,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversion != null) 'conversion': conversion!.toJson(),
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
@@ -14671,7 +14670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversions != null)
           'conversions': conversions!.map((value) => value.toJson()).toList(),
         if (encryptionInfo != null) 'encryptionInfo': encryptionInfo!.toJson(),
@@ -14711,7 +14710,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hasFailures != null) 'hasFailures': hasFailures!,
         if (kind != null) 'kind': kind!,
         if (status != null)
@@ -14752,7 +14751,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversions != null)
           'conversions': conversions!.map((value) => value.toJson()).toList(),
         if (encryptionInfo != null) 'encryptionInfo': encryptionInfo!.toJson(),
@@ -14792,7 +14791,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hasFailures != null) 'hasFailures': hasFailures!,
         if (kind != null) 'kind': kind!,
         if (status != null)
@@ -14824,7 +14823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countries != null)
           'countries': countries!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -14872,7 +14871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countryCode != null) 'countryCode': countryCode!,
         if (dartId != null) 'dartId': dartId!,
         if (kind != null) 'kind': kind!,
@@ -15617,7 +15616,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (active != null) 'active': active!,
         if (adParameters != null) 'adParameters': adParameters!,
@@ -16288,7 +16287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionScript3 != null) 'actionScript3': actionScript3!,
         if (active != null) 'active': active!,
         if (additionalSizes != null)
@@ -16388,7 +16387,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
       };
@@ -16527,7 +16526,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assetIdentifier != null)
           'assetIdentifier': assetIdentifier!.toJson(),
         if (clickTags != null)
@@ -16584,7 +16583,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultAssetId != null) 'defaultAssetId': defaultAssetId!,
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
@@ -16719,7 +16718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (active != null) 'active': active!,
         if (applyEventTags != null) 'applyEventTags': applyEventTags!,
         if (clickThroughUrl != null)
@@ -16777,7 +16776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (computedClickThroughUrl != null)
           'computedClickThroughUrl': computedClickThroughUrl!,
         if (customClickThroughUrl != null)
@@ -16889,7 +16888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserCustomEventId != null)
           'advertiserCustomEventId': advertiserCustomEventId!,
         if (advertiserCustomEventName != null)
@@ -16974,7 +16973,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (advertiserIdDimensionValue != null)
@@ -17005,7 +17004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeFieldId != null) 'creativeFieldId': creativeFieldId!,
         if (creativeFieldValueId != null)
           'creativeFieldValueId': creativeFieldValueId!,
@@ -17044,7 +17043,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (value != null) 'value': value!,
@@ -17081,7 +17080,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeFieldValues != null)
           'creativeFieldValues':
               creativeFieldValues!.map((value) => value.toJson()).toList(),
@@ -17120,7 +17119,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeFields != null)
           'creativeFields':
               creativeFields!.map((value) => value.toJson()).toList(),
@@ -17205,7 +17204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (advertiserIdDimensionValue != null)
@@ -17240,7 +17239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeGroupId != null) 'creativeGroupId': creativeGroupId!,
         if (creativeGroupNumber != null)
           'creativeGroupNumber': creativeGroupNumber!,
@@ -17277,7 +17276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeGroups != null)
           'creativeGroups':
               creativeGroups!.map((value) => value.toJson()).toList(),
@@ -17331,7 +17330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (optimizationActivitys != null)
@@ -17393,7 +17392,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeAssignments != null)
           'creativeAssignments':
               creativeAssignments!.map((value) => value.toJson()).toList(),
@@ -17436,7 +17435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creatives != null)
           'creatives': creatives!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -17499,7 +17498,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (breakdown != null)
           'breakdown': breakdown!.map((value) => value.toJson()).toList(),
         if (dimensionFilters != null)
@@ -17612,7 +17611,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotateClickEvent != null)
           'annotateClickEvent': annotateClickEvent!.toJson(),
         if (annotateImpressionEvent != null)
@@ -17653,7 +17652,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gclid != null) 'gclid': gclid!,
         if (kind != null) 'kind': kind!,
       };
@@ -17692,7 +17691,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (kind != null) 'kind': kind!,
         if (message != null) 'message': message!,
@@ -17723,7 +17722,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (pathImpressionId != null) 'pathImpressionId': pathImpressionId!,
       };
@@ -17788,7 +17787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cmDimensions != null) 'cmDimensions': cmDimensions!.toJson(),
         if (dv3Dimensions != null) 'dv3Dimensions': dv3Dimensions!.toJson(),
         if (insertEventType != null) 'insertEventType': insertEventType!,
@@ -17830,7 +17829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customEvent != null) 'customEvent': customEvent!.toJson(),
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
@@ -17862,7 +17861,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customEvents != null)
           'customEvents': customEvents!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -17901,7 +17900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hasFailures != null) 'hasFailures': hasFailures!,
         if (kind != null) 'kind': kind!,
         if (status != null)
@@ -18041,7 +18040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
@@ -18073,7 +18072,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filteredEventIds != null)
           'filteredEventIds':
               filteredEventIds!.map((value) => value.toJson()).toList(),
@@ -18110,7 +18109,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (index != null) 'index': index!,
         if (kind != null) 'kind': kind!,
         if (value != null) 'value': value!,
@@ -18143,7 +18142,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configuration != null) 'configuration': configuration!.toJson(),
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
@@ -18191,7 +18190,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audible != null) 'audible': audible!,
         if (timeMillis != null) 'timeMillis': timeMillis!,
         if (timePercent != null) 'timePercent': timePercent!,
@@ -18245,7 +18244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dvCampaignId != null) 'dvCampaignId': dvCampaignId!,
         if (dvCreativeId != null) 'dvCreativeId': dvCreativeId!,
         if (dvInsertionOrderId != null)
@@ -18302,7 +18301,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null)
           'endDate':
               "${(endDate!).year.toString().padLeft(4, '0')}-${(endDate!).month.toString().padLeft(2, '0')}-${(endDate!).day.toString().padLeft(2, '0')}",
@@ -18355,7 +18354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (daysOfWeek != null) 'daysOfWeek': daysOfWeek!,
         if (hoursOfDay != null) 'hoursOfDay': hoursOfDay!,
         if (userLocalTime != null) 'userLocalTime': userLocalTime!,
@@ -18408,7 +18407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appUrl != null) 'appUrl': appUrl!,
         if (fallbackUrl != null) 'fallbackUrl': fallbackUrl!,
         if (kind != null) 'kind': kind!,
@@ -18444,7 +18443,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultClickThroughEventTagId != null)
           'defaultClickThroughEventTagId': defaultClickThroughEventTagId!,
         if (overrideInheritedEventTag != null)
@@ -18513,7 +18512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frequencyCap != null) 'frequencyCap': frequencyCap!.toJson(),
         if (hardCutoff != null) 'hardCutoff': hardCutoff!,
         if (impressionRatio != null) 'impressionRatio': impressionRatio!,
@@ -18559,7 +18558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dfpNetworkCode != null) 'dfpNetworkCode': dfpNetworkCode!,
         if (dfpNetworkName != null) 'dfpNetworkName': dfpNetworkName!,
         if (programmaticPlacementAccepted != null)
@@ -18590,7 +18589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
       };
@@ -18621,7 +18620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionName != null) 'dimensionName': dimensionName!,
         if (kind != null) 'kind': kind!,
         if (value != null) 'value': value!,
@@ -18681,7 +18680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionName != null) 'dimensionName': dimensionName!,
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -18729,7 +18728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -18777,7 +18776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionName != null) 'dimensionName': dimensionName!,
         if (endDate != null)
           'endDate':
@@ -18867,7 +18866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (idDimensionValue != null)
           'idDimensionValue': idDimensionValue!.toJson(),
@@ -18915,7 +18914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeViewOptOut != null) 'activeViewOptOut': activeViewOptOut!,
         if (dfpSettings != null) 'dfpSettings': dfpSettings!.toJson(),
         if (instreamVideoPlacementAccepted != null)
@@ -18955,7 +18954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directorySites != null)
           'directorySites':
               directorySites!.map((value) => value.toJson()).toList(),
@@ -18988,7 +18987,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventFilters != null)
           'eventFilters': eventFilters!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -19046,7 +19045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
         if (objectId != null) 'objectId': objectId!,
@@ -19078,7 +19077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dynamicTargetingKeys != null)
           'dynamicTargetingKeys':
               dynamicTargetingKeys!.map((value) => value.toJson()).toList(),
@@ -19138,7 +19137,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encryptionEntityId != null)
           'encryptionEntityId': encryptionEntityId!,
         if (encryptionEntityType != null)
@@ -19168,7 +19167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionFilter != null)
           'dimensionFilter': dimensionFilter!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -19349,7 +19348,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (advertiserIdDimensionValue != null)
@@ -19395,7 +19394,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
         if (id != null) 'id': id!,
       };
@@ -19425,7 +19424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventTags != null)
           'eventTags': eventTags!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -19451,7 +19450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiUrl != null) 'apiUrl': apiUrl!,
         if (browserUrl != null) 'browserUrl': browserUrl!,
       };
@@ -19546,7 +19545,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dateRange != null) 'dateRange': dateRange!.toJson(),
         if (etag != null) 'etag': etag!,
         if (fileName != null) 'fileName': fileName!,
@@ -19600,7 +19599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -19637,7 +19636,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null)
           'endDate':
               "${(endDate!).year.toString().padLeft(4, '0')}-${(endDate!).month.toString().padLeft(2, '0')}-${(endDate!).day.toString().padLeft(2, '0')}",
@@ -19684,7 +19683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (floodlightActivityTag != null)
           'floodlightActivityTag': floodlightActivityTag!,
         if (globalSiteTagGlobalSnippet != null)
@@ -19723,7 +19722,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (floodlightActivities != null)
           'floodlightActivities':
               floodlightActivities!.map((value) => value.toJson()).toList(),
@@ -20022,7 +20021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (advertiserIdDimensionValue != null)
@@ -20096,7 +20095,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (tag != null) 'tag': tag!,
@@ -20223,7 +20222,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (advertiserIdDimensionValue != null)
@@ -20277,7 +20276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (floodlightActivityGroups != null)
           'floodlightActivityGroups':
               floodlightActivityGroups!.map((value) => value.toJson()).toList(),
@@ -20337,7 +20336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clickThrough != null) 'clickThrough': clickThrough!,
         if (directorySiteId != null) 'directorySiteId': directorySiteId!,
         if (dynamicTag != null) 'dynamicTag': dynamicTag!.toJson(),
@@ -20511,7 +20510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (advertiserIdDimensionValue != null)
@@ -20577,7 +20576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (floodlightConfigurations != null)
           'floodlightConfigurations':
               floodlightConfigurations!.map((value) => value.toJson()).toList(),
@@ -20630,7 +20629,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionFilters != null)
           'dimensionFilters':
               dimensionFilters!.map((value) => value.toJson()).toList(),
@@ -20667,7 +20666,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (impressions != null) 'impressions': impressions!,
       };
@@ -20716,7 +20715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (left != null) 'left': left!,
         if (positionOption != null) 'positionOption': positionOption!,
         if (top != null) 'top': top!,
@@ -20810,7 +20809,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cities != null)
           'cities': cities!.map((value) => value.toJson()).toList(),
         if (countries != null)
@@ -20972,7 +20971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (adSlots != null)
           'adSlots': adSlots!.map((value) => value.toJson()).toList(),
@@ -21032,7 +21031,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inventoryItems != null)
           'inventoryItems':
               inventoryItems!.map((value) => value.toJson()).toList(),
@@ -21054,7 +21053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expression != null) 'expression': expression!,
       };
 }
@@ -21122,7 +21121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (archived != null) 'archived': archived!,
         if (deepLinks != null)
@@ -21172,7 +21171,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (languageCode != null) 'languageCode': languageCode!,
@@ -21199,7 +21198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languages != null)
           'languages': languages!.map((value) => value.toJson()).toList(),
       };
@@ -21229,7 +21228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (languages != null)
           'languages': languages!.map((value) => value.toJson()).toList(),
@@ -21249,7 +21248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (time != null) 'time': time!,
       };
 }
@@ -21274,7 +21273,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (terms != null)
           'terms': terms!.map((value) => value.toJson()).toList(),
       };
@@ -21315,7 +21314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (floodlightActivityId != null)
           'floodlightActivityId': floodlightActivityId!,
         if (floodlightActivityName != null)
@@ -21421,7 +21420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contains != null) 'contains': contains!,
         if (negation != null) 'negation': negation!,
         if (operator != null) 'operator': operator!,
@@ -21447,7 +21446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expression != null) 'expression': expression!,
       };
 }
@@ -21482,7 +21481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clickDuration != null) 'clickDuration': clickDuration!,
         if (postImpressionActivitiesDuration != null)
           'postImpressionActivitiesDuration': postImpressionActivitiesDuration!,
@@ -21508,7 +21507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
       };
@@ -21570,7 +21569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countryCode != null) 'countryCode': countryCode!,
         if (countryDartId != null) 'countryDartId': countryDartId!,
         if (dartId != null) 'dartId': dartId!,
@@ -21605,7 +21604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (metros != null)
           'metros': metros!.map((value) => value.toJson()).toList(),
@@ -21657,7 +21656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directory != null) 'directory': directory!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -21696,7 +21695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (mobileApps != null)
           'mobileApps': mobileApps!.map((value) => value.toJson()).toList(),
@@ -21743,7 +21742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countryCode != null) 'countryCode': countryCode!,
         if (countryDartId != null) 'countryDartId': countryDartId!,
         if (id != null) 'id': id!,
@@ -21776,7 +21775,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (mobileCarriers != null)
           'mobileCarriers':
@@ -21848,7 +21847,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iconClickThroughUrl != null)
           'iconClickThroughUrl': iconClickThroughUrl!,
         if (iconClickTrackingUrl != null)
@@ -21902,7 +21901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (objectIds != null) 'objectIds': objectIds!,
         if (status != null) 'status': status!,
@@ -21928,7 +21927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (left != null) 'left': left!,
         if (top != null) 'top': top!,
       };
@@ -21959,7 +21958,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (omnitureCostDataEnabled != null)
           'omnitureCostDataEnabled': omnitureCostDataEnabled!,
         if (omnitureIntegrationEnabled != null)
@@ -22008,7 +22007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dartId != null) 'dartId': dartId!,
         if (desktop != null) 'desktop': desktop!,
         if (kind != null) 'kind': kind!,
@@ -22065,7 +22064,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (majorVersion != null) 'majorVersion': majorVersion!,
@@ -22102,7 +22101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (operatingSystemVersions != null)
           'operatingSystemVersions':
@@ -22134,7 +22133,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (operatingSystems != null)
           'operatingSystems':
@@ -22177,7 +22176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (floodlightActivityId != null)
           'floodlightActivityId': floodlightActivityId!,
         if (floodlightActivityIdDimensionValue != null)
@@ -22328,7 +22327,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (approverUserProfileIds != null)
@@ -22403,7 +22402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactInfo != null) 'contactInfo': contactInfo!,
         if (contactName != null) 'contactName': contactName!,
         if (contactTitle != null) 'contactTitle': contactTitle!,
@@ -22533,7 +22532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (amendedOrderDocumentId != null)
@@ -22590,7 +22589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (orderDocuments != null)
@@ -22629,7 +22628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (orders != null)
@@ -22675,7 +22674,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventFilters != null)
           'eventFilters': eventFilters!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -22738,7 +22737,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelGroupings != null)
           'channelGroupings':
               channelGroupings!.map((value) => value.toJson()).toList(),
@@ -22804,7 +22803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionName != null) 'dimensionName': dimensionName!,
         if (ids != null) 'ids': ids!,
         if (kind != null) 'kind': kind!,
@@ -22870,7 +22869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversionDimensions != null)
           'conversionDimensions':
               conversionDimensions!.map((value) => value.toJson()).toList(),
@@ -23283,7 +23282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (adBlockingOptOut != null) 'adBlockingOptOut': adBlockingOptOut!,
         if (additionalSizes != null)
@@ -23387,7 +23386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (active != null) 'active': active!,
         if (placementId != null) 'placementId': placementId!,
         if (placementIdDimensionValue != null)
@@ -23630,7 +23629,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (advertiserIdDimensionValue != null)
@@ -23703,7 +23702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (placementGroups != null)
@@ -23742,7 +23741,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (placementStrategies != null)
@@ -23790,7 +23789,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -23820,7 +23819,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (placementId != null) 'placementId': placementId!,
         if (tagDatas != null)
           'tagDatas': tagDatas!.map((value) => value.toJson()).toList(),
@@ -23851,7 +23850,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (placementTags != null)
           'placementTags':
@@ -23889,7 +23888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (placements != null)
@@ -23924,7 +23923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -23955,7 +23954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (platformTypes != null)
           'platformTypes':
@@ -24034,7 +24033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!.toJson(),
         if (offset != null) 'offset': offset!.toJson(),
         if (positionType != null) 'positionType': positionType!,
@@ -24088,7 +24087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (countryCode != null) 'countryCode': countryCode!,
         if (countryDartId != null) 'countryDartId': countryDartId!,
@@ -24121,7 +24120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (postalCodes != null)
           'postalCodes': postalCodes!.map((value) => value.toJson()).toList(),
@@ -24197,7 +24196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (capCostType != null) 'capCostType': capCostType!,
         if (endDate != null)
           'endDate':
@@ -24284,7 +24283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (capCostOption != null) 'capCostOption': capCostOption!,
         if (endDate != null)
           'endDate':
@@ -24344,7 +24343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null)
           'endDate':
               "${(endDate!).year.toString().padLeft(4, '0')}-${(endDate!).month.toString().padLeft(2, '0')}-${(endDate!).day.toString().padLeft(2, '0')}",
@@ -24513,7 +24512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (audienceAgeGroup != null) 'audienceAgeGroup': audienceAgeGroup!,
@@ -24575,7 +24574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (projects != null)
@@ -24648,7 +24647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionFilters != null)
           'dimensionFilters':
               dimensionFilters!.map((value) => value.toJson()).toList(),
@@ -24694,7 +24693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deliveryType != null) 'deliveryType': deliveryType!,
         if (email != null) 'email': email!,
         if (kind != null) 'kind': kind!,
@@ -24746,7 +24745,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countryCode != null) 'countryCode': countryCode!,
         if (countryDartId != null) 'countryDartId': countryDartId!,
         if (dartId != null) 'dartId': dartId!,
@@ -24780,7 +24779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (regions != null)
           'regions': regions!.map((value) => value.toJson()).toList(),
@@ -24915,7 +24914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (active != null) 'active': active!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
@@ -24977,7 +24976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (remarketingListId != null) 'remarketingListId': remarketingListId!,
         if (sharedAccountIds != null) 'sharedAccountIds': sharedAccountIds!,
@@ -25016,7 +25015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (remarketingLists != null)
@@ -25083,7 +25082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activities != null) 'activities': activities!.toJson(),
         if (customRichMediaEvents != null)
           'customRichMediaEvents': customRichMediaEvents!.toJson(),
@@ -25164,7 +25163,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (breakdown != null)
           'breakdown': breakdown!.map((value) => value.toJson()).toList(),
         if (dateRange != null) 'dateRange': dateRange!.toJson(),
@@ -25216,7 +25215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emailOwner != null) 'emailOwner': emailOwner!,
         if (emailOwnerDeliveryType != null)
           'emailOwnerDeliveryType': emailOwnerDeliveryType!,
@@ -25262,7 +25261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeAttributedIPConversions != null)
           'includeAttributedIPConversions': includeAttributedIPConversions!,
         if (includeUnattributedCookieConversions != null)
@@ -25342,7 +25341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customRichMediaEvents != null)
           'customRichMediaEvents':
               customRichMediaEvents!.map((value) => value.toJson()).toList(),
@@ -25427,7 +25426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activityFilters != null)
           'activityFilters':
               activityFilters!.map((value) => value.toJson()).toList(),
@@ -25511,7 +25510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activityFilters != null)
           'activityFilters':
               activityFilters!.map((value) => value.toJson()).toList(),
@@ -25621,7 +25620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clicksLookbackWindow != null)
           'clicksLookbackWindow': clicksLookbackWindow!,
         if (impressionsLookbackWindow != null)
@@ -25731,7 +25730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activityFilters != null)
           'activityFilters':
               activityFilters!.map((value) => value.toJson()).toList(),
@@ -25834,7 +25833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activities != null) 'activities': activities!.toJson(),
         if (customRichMediaEvents != null)
           'customRichMediaEvents': customRichMediaEvents!.toJson(),
@@ -25921,7 +25920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (active != null) 'active': active!,
         if (every != null) 'every': every!,
         if (expirationDate != null)
@@ -26094,7 +26093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (criteria != null) 'criteria': criteria!.toJson(),
         if (crossDimensionReachCriteria != null)
@@ -26177,7 +26176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionFilters != null)
           'dimensionFilters':
               dimensionFilters!.map((value) => value.toJson()).toList(),
@@ -26230,7 +26229,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -26288,7 +26287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exposureToConversionEnabled != null)
           'exposureToConversionEnabled': exposureToConversionEnabled!,
         if (lookbackConfiguration != null)
@@ -26328,7 +26327,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clickThroughUrl != null)
           'clickThroughUrl': clickThroughUrl!.toJson(),
         if (enabled != null) 'enabled': enabled!,
@@ -26372,7 +26371,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assetId != null) 'assetId': assetId!,
         if (name != null) 'name': name!,
         if (targetingTemplateId != null)
@@ -26497,7 +26496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (approved != null) 'approved': approved!,
         if (directorySiteId != null) 'directorySiteId': directorySiteId!,
@@ -26556,7 +26555,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (companionsDisabled != null)
           'companionsDisabled': companionsDisabled!,
         if (enabledSizes != null)
@@ -26628,7 +26627,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (contactType != null) 'contactType': contactType!,
         if (email != null) 'email': email!,
@@ -26708,7 +26707,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeViewOptOut != null) 'activeViewOptOut': activeViewOptOut!,
         if (adBlockingOptOut != null) 'adBlockingOptOut': adBlockingOptOut!,
         if (disableNewCookie != null) 'disableNewCookie': disableNewCookie!,
@@ -26763,7 +26762,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (progressOffset != null) 'progressOffset': progressOffset!.toJson(),
         if (skipOffset != null) 'skipOffset': skipOffset!.toJson(),
@@ -26796,7 +26795,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabledVideoFormats != null)
           'enabledVideoFormats': enabledVideoFormats!,
         if (kind != null) 'kind': kind!,
@@ -26871,7 +26870,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (companionSettings != null)
           'companionSettings': companionSettings!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -26915,7 +26914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sites != null)
@@ -26970,7 +26969,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (iab != null) 'iab': iab!,
         if (id != null) 'id': id!,
@@ -27003,7 +27002,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (sizes != null)
           'sizes': sizes!.map((value) => value.toJson()).toList(),
@@ -27051,7 +27050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (progressOffset != null) 'progressOffset': progressOffset!.toJson(),
         if (skipOffset != null) 'skipOffset': skipOffset!.toJson(),
@@ -27087,7 +27086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
         if (sortOrder != null) 'sortOrder': sortOrder!,
@@ -27142,7 +27141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (availablePermissionIds != null)
           'availablePermissionIds': availablePermissionIds!,
@@ -27182,7 +27181,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (subaccounts != null)
@@ -27251,7 +27250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adId != null) 'adId': adId!,
         if (clickTag != null) 'clickTag': clickTag!,
         if (creativeId != null) 'creativeId': creativeId!,
@@ -27305,7 +27304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalKeyValues != null)
           'additionalKeyValues': additionalKeyValues!,
         if (includeClickThroughUrls != null)
@@ -27335,7 +27334,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dynamicTagEnabled != null) 'dynamicTagEnabled': dynamicTagEnabled!,
         if (imageTagEnabled != null) 'imageTagEnabled': imageTagEnabled!,
       };
@@ -27365,7 +27364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customHtml != null) 'customHtml': customHtml!,
         if (targetWindowOption != null)
           'targetWindowOption': targetWindowOption!,
@@ -27487,7 +27486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (active != null) 'active': active!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
@@ -27537,7 +27536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (targetableRemarketingLists != null)
@@ -27662,7 +27661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (advertiserIdDimensionValue != null)
@@ -27715,7 +27714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (targetingTemplates != null)
@@ -27814,7 +27813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (browsers != null)
           'browsers': browsers!.map((value) => value.toJson()).toList(),
         if (connectionTypes != null)
@@ -27856,7 +27855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -27901,7 +27900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (thirdPartyUrlType != null) 'thirdPartyUrlType': thirdPartyUrlType!,
         if (url != null) 'url': url!,
       };
@@ -27932,7 +27931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabledVideoFormats != null)
           'enabledVideoFormats': enabledVideoFormats!,
         if (kind != null) 'kind': kind!,
@@ -27969,7 +27968,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (registry != null) 'registry': registry!,
         if (value != null) 'value': value!,
       };
@@ -28111,7 +28110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataType != null) 'dataType': dataType!,
         if (reportName != null) 'reportName': reportName!,
         if (variableType != null) 'variableType': variableType!,
@@ -28178,7 +28177,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (accountName != null) 'accountName': accountName!,
         if (etag != null) 'etag': etag!,
@@ -28220,7 +28219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -28306,7 +28305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (defaultUserRole != null) 'defaultUserRole': defaultUserRole!,
         if (id != null) 'id': id!,
@@ -28364,7 +28363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availability != null) 'availability': availability!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -28400,7 +28399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -28434,7 +28433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (userRolePermissionGroups != null)
           'userRolePermissionGroups':
@@ -28466,7 +28465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (userRolePermissions != null)
           'userRolePermissions':
@@ -28504,7 +28503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (userRoles != null)
@@ -28558,7 +28557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileType != null) 'fileType': fileType!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -28591,7 +28590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (videoFormats != null)
           'videoFormats': videoFormats!.map((value) => value.toJson()).toList(),
@@ -28623,7 +28622,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (offsetPercentage != null) 'offsetPercentage': offsetPercentage!,
         if (offsetSeconds != null) 'offsetSeconds': offsetSeconds!,
       };
@@ -28701,7 +28700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (companionSettings != null)
           'companionSettings': companionSettings!.toJson(),
         if (kind != null) 'kind': kind!,
diff --git a/generated/googleapis/lib/dialogflow/v2.dart b/generated/googleapis/lib/dialogflow/v2.dart
index 6c429b3..2e82b97 100644
--- a/generated/googleapis/lib/dialogflow/v2.dart
+++ b/generated/googleapis/lib/dialogflow/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3206,7 +3205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!,
         if (config != null) 'config': config!.toJson(),
       };
@@ -3230,7 +3229,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -3255,7 +3254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
       };
@@ -3287,7 +3286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userInput != null) 'userInput': userInput!.toJson(),
         if (virtualAgentOutput != null)
           'virtualAgentOutput': virtualAgentOutput!.toJson(),
@@ -3316,14 +3315,14 @@
 
   GoogleCloudDialogflowCxV3ConversationTurnUserInput.fromJson(core.Map _json) {
     if (_json.containsKey('injectedParameters')) {
-      injectedParameters = (_json['injectedParameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      injectedParameters =
+          (_json['injectedParameters'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('input')) {
       input = GoogleCloudDialogflowCxV3QueryInput.fromJson(
@@ -3334,7 +3333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (injectedParameters != null)
           'injectedParameters': injectedParameters!,
         if (input != null) 'input': input!.toJson(),
@@ -3393,14 +3392,13 @@
           _json['currentPage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diagnosticInfo')) {
-      diagnosticInfo = (_json['diagnosticInfo'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      diagnosticInfo =
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('differences')) {
       differences = (_json['differences'] as core.List)
@@ -3410,14 +3408,14 @@
           .toList();
     }
     if (_json.containsKey('sessionParameters')) {
-      sessionParameters = (_json['sessionParameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      sessionParameters =
+          (_json['sessionParameters'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('status')) {
       status = GoogleRpcStatus.fromJson(
@@ -3436,7 +3434,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentPage != null) 'currentPage': currentPage!.toJson(),
         if (diagnosticInfo != null) 'diagnosticInfo': diagnosticInfo!,
         if (differences != null)
@@ -3467,7 +3465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -3490,7 +3488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (version != null) 'version': version!,
       };
 }
@@ -3511,7 +3509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -3536,7 +3534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digits != null) 'digits': digits!,
         if (finishDigit != null) 'finishDigit': finishDigit!,
       };
@@ -3599,7 +3597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (event != null) 'event': event!,
         if (name != null) 'name': name!,
         if (targetFlow != null) 'targetFlow': targetFlow!,
@@ -3622,7 +3620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (event != null) 'event': event!,
       };
 }
@@ -3656,7 +3654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -3670,7 +3668,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for TestCases.ExportTestCases.
@@ -3701,7 +3699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsUri != null) 'gcsUri': gcsUri!,
       };
@@ -3730,7 +3728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
       };
@@ -3812,7 +3810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (displayName != null) 'displayName': displayName!,
         if (entityType != null) 'entityType': entityType!,
@@ -3872,7 +3870,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (initialPromptFulfillment != null)
           'initialPromptFulfillment': initialPromptFulfillment!.toJson(),
         if (repromptEventHandlers != null)
@@ -3944,7 +3942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conditionalCases != null)
           'conditionalCases':
               conditionalCases!.map((value) => value.toJson()).toList(),
@@ -3980,7 +3978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cases != null)
           'cases': cases!.map((value) => value.toJson()).toList(),
       };
@@ -4020,7 +4018,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseContent != null)
           'caseContent': caseContent!.map((value) => value.toJson()).toList(),
         if (condition != null) 'condition': condition!,
@@ -4050,7 +4048,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalCases != null)
           'additionalCases': additionalCases!.toJson(),
         if (message != null) 'message': message!.toJson(),
@@ -4082,7 +4080,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameter != null) 'parameter': parameter!,
         if (value != null) 'value': value!,
       };
@@ -4109,7 +4107,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
       };
 }
@@ -4130,7 +4128,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -4152,7 +4150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (warnings != null)
           'warnings': warnings!.map((value) => value.toJson()).toList(),
       };
@@ -4175,7 +4173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -4198,7 +4196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -4346,7 +4344,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioEncoding != null) 'audioEncoding': audioEncoding!,
         if (enableWordInfo != null) 'enableWordInfo': enableWordInfo!,
         if (model != null) 'model': model!,
@@ -4436,13 +4434,12 @@
       isFallback = _json['isFallback'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4466,7 +4463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (isFallback != null) 'isFallback': isFallback!,
@@ -4499,7 +4496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intent != null) 'intent': intent!,
       };
 }
@@ -4551,7 +4548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityType != null) 'entityType': entityType!,
         if (id != null) 'id': id!,
         if (isList != null) 'isList': isList!,
@@ -4604,7 +4601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (parts != null)
           'parts': parts!.map((value) => value.toJson()).toList(),
@@ -4635,7 +4632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameterId != null) 'parameterId': parameterId!,
         if (text != null) 'text': text!,
       };
@@ -4740,7 +4737,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (entryFulfillment != null)
           'entryFulfillment': entryFulfillment!.toJson(),
@@ -4782,7 +4779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentPage != null) 'currentPage': currentPage!,
         if (formInfo != null) 'formInfo': formInfo!.toJson(),
       };
@@ -4809,7 +4806,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameterInfo != null)
           'parameterInfo':
               parameterInfo!.map((value) => value.toJson()).toList(),
@@ -4882,7 +4879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (justCollected != null) 'justCollected': justCollected!,
         if (required != null) 'required': required!,
@@ -4950,7 +4947,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!.toJson(),
         if (dtmf != null) 'dtmf': dtmf!.toJson(),
         if (event != null) 'event': event!.toJson(),
@@ -4976,7 +4973,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -5072,13 +5069,12 @@
               _json['outputAudioText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('playAudio')) {
       playAudio = GoogleCloudDialogflowCxV3ResponseMessagePlayAudio.fromJson(
@@ -5090,7 +5086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversationSuccess != null)
           'conversationSuccess': conversationSuccess!.toJson(),
         if (endInteraction != null) 'endInteraction': endInteraction!.toJson(),
@@ -5130,17 +5126,16 @@
   GoogleCloudDialogflowCxV3ResponseMessageConversationSuccess.fromJson(
       core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!,
       };
 }
@@ -5156,7 +5151,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Indicates that the conversation should be handed off to a live agent.
@@ -5181,17 +5176,16 @@
   GoogleCloudDialogflowCxV3ResponseMessageLiveAgentHandoff.fromJson(
       core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!,
       };
 }
@@ -5220,7 +5214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
       };
@@ -5265,7 +5259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (audio != null) 'audio': audio!,
@@ -5306,7 +5300,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (ssml != null) 'ssml': ssml!,
@@ -5342,7 +5336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (audioUri != null) 'audioUri': audioUri!,
@@ -5376,7 +5370,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (text != null) 'text': text!,
@@ -5391,7 +5385,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for TestCases.RunTestCase.
@@ -5408,7 +5402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
       };
 }
@@ -5440,21 +5434,20 @@
 
   GoogleCloudDialogflowCxV3SessionInfo.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('session')) {
       session = _json['session'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null) 'parameters': parameters!,
         if (session != null) 'session': session!,
       };
@@ -5543,7 +5536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (displayName != null) 'displayName': displayName!,
         if (lastTestResult != null) 'lastTestResult': lastTestResult!.toJson(),
@@ -5579,7 +5572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!.toJson(),
         if (testCase != null) 'testCase': testCase!.toJson(),
       };
@@ -5635,7 +5628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversationTurns != null)
           'conversationTurns':
               conversationTurns!.map((value) => value.toJson()).toList(),
@@ -5670,7 +5663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (flow != null) 'flow': flow!,
         if (trackingParameters != null)
           'trackingParameters': trackingParameters!,
@@ -5703,7 +5696,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!.toJson(),
         if (testCase != null) 'testCase': testCase!,
         if (testTime != null) 'testTime': testTime!,
@@ -5735,7 +5728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (type != null) 'type': type!,
       };
@@ -5758,7 +5751,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -5836,7 +5829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!,
         if (intent != null) 'intent': intent!,
         if (name != null) 'name': name!,
@@ -5863,7 +5856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -5937,13 +5930,12 @@
           _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sentimentAnalysisResult')) {
       sentimentAnalysisResult =
@@ -5957,7 +5949,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectIntentResponseId != null)
           'detectIntentResponseId': detectIntentResponseId!,
         if (fulfillmentInfo != null)
@@ -5989,7 +5981,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag != null) 'tag': tag!,
       };
 }
@@ -6034,19 +6026,18 @@
       lastMatchedIntent = _json['lastMatchedIntent'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (displayName != null) 'displayName': displayName!,
         if (lastMatchedIntent != null) 'lastMatchedIntent': lastMatchedIntent!,
@@ -6083,7 +6074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (originalValue != null) 'originalValue': originalValue!,
         if (resolvedValue != null) 'resolvedValue': resolvedValue!,
       };
@@ -6112,7 +6103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (score != null) 'score': score!,
       };
@@ -6169,13 +6160,12 @@
           _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sessionInfo')) {
       sessionInfo = GoogleCloudDialogflowCxV3SessionInfo.fromJson(
@@ -6189,7 +6179,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fulfillmentResponse != null)
           'fulfillmentResponse': fulfillmentResponse!.toJson(),
         if (pageInfo != null) 'pageInfo': pageInfo!.toJson(),
@@ -6230,7 +6220,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mergeBehavior != null) 'mergeBehavior': mergeBehavior!,
         if (messages != null)
           'messages': messages!.map((value) => value.toJson()).toList(),
@@ -6271,7 +6261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!,
         if (config != null) 'config': config!.toJson(),
       };
@@ -6296,7 +6286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -6322,7 +6312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
       };
@@ -6355,7 +6345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userInput != null) 'userInput': userInput!.toJson(),
         if (virtualAgentOutput != null)
           'virtualAgentOutput': virtualAgentOutput!.toJson(),
@@ -6385,14 +6375,14 @@
   GoogleCloudDialogflowCxV3beta1ConversationTurnUserInput.fromJson(
       core.Map _json) {
     if (_json.containsKey('injectedParameters')) {
-      injectedParameters = (_json['injectedParameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      injectedParameters =
+          (_json['injectedParameters'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('input')) {
       input = GoogleCloudDialogflowCxV3beta1QueryInput.fromJson(
@@ -6403,7 +6393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (injectedParameters != null)
           'injectedParameters': injectedParameters!,
         if (input != null) 'input': input!.toJson(),
@@ -6462,14 +6452,13 @@
           _json['currentPage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diagnosticInfo')) {
-      diagnosticInfo = (_json['diagnosticInfo'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      diagnosticInfo =
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('differences')) {
       differences = (_json['differences'] as core.List)
@@ -6479,14 +6468,14 @@
           .toList();
     }
     if (_json.containsKey('sessionParameters')) {
-      sessionParameters = (_json['sessionParameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      sessionParameters =
+          (_json['sessionParameters'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('status')) {
       status = GoogleRpcStatus.fromJson(
@@ -6505,7 +6494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentPage != null) 'currentPage': currentPage!.toJson(),
         if (diagnosticInfo != null) 'diagnosticInfo': diagnosticInfo!,
         if (differences != null)
@@ -6538,7 +6527,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -6561,7 +6550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (version != null) 'version': version!,
       };
 }
@@ -6584,7 +6573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -6609,7 +6598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digits != null) 'digits': digits!,
         if (finishDigit != null) 'finishDigit': finishDigit!,
       };
@@ -6672,7 +6661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (event != null) 'event': event!,
         if (name != null) 'name': name!,
         if (targetFlow != null) 'targetFlow': targetFlow!,
@@ -6695,7 +6684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (event != null) 'event': event!,
       };
 }
@@ -6729,7 +6718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -6743,7 +6732,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for TestCases.ExportTestCases.
@@ -6775,7 +6764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsUri != null) 'gcsUri': gcsUri!,
       };
@@ -6804,7 +6793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
       };
@@ -6886,7 +6875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (displayName != null) 'displayName': displayName!,
         if (entityType != null) 'entityType': entityType!,
@@ -6948,7 +6937,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (initialPromptFulfillment != null)
           'initialPromptFulfillment': initialPromptFulfillment!.toJson(),
         if (repromptEventHandlers != null)
@@ -7022,7 +7011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conditionalCases != null)
           'conditionalCases':
               conditionalCases!.map((value) => value.toJson()).toList(),
@@ -7059,7 +7048,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cases != null)
           'cases': cases!.map((value) => value.toJson()).toList(),
       };
@@ -7099,7 +7088,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseContent != null)
           'caseContent': caseContent!.map((value) => value.toJson()).toList(),
         if (condition != null) 'condition': condition!,
@@ -7129,7 +7118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalCases != null)
           'additionalCases': additionalCases!.toJson(),
         if (message != null) 'message': message!.toJson(),
@@ -7161,7 +7150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameter != null) 'parameter': parameter!,
         if (value != null) 'value': value!,
       };
@@ -7188,7 +7177,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
       };
 }
@@ -7211,7 +7200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -7234,7 +7223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (warnings != null)
           'warnings': warnings!.map((value) => value.toJson()).toList(),
       };
@@ -7258,7 +7247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -7282,7 +7271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -7430,7 +7419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioEncoding != null) 'audioEncoding': audioEncoding!,
         if (enableWordInfo != null) 'enableWordInfo': enableWordInfo!,
         if (model != null) 'model': model!,
@@ -7521,13 +7510,12 @@
       isFallback = _json['isFallback'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -7551,7 +7539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (isFallback != null) 'isFallback': isFallback!,
@@ -7584,7 +7572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intent != null) 'intent': intent!,
       };
 }
@@ -7636,7 +7624,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityType != null) 'entityType': entityType!,
         if (id != null) 'id': id!,
         if (isList != null) 'isList': isList!,
@@ -7689,7 +7677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (parts != null)
           'parts': parts!.map((value) => value.toJson()).toList(),
@@ -7721,7 +7709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameterId != null) 'parameterId': parameterId!,
         if (text != null) 'text': text!,
       };
@@ -7826,7 +7814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (entryFulfillment != null)
           'entryFulfillment': entryFulfillment!.toJson(),
@@ -7868,7 +7856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentPage != null) 'currentPage': currentPage!,
         if (formInfo != null) 'formInfo': formInfo!.toJson(),
       };
@@ -7896,7 +7884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameterInfo != null)
           'parameterInfo':
               parameterInfo!.map((value) => value.toJson()).toList(),
@@ -7969,7 +7957,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (justCollected != null) 'justCollected': justCollected!,
         if (required != null) 'required': required!,
@@ -8037,7 +8025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!.toJson(),
         if (dtmf != null) 'dtmf': dtmf!.toJson(),
         if (event != null) 'event': event!.toJson(),
@@ -8065,7 +8053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -8164,13 +8152,12 @@
               _json['outputAudioText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('playAudio')) {
       playAudio =
@@ -8183,7 +8170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversationSuccess != null)
           'conversationSuccess': conversationSuccess!.toJson(),
         if (endInteraction != null) 'endInteraction': endInteraction!.toJson(),
@@ -8223,17 +8210,16 @@
   GoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess.fromJson(
       core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!,
       };
 }
@@ -8249,7 +8235,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Indicates that the conversation should be handed off to a live agent.
@@ -8274,17 +8260,16 @@
   GoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff.fromJson(
       core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!,
       };
 }
@@ -8314,7 +8299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
       };
@@ -8359,7 +8344,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (audio != null) 'audio': audio!,
@@ -8400,7 +8385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (ssml != null) 'ssml': ssml!,
@@ -8437,7 +8422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (audioUri != null) 'audioUri': audioUri!,
@@ -8471,7 +8456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (text != null) 'text': text!,
@@ -8486,7 +8471,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for TestCases.RunTestCase.
@@ -8503,7 +8488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
       };
 }
@@ -8535,21 +8520,20 @@
 
   GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('session')) {
       session = _json['session'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null) 'parameters': parameters!,
         if (session != null) 'session': session!,
       };
@@ -8638,7 +8622,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (displayName != null) 'displayName': displayName!,
         if (lastTestResult != null) 'lastTestResult': lastTestResult!.toJson(),
@@ -8674,7 +8658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!.toJson(),
         if (testCase != null) 'testCase': testCase!.toJson(),
       };
@@ -8730,7 +8714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversationTurns != null)
           'conversationTurns':
               conversationTurns!.map((value) => value.toJson()).toList(),
@@ -8765,7 +8749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (flow != null) 'flow': flow!,
         if (trackingParameters != null)
           'trackingParameters': trackingParameters!,
@@ -8798,7 +8782,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!.toJson(),
         if (testCase != null) 'testCase': testCase!,
         if (testTime != null) 'testTime': testTime!,
@@ -8830,7 +8814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (type != null) 'type': type!,
       };
@@ -8853,7 +8837,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -8931,7 +8915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!,
         if (intent != null) 'intent': intent!,
         if (name != null) 'name': name!,
@@ -8960,7 +8944,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -9035,13 +9019,12 @@
           _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sentimentAnalysisResult')) {
       sentimentAnalysisResult =
@@ -9055,7 +9038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectIntentResponseId != null)
           'detectIntentResponseId': detectIntentResponseId!,
         if (fulfillmentInfo != null)
@@ -9087,7 +9070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag != null) 'tag': tag!,
       };
 }
@@ -9133,19 +9116,18 @@
       lastMatchedIntent = _json['lastMatchedIntent'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (displayName != null) 'displayName': displayName!,
         if (lastMatchedIntent != null) 'lastMatchedIntent': lastMatchedIntent!,
@@ -9182,7 +9164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (originalValue != null) 'originalValue': originalValue!,
         if (resolvedValue != null) 'resolvedValue': resolvedValue!,
       };
@@ -9211,7 +9193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (score != null) 'score': score!,
       };
@@ -9268,13 +9250,12 @@
           _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sessionInfo')) {
       sessionInfo = GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(
@@ -9288,7 +9269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fulfillmentResponse != null)
           'fulfillmentResponse': fulfillmentResponse!.toJson(),
         if (pageInfo != null) 'pageInfo': pageInfo!.toJson(),
@@ -9329,7 +9310,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mergeBehavior != null) 'mergeBehavior': mergeBehavior!,
         if (messages != null)
           'messages': messages!.map((value) => value.toJson()).toList(),
@@ -9498,7 +9479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (avatarUri != null) 'avatarUri': avatarUri!,
         if (classificationThreshold != null)
@@ -9558,7 +9539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityType != null) 'entityType': entityType!,
         if (formattedValue != null) 'formattedValue': formattedValue!,
         if (text != null) 'text': text!,
@@ -9596,7 +9577,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
         if (languageCode != null) 'languageCode': languageCode!,
@@ -9635,7 +9616,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityValues != null) 'entityValues': entityValues!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -9661,7 +9642,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityTypeNames != null) 'entityTypeNames': entityTypeNames!,
       };
 }
@@ -9687,7 +9668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intents != null)
           'intents': intents!.map((value) => value.toJson()).toList(),
       };
@@ -9732,7 +9713,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
         if (languageCode != null) 'languageCode': languageCode!,
@@ -9786,7 +9767,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityTypeBatchInline != null)
           'entityTypeBatchInline': entityTypeBatchInline!.toJson(),
         if (entityTypeBatchUri != null)
@@ -9814,7 +9795,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityTypes != null)
           'entityTypes': entityTypes!.map((value) => value.toJson()).toList(),
       };
@@ -9875,7 +9856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intentBatchInline != null)
           'intentBatchInline': intentBatchInline!.toJson(),
         if (intentBatchUri != null) 'intentBatchUri': intentBatchUri!,
@@ -9902,7 +9883,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intents != null)
           'intents': intents!.map((value) => value.toJson()).toList(),
       };
@@ -9974,18 +9955,17 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lifespanCount != null) 'lifespanCount': lifespanCount!,
         if (name != null) 'name': name!,
         if (parameters != null) 'parameters': parameters!,
@@ -10049,7 +10029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversation != null) 'conversation': conversation!,
         if (errorStatus != null) 'errorStatus': errorStatus!.toJson(),
         if (newMessagePayload != null)
@@ -10122,7 +10102,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputAudio != null) 'inputAudio': inputAudio!,
         if (outputAudioConfig != null)
           'outputAudioConfig': outputAudioConfig!.toJson(),
@@ -10193,7 +10173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputAudio != null) 'outputAudio': outputAudio!,
         if (outputAudioConfig != null)
           'outputAudioConfig': outputAudioConfig!.toJson(),
@@ -10287,7 +10267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoExpansionMode != null) 'autoExpansionMode': autoExpansionMode!,
         if (displayName != null) 'displayName': displayName!,
         if (enableFuzzyExtraction != null)
@@ -10316,7 +10296,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityTypes != null)
           'entityTypes': entityTypes!.map((value) => value.toJson()).toList(),
       };
@@ -10357,7 +10337,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (synonyms != null) 'synonyms': synonyms!,
         if (value != null) 'value': value!,
       };
@@ -10438,7 +10418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentVersion != null) 'agentVersion': agentVersion!,
         if (description != null) 'description': description!,
         if (name != null) 'name': name!,
@@ -10494,18 +10474,17 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (name != null) 'name': name!,
         if (parameters != null) 'parameters': parameters!,
@@ -10531,7 +10510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentUri != null) 'agentUri': agentUri!,
       };
 }
@@ -10565,7 +10544,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -10633,7 +10612,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (enabled != null) 'enabled': enabled!,
         if (features != null)
@@ -10660,7 +10639,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -10712,14 +10691,13 @@
       password = _json['password'] as core.String;
     }
     if (_json.containsKey('requestHeaders')) {
-      requestHeaders = (_json['requestHeaders'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      requestHeaders =
+          (_json['requestHeaders'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('uri')) {
       uri = _json['uri'] as core.String;
@@ -10729,7 +10707,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isCloudFunction != null) 'isCloudFunction': isCloudFunction!,
         if (password != null) 'password': password!,
         if (requestHeaders != null) 'requestHeaders': requestHeaders!,
@@ -10766,7 +10744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -10939,7 +10917,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioEncoding != null) 'audioEncoding': audioEncoding!,
         if (enableWordInfo != null) 'enableWordInfo': enableWordInfo!,
         if (languageCode != null) 'languageCode': languageCode!,
@@ -11185,7 +11163,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (defaultResponsePlatforms != null)
           'defaultResponsePlatforms': defaultResponsePlatforms!,
@@ -11235,7 +11213,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intents != null)
           'intents': intents!.map((value) => value.toJson()).toList(),
       };
@@ -11265,7 +11243,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (followupIntentName != null)
           'followupIntentName': followupIntentName!,
         if (parentFollowupIntentName != null)
@@ -11382,13 +11360,12 @@
           _json['mediaContent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('platform')) {
       platform = _json['platform'] as core.String;
@@ -11416,7 +11393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicCard != null) 'basicCard': basicCard!.toJson(),
         if (browseCarouselCard != null)
           'browseCarouselCard': browseCarouselCard!.toJson(),
@@ -11492,7 +11469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (formattedText != null) 'formattedText': formattedText!,
@@ -11529,7 +11506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (openUriAction != null) 'openUriAction': openUriAction!.toJson(),
         if (title != null) 'title': title!,
       };
@@ -11551,7 +11528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -11608,7 +11585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageDisplayOptions != null)
           'imageDisplayOptions': imageDisplayOptions!,
         if (items != null)
@@ -11675,7 +11652,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (footer != null) 'footer': footer!,
         if (image != null) 'image': image!.toJson(),
@@ -11715,7 +11692,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
         if (urlTypeHint != null) 'urlTypeHint': urlTypeHint!,
       };
@@ -11764,7 +11741,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (imageUri != null) 'imageUri': imageUri!,
@@ -11796,7 +11773,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (postback != null) 'postback': postback!,
         if (text != null) 'text': text!,
       };
@@ -11821,7 +11798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
       };
@@ -11869,7 +11846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (image != null) 'image': image!.toJson(),
         if (info != null) 'info': info!.toJson(),
@@ -11907,7 +11884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!,
         if (horizontalAlignment != null)
           'horizontalAlignment': horizontalAlignment!,
@@ -11938,7 +11915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessibilityText != null) 'accessibilityText': accessibilityText!,
         if (imageUri != null) 'imageUri': imageUri!,
       };
@@ -11969,7 +11946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationName != null) 'destinationName': destinationName!,
         if (uri != null) 'uri': uri!,
       };
@@ -12010,7 +11987,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (subtitle != null) 'subtitle': subtitle!,
@@ -12059,7 +12036,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (image != null) 'image': image!.toJson(),
         if (info != null) 'info': info!.toJson(),
@@ -12100,7 +12077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mediaObjects != null)
           'mediaObjects': mediaObjects!.map((value) => value.toJson()).toList(),
         if (mediaType != null) 'mediaType': mediaType!,
@@ -12157,7 +12134,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentUrl != null) 'contentUrl': contentUrl!,
         if (description != null) 'description': description!,
         if (icon != null) 'icon': icon!.toJson(),
@@ -12191,7 +12168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quickReplies != null) 'quickReplies': quickReplies!,
         if (title != null) 'title': title!,
       };
@@ -12223,7 +12200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (synonyms != null) 'synonyms': synonyms!,
       };
@@ -12261,7 +12238,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayText != null) 'displayText': displayText!,
         if (ssml != null) 'ssml': ssml!,
         if (textToSpeech != null) 'textToSpeech': textToSpeech!,
@@ -12292,7 +12269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (simpleResponses != null)
           'simpleResponses':
               simpleResponses!.map((value) => value.toJson()).toList(),
@@ -12315,7 +12292,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (title != null) 'title': title!,
       };
 }
@@ -12339,7 +12316,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestions != null)
           'suggestions': suggestions!.map((value) => value.toJson()).toList(),
       };
@@ -12414,7 +12391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (columnProperties != null)
@@ -12442,7 +12419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -12474,7 +12451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cells != null)
           'cells': cells!.map((value) => value.toJson()).toList(),
         if (dividerAfter != null) 'dividerAfter': dividerAfter!,
@@ -12498,7 +12475,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -12589,7 +12566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (displayName != null) 'displayName': displayName!,
         if (entityTypeDisplayName != null)
@@ -12669,7 +12646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (parts != null)
           'parts': parts!.map((value) => value.toJson()).toList(),
@@ -12726,7 +12703,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alias != null) 'alias': alias!,
         if (entityType != null) 'entityType': entityType!,
         if (text != null) 'text': text!,
@@ -12761,7 +12738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contexts != null)
           'contexts': contexts!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -12795,7 +12772,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityTypes != null)
           'entityTypes': entityTypes!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -12829,7 +12806,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environments != null)
           'environments': environments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -12863,7 +12840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intents != null)
           'intents': intents!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -12898,7 +12875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sessionEntityTypes != null)
           'sessionEntityTypes':
@@ -12980,7 +12957,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (createTime != null) 'createTime': createTime!,
         if (languageCode != null) 'languageCode': languageCode!,
@@ -13019,7 +12996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containEntities != null) 'containEntities': containEntities!,
         if (parts != null)
           'parts': parts!.map((value) => value.toJson()).toList(),
@@ -13062,13 +13039,12 @@
 
   GoogleCloudDialogflowV2OriginalDetectIntentRequest.fromJson(core.Map _json) {
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('source')) {
       source = _json['source'] as core.String;
@@ -13078,7 +13054,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payload != null) 'payload': payload!,
         if (source != null) 'source': source!,
         if (version != null) 'version': version!,
@@ -13135,7 +13111,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioEncoding != null) 'audioEncoding': audioEncoding!,
         if (sampleRateHertz != null) 'sampleRateHertz': sampleRateHertz!,
         if (synthesizeSpeechConfig != null)
@@ -13175,7 +13151,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioConfig != null) 'audioConfig': audioConfig!.toJson(),
         if (event != null) 'event': event!.toJson(),
         if (text != null) 'text': text!.toJson(),
@@ -13251,13 +13227,12 @@
           _json['geoLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('resetContexts')) {
       resetContexts = _json['resetContexts'] as core.bool;
@@ -13279,18 +13254,17 @@
       timeZone = _json['timeZone'] as core.String;
     }
     if (_json.containsKey('webhookHeaders')) {
-      webhookHeaders = (_json['webhookHeaders'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      webhookHeaders =
+          (_json['webhookHeaders'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contexts != null)
           'contexts': contexts!.map((value) => value.toJson()).toList(),
         if (geoLocation != null) 'geoLocation': geoLocation!.toJson(),
@@ -13427,14 +13401,13 @@
       allRequiredParamsPresent = _json['allRequiredParamsPresent'] as core.bool;
     }
     if (_json.containsKey('diagnosticInfo')) {
-      diagnosticInfo = (_json['diagnosticInfo'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      diagnosticInfo =
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('fulfillmentMessages')) {
       fulfillmentMessages = (_json['fulfillmentMessages'] as core.List)
@@ -13465,14 +13438,13 @@
           .toList();
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('queryText')) {
       queryText = _json['queryText'] as core.String;
@@ -13488,21 +13460,20 @@
           (_json['speechRecognitionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('webhookPayload')) {
-      webhookPayload = (_json['webhookPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      webhookPayload =
+          (_json['webhookPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('webhookSource')) {
       webhookSource = _json['webhookSource'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (allRequiredParamsPresent != null)
           'allRequiredParamsPresent': allRequiredParamsPresent!,
@@ -13557,7 +13528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -13590,7 +13561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agents != null)
           'agents': agents!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -13620,7 +13591,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (score != null) 'score': score!,
       };
@@ -13643,7 +13614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyzeQueryTextSentiment != null)
           'analyzeQueryTextSentiment': analyzeQueryTextSentiment!,
       };
@@ -13672,7 +13643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queryTextSentiment != null)
           'queryTextSentiment': queryTextSentiment!.toJson(),
       };
@@ -13742,7 +13713,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
         if (entityOverrideMode != null)
@@ -13790,7 +13761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boost != null) 'boost': boost!,
         if (phrases != null) 'phrases': phrases!,
       };
@@ -13864,7 +13835,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (effectsProfileId != null) 'effectsProfileId': effectsProfileId!,
         if (pitch != null) 'pitch': pitch!,
         if (speakingRate != null) 'speakingRate': speakingRate!,
@@ -13903,7 +13874,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (text != null) 'text': text!,
       };
@@ -13917,7 +13888,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a single validation error.
@@ -13961,7 +13932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null) 'entries': entries!,
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (severity != null) 'severity': severity!,
@@ -13985,7 +13956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (validationErrors != null)
           'validationErrors':
               validationErrors!.map((value) => value.toJson()).toList(),
@@ -14030,7 +14001,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (ssmlGender != null) 'ssmlGender': ssmlGender!,
       };
@@ -14083,7 +14054,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (originalDetectIntentRequest != null)
           'originalDetectIntentRequest': originalDetectIntentRequest!.toJson(),
         if (queryResult != null) 'queryResult': queryResult!.toJson(),
@@ -14197,13 +14168,12 @@
           .toList();
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sessionEntityTypes')) {
       sessionEntityTypes = (_json['sessionEntityTypes'] as core.List)
@@ -14217,7 +14187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (followupEventInput != null)
           'followupEventInput': followupEventInput!.toJson(),
         if (fulfillmentMessages != null)
@@ -14253,7 +14223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityTypes != null)
           'entityTypes': entityTypes!.map((value) => value.toJson()).toList(),
       };
@@ -14277,7 +14247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intents != null)
           'intents': intents!.map((value) => value.toJson()).toList(),
       };
@@ -14351,18 +14321,17 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lifespanCount != null) 'lifespanCount': lifespanCount!,
         if (name != null) 'name': name!,
         if (parameters != null) 'parameters': parameters!,
@@ -14453,7 +14422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoExpansionMode != null) 'autoExpansionMode': autoExpansionMode!,
         if (displayName != null) 'displayName': displayName!,
         if (enableFuzzyExtraction != null)
@@ -14500,7 +14469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (synonyms != null) 'synonyms': synonyms!,
         if (value != null) 'value': value!,
       };
@@ -14553,18 +14522,17 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (name != null) 'name': name!,
         if (parameters != null) 'parameters': parameters!,
@@ -14600,7 +14568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -14872,7 +14840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (defaultResponsePlatforms != null)
           'defaultResponsePlatforms': defaultResponsePlatforms!,
@@ -14932,7 +14900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (followupIntentName != null)
           'followupIntentName': followupIntentName!,
         if (parentFollowupIntentName != null)
@@ -15073,13 +15041,12 @@
               _json['mediaContent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('platform')) {
       platform = _json['platform'] as core.String;
@@ -15143,7 +15110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicCard != null) 'basicCard': basicCard!.toJson(),
         if (browseCarouselCard != null)
           'browseCarouselCard': browseCarouselCard!.toJson(),
@@ -15231,7 +15198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (formattedText != null) 'formattedText': formattedText!,
@@ -15269,7 +15236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (openUriAction != null) 'openUriAction': openUriAction!.toJson(),
         if (title != null) 'title': title!,
       };
@@ -15291,7 +15258,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -15348,7 +15315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageDisplayOptions != null)
           'imageDisplayOptions': imageDisplayOptions!,
         if (items != null)
@@ -15415,7 +15382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (footer != null) 'footer': footer!,
         if (image != null) 'image': image!.toJson(),
@@ -15455,7 +15422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
         if (urlTypeHint != null) 'urlTypeHint': urlTypeHint!,
       };
@@ -15504,7 +15471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (imageUri != null) 'imageUri': imageUri!,
@@ -15538,7 +15505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (postback != null) 'postback': postback!,
         if (text != null) 'text': text!,
       };
@@ -15565,7 +15532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
       };
@@ -15613,7 +15580,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (image != null) 'image': image!.toJson(),
         if (info != null) 'info': info!.toJson(),
@@ -15651,7 +15618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!,
         if (horizontalAlignment != null)
           'horizontalAlignment': horizontalAlignment!,
@@ -15682,7 +15649,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessibilityText != null) 'accessibilityText': accessibilityText!,
         if (imageUri != null) 'imageUri': imageUri!,
       };
@@ -15713,7 +15680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationName != null) 'destinationName': destinationName!,
         if (uri != null) 'uri': uri!,
       };
@@ -15754,7 +15721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (subtitle != null) 'subtitle': subtitle!,
@@ -15804,7 +15771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (image != null) 'image': image!.toJson(),
         if (info != null) 'info': info!.toJson(),
@@ -15846,7 +15813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mediaObjects != null)
           'mediaObjects': mediaObjects!.map((value) => value.toJson()).toList(),
         if (mediaType != null) 'mediaType': mediaType!,
@@ -15903,7 +15870,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentUrl != null) 'contentUrl': contentUrl!,
         if (description != null) 'description': description!,
         if (icon != null) 'icon': icon!.toJson(),
@@ -15938,7 +15905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quickReplies != null) 'quickReplies': quickReplies!,
         if (title != null) 'title': title!,
       };
@@ -15996,7 +15963,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (media != null) 'media': media!.toJson(),
         if (suggestions != null)
@@ -16058,7 +16025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileUri != null) 'fileUri': fileUri!,
         if (height != null) 'height': height!,
         if (thumbnailUri != null) 'thumbnailUri': thumbnailUri!,
@@ -16104,7 +16071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cardContents != null)
           'cardContents': cardContents!.map((value) => value.toJson()).toList(),
         if (cardWidth != null) 'cardWidth': cardWidth!,
@@ -16158,7 +16125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cardContent != null) 'cardContent': cardContent!.toJson(),
         if (cardOrientation != null) 'cardOrientation': cardOrientation!,
         if (thumbnailImageAlignment != null)
@@ -16220,7 +16187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dial != null) 'dial': dial!.toJson(),
         if (openUrl != null) 'openUrl': openUrl!.toJson(),
         if (postbackData != null) 'postbackData': postbackData!,
@@ -16249,7 +16216,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
       };
 }
@@ -16273,7 +16240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -16287,7 +16254,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Rich Business Messaging (RBM) suggested reply that the user can click
@@ -16315,7 +16282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (postbackData != null) 'postbackData': postbackData!,
         if (text != null) 'text': text!,
       };
@@ -16348,7 +16315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!.toJson(),
         if (reply != null) 'reply': reply!.toJson(),
       };
@@ -16382,7 +16349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rbmSuggestion != null)
           'rbmSuggestion':
               rbmSuggestion!.map((value) => value.toJson()).toList(),
@@ -16417,7 +16384,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (synonyms != null) 'synonyms': synonyms!,
       };
@@ -16456,7 +16423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayText != null) 'displayText': displayText!,
         if (ssml != null) 'ssml': ssml!,
         if (textToSpeech != null) 'textToSpeech': textToSpeech!,
@@ -16488,7 +16455,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (simpleResponses != null)
           'simpleResponses':
               simpleResponses!.map((value) => value.toJson()).toList(),
@@ -16511,7 +16478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (title != null) 'title': title!,
       };
 }
@@ -16536,7 +16503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestions != null)
           'suggestions': suggestions!.map((value) => value.toJson()).toList(),
       };
@@ -16613,7 +16580,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (columnProperties != null)
@@ -16642,7 +16609,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -16675,7 +16642,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cells != null)
           'cells': cells!.map((value) => value.toJson()).toList(),
         if (dividerAfter != null) 'dividerAfter': dividerAfter!,
@@ -16708,7 +16675,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioUri != null) 'audioUri': audioUri!,
       };
 }
@@ -16741,7 +16708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ssml != null) 'ssml': ssml!,
         if (text != null) 'text': text!,
       };
@@ -16766,7 +16733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
       };
 }
@@ -16788,7 +16755,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -16879,7 +16846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (displayName != null) 'displayName': displayName!,
         if (entityTypeDisplayName != null)
@@ -16959,7 +16926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (parts != null)
           'parts': parts!.map((value) => value.toJson()).toList(),
@@ -17017,7 +16984,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alias != null) 'alias': alias!,
         if (entityType != null) 'entityType': entityType!,
         if (text != null) 'text': text!,
@@ -17042,7 +17009,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (answers != null)
           'answers': answers!.map((value) => value.toJson()).toList(),
       };
@@ -17107,7 +17074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (answer != null) 'answer': answer!,
         if (faqQuestion != null) 'faqQuestion': faqQuestion!,
         if (matchConfidence != null) 'matchConfidence': matchConfidence!,
@@ -17138,7 +17105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
       };
 }
@@ -17180,13 +17147,12 @@
   GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest.fromJson(
       core.Map _json) {
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('source')) {
       source = _json['source'] as core.String;
@@ -17196,7 +17162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payload != null) 'payload': payload!,
         if (source != null) 'source': source!,
         if (version != null) 'version': version!,
@@ -17327,14 +17293,13 @@
       allRequiredParamsPresent = _json['allRequiredParamsPresent'] as core.bool;
     }
     if (_json.containsKey('diagnosticInfo')) {
-      diagnosticInfo = (_json['diagnosticInfo'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      diagnosticInfo =
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('fulfillmentMessages')) {
       fulfillmentMessages = (_json['fulfillmentMessages'] as core.List)
@@ -17369,14 +17334,13 @@
           .toList();
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('queryText')) {
       queryText = _json['queryText'] as core.String;
@@ -17392,21 +17356,20 @@
           (_json['speechRecognitionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('webhookPayload')) {
-      webhookPayload = (_json['webhookPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      webhookPayload =
+          (_json['webhookPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('webhookSource')) {
       webhookSource = _json['webhookSource'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (allRequiredParamsPresent != null)
           'allRequiredParamsPresent': allRequiredParamsPresent!,
@@ -17458,7 +17421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (score != null) 'score': score!,
       };
@@ -17487,7 +17450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queryTextSentiment != null)
           'queryTextSentiment': queryTextSentiment!.toJson(),
       };
@@ -17560,7 +17523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
         if (entityOverrideMode != null)
@@ -17628,7 +17591,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternativeQueryResults != null)
           'alternativeQueryResults':
               alternativeQueryResults!.map((value) => value.toJson()).toList(),
@@ -17757,13 +17720,12 @@
           .toList();
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sessionEntityTypes')) {
       sessionEntityTypes = (_json['sessionEntityTypes'] as core.List)
@@ -17777,7 +17739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endInteraction != null) 'endInteraction': endInteraction!,
         if (followupEventInput != null)
           'followupEventInput': followupEventInput!.toJson(),
@@ -17814,7 +17776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -17838,7 +17800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -17865,7 +17827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
       };
 }
@@ -17888,7 +17850,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -17911,7 +17873,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (warnings != null)
           'warnings': warnings!.map((value) => value.toJson()).toList(),
       };
@@ -17935,7 +17897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -17959,7 +17921,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -17988,7 +17950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -18049,29 +18011,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -18094,7 +18054,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -18130,8 +18090,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -18144,7 +18104,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -18178,7 +18138,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
diff --git a/generated/googleapis/lib/dialogflow/v3.dart b/generated/googleapis/lib/dialogflow/v3.dart
index b836e82..144de21 100644
--- a/generated/googleapis/lib/dialogflow/v3.dart
+++ b/generated/googleapis/lib/dialogflow/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -5185,7 +5184,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (avatarUri != null) 'avatarUri': avatarUri!,
         if (defaultLanguageCode != null)
           'defaultLanguageCode': defaultLanguageCode!,
@@ -5230,7 +5229,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (flowValidationResults != null)
           'flowValidationResults':
               flowValidationResults!.map((value) => value.toJson()).toList(),
@@ -5272,7 +5271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!,
         if (config != null) 'config': config!.toJson(),
       };
@@ -5296,7 +5295,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -5319,7 +5318,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -5352,7 +5351,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!,
         if (testCases != null) 'testCases': testCases!,
       };
@@ -5377,7 +5376,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
       };
@@ -5421,7 +5420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agent != null) 'agent': agent!,
         if (intentCoverage != null) 'intentCoverage': intentCoverage!.toJson(),
         if (routeGroupCoverage != null)
@@ -5457,7 +5456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userInput != null) 'userInput': userInput!.toJson(),
         if (virtualAgentOutput != null)
           'virtualAgentOutput': virtualAgentOutput!.toJson(),
@@ -5486,14 +5485,14 @@
 
   GoogleCloudDialogflowCxV3ConversationTurnUserInput.fromJson(core.Map _json) {
     if (_json.containsKey('injectedParameters')) {
-      injectedParameters = (_json['injectedParameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      injectedParameters =
+          (_json['injectedParameters'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('input')) {
       input = GoogleCloudDialogflowCxV3QueryInput.fromJson(
@@ -5504,7 +5503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (injectedParameters != null)
           'injectedParameters': injectedParameters!,
         if (input != null) 'input': input!.toJson(),
@@ -5563,14 +5562,13 @@
           _json['currentPage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diagnosticInfo')) {
-      diagnosticInfo = (_json['diagnosticInfo'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      diagnosticInfo =
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('differences')) {
       differences = (_json['differences'] as core.List)
@@ -5580,14 +5578,14 @@
           .toList();
     }
     if (_json.containsKey('sessionParameters')) {
-      sessionParameters = (_json['sessionParameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      sessionParameters =
+          (_json['sessionParameters'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('status')) {
       status = GoogleRpcStatus.fromJson(
@@ -5606,7 +5604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentPage != null) 'currentPage': currentPage!.toJson(),
         if (diagnosticInfo != null) 'diagnosticInfo': diagnosticInfo!,
         if (differences != null)
@@ -5637,7 +5635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -5660,7 +5658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (version != null) 'version': version!,
       };
 }
@@ -5681,7 +5679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -5717,7 +5715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputAudioConfig != null)
           'outputAudioConfig': outputAudioConfig!.toJson(),
         if (queryInput != null) 'queryInput': queryInput!.toJson(),
@@ -5778,7 +5776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputAudio != null) 'outputAudio': outputAudio!,
         if (outputAudioConfig != null)
           'outputAudioConfig': outputAudioConfig!.toJson(),
@@ -5806,7 +5804,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digits != null) 'digits': digits!,
         if (finishDigit != null) 'finishDigit': finishDigit!,
       };
@@ -5923,7 +5921,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoExpansionMode != null) 'autoExpansionMode': autoExpansionMode!,
         if (displayName != null) 'displayName': displayName!,
         if (enableFuzzyExtraction != null)
@@ -5974,7 +5972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (synonyms != null) 'synonyms': synonyms!,
         if (value != null) 'value': value!,
       };
@@ -5995,7 +5993,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (value != null) 'value': value!,
       };
 }
@@ -6065,7 +6063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -6091,7 +6089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (version != null) 'version': version!,
       };
 }
@@ -6153,7 +6151,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (event != null) 'event': event!,
         if (name != null) 'name': name!,
         if (targetFlow != null) 'targetFlow': targetFlow!,
@@ -6176,7 +6174,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (event != null) 'event': event!,
       };
 }
@@ -6281,7 +6279,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (definition != null) 'definition': definition!.toJson(),
         if (description != null) 'description': description!,
@@ -6324,7 +6322,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!,
         if (versionVariants != null)
           'versionVariants': versionVariants!.toJson(),
@@ -6359,7 +6357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastUpdateTime != null) 'lastUpdateTime': lastUpdateTime!,
         if (versionMetrics != null)
           'versionMetrics':
@@ -6402,7 +6400,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidenceLevel != null) 'confidenceLevel': confidenceLevel!,
         if (lowerBound != null) 'lowerBound': lowerBound!,
         if (ratio != null) 'ratio': ratio!,
@@ -6472,7 +6470,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidenceInterval != null)
           'confidenceInterval': confidenceInterval!.toJson(),
         if (count != null) 'count': count!,
@@ -6515,7 +6513,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null)
           'metrics': metrics!.map((value) => value.toJson()).toList(),
         if (sessionCount != null) 'sessionCount': sessionCount!,
@@ -6542,7 +6540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentUri != null) 'agentUri': agentUri!,
       };
 }
@@ -6576,7 +6574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -6590,7 +6588,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The request message for TestCases.ExportTestCases.
@@ -6633,7 +6631,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFormat != null) 'dataFormat': dataFormat!,
         if (filter != null) 'filter': filter!,
         if (gcsUri != null) 'gcsUri': gcsUri!,
@@ -6668,7 +6666,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsUri != null) 'gcsUri': gcsUri!,
       };
@@ -6762,7 +6760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (eventHandlers != null)
@@ -6807,7 +6805,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (updateTime != null) 'updateTime': updateTime!,
         if (validationMessages != null)
@@ -6839,7 +6837,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
       };
@@ -6921,7 +6919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (displayName != null) 'displayName': displayName!,
         if (entityType != null) 'entityType': entityType!,
@@ -6981,7 +6979,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (initialPromptFulfillment != null)
           'initialPromptFulfillment': initialPromptFulfillment!.toJson(),
         if (repromptEventHandlers != null)
@@ -7019,7 +7017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (match != null) 'match': match!.toJson(),
         if (matchIntentRequest != null)
           'matchIntentRequest': matchIntentRequest!.toJson(),
@@ -7081,7 +7079,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputAudio != null) 'outputAudio': outputAudio!,
         if (outputAudioConfig != null)
           'outputAudioConfig': outputAudioConfig!.toJson(),
@@ -7153,7 +7151,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conditionalCases != null)
           'conditionalCases':
               conditionalCases!.map((value) => value.toJson()).toList(),
@@ -7189,7 +7187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cases != null)
           'cases': cases!.map((value) => value.toJson()).toList(),
       };
@@ -7229,7 +7227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseContent != null)
           'caseContent': caseContent!.map((value) => value.toJson()).toList(),
         if (condition != null) 'condition': condition!,
@@ -7259,7 +7257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalCases != null)
           'additionalCases': additionalCases!.toJson(),
         if (message != null) 'message': message!.toJson(),
@@ -7291,7 +7289,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameter != null) 'parameter': parameter!,
         if (value != null) 'value': value!,
       };
@@ -7318,7 +7316,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
       };
 }
@@ -7339,7 +7337,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -7361,7 +7359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (warnings != null)
           'warnings': warnings!.map((value) => value.toJson()).toList(),
       };
@@ -7384,7 +7382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -7418,7 +7416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsUri != null) 'gcsUri': gcsUri!,
       };
@@ -7441,7 +7439,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -7589,7 +7587,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioEncoding != null) 'audioEncoding': audioEncoding!,
         if (enableWordInfo != null) 'enableWordInfo': enableWordInfo!,
         if (model != null) 'model': model!,
@@ -7679,13 +7677,12 @@
       isFallback = _json['isFallback'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -7709,7 +7706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (isFallback != null) 'isFallback': isFallback!,
@@ -7748,7 +7745,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coverageScore != null) 'coverageScore': coverageScore!,
         if (intents != null)
           'intents': intents!.map((value) => value.toJson()).toList(),
@@ -7775,7 +7772,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (covered != null) 'covered': covered!,
         if (intent != null) 'intent': intent!,
       };
@@ -7799,7 +7796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intent != null) 'intent': intent!,
       };
 }
@@ -7851,7 +7848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityType != null) 'entityType': entityType!,
         if (id != null) 'id': id!,
         if (isList != null) 'isList': isList!,
@@ -7904,7 +7901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (parts != null)
           'parts': parts!.map((value) => value.toJson()).toList(),
@@ -7935,7 +7932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameterId != null) 'parameterId': parameterId!,
         if (text != null) 'text': text!,
       };
@@ -7968,7 +7965,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agents != null)
           'agents': agents!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8002,7 +7999,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityTypes != null)
           'entityTypes': entityTypes!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8037,7 +8034,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environments != null)
           'environments': environments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8072,7 +8069,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (experiments != null)
           'experiments': experiments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8106,7 +8103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (flows != null)
           'flows': flows!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8140,7 +8137,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intents != null)
           'intents': intents!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8174,7 +8171,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (pages != null)
           'pages': pages!.map((value) => value.toJson()).toList(),
@@ -8206,7 +8203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (securitySettings != null)
           'securitySettings':
@@ -8242,7 +8239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sessionEntityTypes != null)
           'sessionEntityTypes':
@@ -8275,7 +8272,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (testCaseResults != null)
           'testCaseResults':
@@ -8310,7 +8307,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (testCases != null)
           'testCases': testCases!.map((value) => value.toJson()).toList(),
@@ -8347,7 +8344,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (transitionRouteGroups != null)
           'transitionRouteGroups':
@@ -8383,7 +8380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (versions != null)
           'versions': versions!.map((value) => value.toJson()).toList(),
@@ -8417,7 +8414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (webhooks != null)
           'webhooks': webhooks!.map((value) => value.toJson()).toList(),
@@ -8443,7 +8440,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowOverrideAgentResources != null)
           'allowOverrideAgentResources': allowOverrideAgentResources!,
       };
@@ -8476,7 +8473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environments != null)
           'environments': environments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8554,21 +8551,20 @@
       matchType = _json['matchType'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('resolvedInput')) {
       resolvedInput = _json['resolvedInput'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (event != null) 'event': event!,
         if (intent != null) 'intent': intent!.toJson(),
@@ -8601,7 +8597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queryInput != null) 'queryInput': queryInput!.toJson(),
         if (queryParams != null) 'queryParams': queryParams!.toJson(),
       };
@@ -8663,7 +8659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentPage != null) 'currentPage': currentPage!.toJson(),
         if (matches != null)
           'matches': matches!.map((value) => value.toJson()).toList(),
@@ -8720,7 +8716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (classificationThreshold != null)
           'classificationThreshold': classificationThreshold!,
         if (modelTrainingMode != null) 'modelTrainingMode': modelTrainingMode!,
@@ -8781,7 +8777,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioEncoding != null) 'audioEncoding': audioEncoding!,
         if (sampleRateHertz != null) 'sampleRateHertz': sampleRateHertz!,
         if (synthesizeSpeechConfig != null)
@@ -8888,7 +8884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (entryFulfillment != null)
           'entryFulfillment': entryFulfillment!.toJson(),
@@ -8930,7 +8926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentPage != null) 'currentPage': currentPage!,
         if (formInfo != null) 'formInfo': formInfo!.toJson(),
       };
@@ -8957,7 +8953,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameterInfo != null)
           'parameterInfo':
               parameterInfo!.map((value) => value.toJson()).toList(),
@@ -9030,7 +9026,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (justCollected != null) 'justCollected': justCollected!,
         if (required != null) 'required': required!,
@@ -9098,7 +9094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!.toJson(),
         if (dtmf != null) 'dtmf': dtmf!.toJson(),
         if (event != null) 'event': event!.toJson(),
@@ -9187,23 +9183,21 @@
           _json['geoLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sessionEntityTypes')) {
       sessionEntityTypes = (_json['sessionEntityTypes'] as core.List)
@@ -9216,18 +9210,17 @@
       timeZone = _json['timeZone'] as core.String;
     }
     if (_json.containsKey('webhookHeaders')) {
-      webhookHeaders = (_json['webhookHeaders'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      webhookHeaders =
+          (_json['webhookHeaders'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyzeQueryTextSentiment != null)
           'analyzeQueryTextSentiment': analyzeQueryTextSentiment!,
         if (disableWebhook != null) 'disableWebhook': disableWebhook!,
@@ -9348,14 +9341,13 @@
           _json['currentPage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diagnosticInfo')) {
-      diagnosticInfo = (_json['diagnosticInfo'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      diagnosticInfo =
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('intent')) {
       intent = GoogleCloudDialogflowCxV3Intent.fromJson(
@@ -9373,14 +9365,13 @@
           _json['match'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('responseMessages')) {
       responseMessages = (_json['responseMessages'] as core.List)
@@ -9409,8 +9400,8 @@
     }
     if (_json.containsKey('webhookPayloads')) {
       webhookPayloads = (_json['webhookPayloads'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -9426,7 +9417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentPage != null) 'currentPage': currentPage!.toJson(),
         if (diagnosticInfo != null) 'diagnosticInfo': diagnosticInfo!,
         if (intent != null) 'intent': intent!.toJson(),
@@ -9467,7 +9458,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -9492,7 +9483,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
       };
@@ -9588,13 +9579,12 @@
               _json['outputAudioText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('playAudio')) {
       playAudio = GoogleCloudDialogflowCxV3ResponseMessagePlayAudio.fromJson(
@@ -9606,7 +9596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversationSuccess != null)
           'conversationSuccess': conversationSuccess!.toJson(),
         if (endInteraction != null) 'endInteraction': endInteraction!.toJson(),
@@ -9646,17 +9636,16 @@
   GoogleCloudDialogflowCxV3ResponseMessageConversationSuccess.fromJson(
       core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!,
       };
 }
@@ -9672,7 +9661,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Indicates that the conversation should be handed off to a live agent.
@@ -9697,17 +9686,16 @@
   GoogleCloudDialogflowCxV3ResponseMessageLiveAgentHandoff.fromJson(
       core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!,
       };
 }
@@ -9736,7 +9724,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
       };
@@ -9781,7 +9769,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (audio != null) 'audio': audio!,
@@ -9822,7 +9810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (ssml != null) 'ssml': ssml!,
@@ -9858,7 +9846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (audioUri != null) 'audioUri': audioUri!,
@@ -9892,7 +9880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (text != null) 'text': text!,
@@ -9928,7 +9916,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -9942,7 +9930,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The request message for TestCases.RunTestCase.
@@ -9963,7 +9951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!,
       };
 }
@@ -9982,7 +9970,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
       };
 }
@@ -10070,7 +10058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (inspectTemplate != null) 'inspectTemplate': inspectTemplate!,
         if (name != null) 'name': name!,
@@ -10108,7 +10096,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (score != null) 'score': score!,
       };
@@ -10177,7 +10165,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
         if (entityOverrideMode != null)
@@ -10213,21 +10201,20 @@
 
   GoogleCloudDialogflowCxV3SessionInfo.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('session')) {
       session = _json['session'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null) 'parameters': parameters!,
         if (session != null) 'session': session!,
       };
@@ -10246,7 +10233,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableSpeechAdaptation != null)
           'enableSpeechAdaptation': enableSpeechAdaptation!,
       };
@@ -10260,7 +10247,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The request message for Experiments.StopExperiment.
@@ -10271,7 +10258,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Configuration of how speech should be synthesized.
@@ -10342,7 +10329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (effectsProfileId != null) 'effectsProfileId': effectsProfileId!,
         if (pitch != null) 'pitch': pitch!,
         if (speakingRate != null) 'speakingRate': speakingRate!,
@@ -10434,7 +10421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (displayName != null) 'displayName': displayName!,
         if (lastTestResult != null) 'lastTestResult': lastTestResult!.toJson(),
@@ -10470,7 +10457,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!.toJson(),
         if (testCase != null) 'testCase': testCase!.toJson(),
       };
@@ -10526,7 +10513,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversationTurns != null)
           'conversationTurns':
               conversationTurns!.map((value) => value.toJson()).toList(),
@@ -10561,7 +10548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (flow != null) 'flow': flow!,
         if (trackingParameters != null)
           'trackingParameters': trackingParameters!,
@@ -10594,7 +10581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!.toJson(),
         if (testCase != null) 'testCase': testCase!,
         if (testTime != null) 'testTime': testTime!,
@@ -10626,7 +10613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (type != null) 'type': type!,
       };
@@ -10649,7 +10636,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -10662,7 +10649,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Transition coverage represents the percentage of all possible page
@@ -10690,7 +10677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coverageScore != null) 'coverageScore': coverageScore!,
         if (transitions != null)
           'transitions': transitions!.map((value) => value.toJson()).toList(),
@@ -10750,7 +10737,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (covered != null) 'covered': covered!,
         if (eventHandler != null) 'eventHandler': eventHandler!.toJson(),
         if (index != null) 'index': index!,
@@ -10787,7 +10774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (flow != null) 'flow': flow!.toJson(),
         if (page != null) 'page': page!.toJson(),
       };
@@ -10866,7 +10853,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!,
         if (intent != null) 'intent': intent!,
         if (name != null) 'name': name!,
@@ -10916,7 +10903,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (transitionRoutes != null)
@@ -10955,7 +10942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coverageScore != null) 'coverageScore': coverageScore!,
         if (coverages != null)
           'coverages': coverages!.map((value) => value.toJson()).toList(),
@@ -10999,7 +10986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coverageScore != null) 'coverageScore': coverageScore!,
         if (routeGroup != null) 'routeGroup': routeGroup!.toJson(),
         if (transitions != null)
@@ -11029,7 +11016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (covered != null) 'covered': covered!,
         if (transitionRoute != null)
           'transitionRoute': transitionRoute!.toJson(),
@@ -11052,7 +11039,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -11071,7 +11058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
       };
 }
@@ -11089,7 +11076,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
       };
 }
@@ -11157,7 +11144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detail != null) 'detail': detail!,
         if (resourceNames != null)
           'resourceNames':
@@ -11188,7 +11175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (updateTime != null) 'updateTime': updateTime!,
         if (versionVariants != null)
           'versionVariants': versionVariants!.toJson(),
@@ -11262,7 +11249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -11289,7 +11276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (variants != null)
           'variants': variants!.map((value) => value.toJson()).toList(),
       };
@@ -11324,7 +11311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isControlGroup != null) 'isControlGroup': isControlGroup!,
         if (trafficAllocation != null) 'trafficAllocation': trafficAllocation!,
         if (version != null) 'version': version!,
@@ -11371,7 +11358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (ssmlGender != null) 'ssmlGender': ssmlGender!,
       };
@@ -11431,7 +11418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disabled != null) 'disabled': disabled!,
         if (displayName != null) 'displayName': displayName!,
         if (genericWebService != null)
@@ -11466,14 +11453,13 @@
       password = _json['password'] as core.String;
     }
     if (_json.containsKey('requestHeaders')) {
-      requestHeaders = (_json['requestHeaders'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      requestHeaders =
+          (_json['requestHeaders'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('uri')) {
       uri = _json['uri'] as core.String;
@@ -11483,7 +11469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (password != null) 'password': password!,
         if (requestHeaders != null) 'requestHeaders': requestHeaders!,
         if (uri != null) 'uri': uri!,
@@ -11559,13 +11545,12 @@
           _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sentimentAnalysisResult')) {
       sentimentAnalysisResult =
@@ -11579,7 +11564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectIntentResponseId != null)
           'detectIntentResponseId': detectIntentResponseId!,
         if (fulfillmentInfo != null)
@@ -11611,7 +11596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag != null) 'tag': tag!,
       };
 }
@@ -11656,19 +11641,18 @@
       lastMatchedIntent = _json['lastMatchedIntent'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (displayName != null) 'displayName': displayName!,
         if (lastMatchedIntent != null) 'lastMatchedIntent': lastMatchedIntent!,
@@ -11705,7 +11689,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (originalValue != null) 'originalValue': originalValue!,
         if (resolvedValue != null) 'resolvedValue': resolvedValue!,
       };
@@ -11734,7 +11718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (score != null) 'score': score!,
       };
@@ -11791,13 +11775,12 @@
           _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sessionInfo')) {
       sessionInfo = GoogleCloudDialogflowCxV3SessionInfo.fromJson(
@@ -11811,7 +11794,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fulfillmentResponse != null)
           'fulfillmentResponse': fulfillmentResponse!.toJson(),
         if (pageInfo != null) 'pageInfo': pageInfo!.toJson(),
@@ -11852,7 +11835,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mergeBehavior != null) 'mergeBehavior': mergeBehavior!,
         if (messages != null)
           'messages': messages!.map((value) => value.toJson()).toList(),
@@ -11893,7 +11876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!,
         if (config != null) 'config': config!.toJson(),
       };
@@ -11918,7 +11901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -11944,7 +11927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
       };
@@ -11977,7 +11960,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userInput != null) 'userInput': userInput!.toJson(),
         if (virtualAgentOutput != null)
           'virtualAgentOutput': virtualAgentOutput!.toJson(),
@@ -12007,14 +11990,14 @@
   GoogleCloudDialogflowCxV3beta1ConversationTurnUserInput.fromJson(
       core.Map _json) {
     if (_json.containsKey('injectedParameters')) {
-      injectedParameters = (_json['injectedParameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      injectedParameters =
+          (_json['injectedParameters'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('input')) {
       input = GoogleCloudDialogflowCxV3beta1QueryInput.fromJson(
@@ -12025,7 +12008,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (injectedParameters != null)
           'injectedParameters': injectedParameters!,
         if (input != null) 'input': input!.toJson(),
@@ -12084,14 +12067,13 @@
           _json['currentPage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diagnosticInfo')) {
-      diagnosticInfo = (_json['diagnosticInfo'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      diagnosticInfo =
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('differences')) {
       differences = (_json['differences'] as core.List)
@@ -12101,14 +12083,14 @@
           .toList();
     }
     if (_json.containsKey('sessionParameters')) {
-      sessionParameters = (_json['sessionParameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      sessionParameters =
+          (_json['sessionParameters'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('status')) {
       status = GoogleRpcStatus.fromJson(
@@ -12127,7 +12109,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentPage != null) 'currentPage': currentPage!.toJson(),
         if (diagnosticInfo != null) 'diagnosticInfo': diagnosticInfo!,
         if (differences != null)
@@ -12160,7 +12142,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -12183,7 +12165,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (version != null) 'version': version!,
       };
 }
@@ -12206,7 +12188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -12231,7 +12213,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digits != null) 'digits': digits!,
         if (finishDigit != null) 'finishDigit': finishDigit!,
       };
@@ -12294,7 +12276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (event != null) 'event': event!,
         if (name != null) 'name': name!,
         if (targetFlow != null) 'targetFlow': targetFlow!,
@@ -12317,7 +12299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (event != null) 'event': event!,
       };
 }
@@ -12351,7 +12333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -12365,7 +12347,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for TestCases.ExportTestCases.
@@ -12397,7 +12379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsUri != null) 'gcsUri': gcsUri!,
       };
@@ -12426,7 +12408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
       };
@@ -12508,7 +12490,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (displayName != null) 'displayName': displayName!,
         if (entityType != null) 'entityType': entityType!,
@@ -12570,7 +12552,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (initialPromptFulfillment != null)
           'initialPromptFulfillment': initialPromptFulfillment!.toJson(),
         if (repromptEventHandlers != null)
@@ -12644,7 +12626,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conditionalCases != null)
           'conditionalCases':
               conditionalCases!.map((value) => value.toJson()).toList(),
@@ -12681,7 +12663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cases != null)
           'cases': cases!.map((value) => value.toJson()).toList(),
       };
@@ -12721,7 +12703,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseContent != null)
           'caseContent': caseContent!.map((value) => value.toJson()).toList(),
         if (condition != null) 'condition': condition!,
@@ -12751,7 +12733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalCases != null)
           'additionalCases': additionalCases!.toJson(),
         if (message != null) 'message': message!.toJson(),
@@ -12783,7 +12765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameter != null) 'parameter': parameter!,
         if (value != null) 'value': value!,
       };
@@ -12810,7 +12792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
       };
 }
@@ -12833,7 +12815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -12856,7 +12838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (warnings != null)
           'warnings': warnings!.map((value) => value.toJson()).toList(),
       };
@@ -12880,7 +12862,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
       };
@@ -12904,7 +12886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -13052,7 +13034,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioEncoding != null) 'audioEncoding': audioEncoding!,
         if (enableWordInfo != null) 'enableWordInfo': enableWordInfo!,
         if (model != null) 'model': model!,
@@ -13143,13 +13125,12 @@
       isFallback = _json['isFallback'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -13173,7 +13154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (isFallback != null) 'isFallback': isFallback!,
@@ -13206,7 +13187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intent != null) 'intent': intent!,
       };
 }
@@ -13258,7 +13239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityType != null) 'entityType': entityType!,
         if (id != null) 'id': id!,
         if (isList != null) 'isList': isList!,
@@ -13311,7 +13292,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (parts != null)
           'parts': parts!.map((value) => value.toJson()).toList(),
@@ -13343,7 +13324,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameterId != null) 'parameterId': parameterId!,
         if (text != null) 'text': text!,
       };
@@ -13448,7 +13429,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (entryFulfillment != null)
           'entryFulfillment': entryFulfillment!.toJson(),
@@ -13490,7 +13471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentPage != null) 'currentPage': currentPage!,
         if (formInfo != null) 'formInfo': formInfo!.toJson(),
       };
@@ -13518,7 +13499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameterInfo != null)
           'parameterInfo':
               parameterInfo!.map((value) => value.toJson()).toList(),
@@ -13591,7 +13572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (justCollected != null) 'justCollected': justCollected!,
         if (required != null) 'required': required!,
@@ -13659,7 +13640,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!.toJson(),
         if (dtmf != null) 'dtmf': dtmf!.toJson(),
         if (event != null) 'event': event!.toJson(),
@@ -13687,7 +13668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -13786,13 +13767,12 @@
               _json['outputAudioText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('playAudio')) {
       playAudio =
@@ -13805,7 +13785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversationSuccess != null)
           'conversationSuccess': conversationSuccess!.toJson(),
         if (endInteraction != null) 'endInteraction': endInteraction!.toJson(),
@@ -13845,17 +13825,16 @@
   GoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess.fromJson(
       core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!,
       };
 }
@@ -13871,7 +13850,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Indicates that the conversation should be handed off to a live agent.
@@ -13896,17 +13875,16 @@
   GoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff.fromJson(
       core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!,
       };
 }
@@ -13936,7 +13914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
       };
@@ -13981,7 +13959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (audio != null) 'audio': audio!,
@@ -14022,7 +14000,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (ssml != null) 'ssml': ssml!,
@@ -14059,7 +14037,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (audioUri != null) 'audioUri': audioUri!,
@@ -14093,7 +14071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPlaybackInterruption != null)
           'allowPlaybackInterruption': allowPlaybackInterruption!,
         if (text != null) 'text': text!,
@@ -14108,7 +14086,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for TestCases.RunTestCase.
@@ -14125,7 +14103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
       };
 }
@@ -14157,21 +14135,20 @@
 
   GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('session')) {
       session = _json['session'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null) 'parameters': parameters!,
         if (session != null) 'session': session!,
       };
@@ -14260,7 +14237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (displayName != null) 'displayName': displayName!,
         if (lastTestResult != null) 'lastTestResult': lastTestResult!.toJson(),
@@ -14296,7 +14273,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!.toJson(),
         if (testCase != null) 'testCase': testCase!.toJson(),
       };
@@ -14352,7 +14329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversationTurns != null)
           'conversationTurns':
               conversationTurns!.map((value) => value.toJson()).toList(),
@@ -14387,7 +14364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (flow != null) 'flow': flow!,
         if (trackingParameters != null)
           'trackingParameters': trackingParameters!,
@@ -14420,7 +14397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!.toJson(),
         if (testCase != null) 'testCase': testCase!,
         if (testTime != null) 'testTime': testTime!,
@@ -14452,7 +14429,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (type != null) 'type': type!,
       };
@@ -14475,7 +14452,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -14553,7 +14530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!,
         if (intent != null) 'intent': intent!,
         if (name != null) 'name': name!,
@@ -14582,7 +14559,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -14657,13 +14634,12 @@
           _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sentimentAnalysisResult')) {
       sentimentAnalysisResult =
@@ -14677,7 +14653,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectIntentResponseId != null)
           'detectIntentResponseId': detectIntentResponseId!,
         if (fulfillmentInfo != null)
@@ -14709,7 +14685,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag != null) 'tag': tag!,
       };
 }
@@ -14755,19 +14731,18 @@
       lastMatchedIntent = _json['lastMatchedIntent'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (displayName != null) 'displayName': displayName!,
         if (lastMatchedIntent != null) 'lastMatchedIntent': lastMatchedIntent!,
@@ -14804,7 +14779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (originalValue != null) 'originalValue': originalValue!,
         if (resolvedValue != null) 'resolvedValue': resolvedValue!,
       };
@@ -14833,7 +14808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (score != null) 'score': score!,
       };
@@ -14890,13 +14865,12 @@
           _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sessionInfo')) {
       sessionInfo = GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(
@@ -14910,7 +14884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fulfillmentResponse != null)
           'fulfillmentResponse': fulfillmentResponse!.toJson(),
         if (pageInfo != null) 'pageInfo': pageInfo!.toJson(),
@@ -14951,7 +14925,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mergeBehavior != null) 'mergeBehavior': mergeBehavior!,
         if (messages != null)
           'messages': messages!.map((value) => value.toJson()).toList(),
@@ -14999,7 +14973,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityType != null) 'entityType': entityType!,
         if (formattedValue != null) 'formattedValue': formattedValue!,
         if (text != null) 'text': text!,
@@ -15024,7 +14998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityTypes != null)
           'entityTypes': entityTypes!.map((value) => value.toJson()).toList(),
       };
@@ -15047,7 +15021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intents != null)
           'intents': intents!.map((value) => value.toJson()).toList(),
       };
@@ -15119,18 +15093,17 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lifespanCount != null) 'lifespanCount': lifespanCount!,
         if (name != null) 'name': name!,
         if (parameters != null) 'parameters': parameters!,
@@ -15194,7 +15167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversation != null) 'conversation': conversation!,
         if (errorStatus != null) 'errorStatus': errorStatus!.toJson(),
         if (newMessagePayload != null)
@@ -15287,7 +15260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoExpansionMode != null) 'autoExpansionMode': autoExpansionMode!,
         if (displayName != null) 'displayName': displayName!,
         if (enableFuzzyExtraction != null)
@@ -15334,7 +15307,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (synonyms != null) 'synonyms': synonyms!,
         if (value != null) 'value': value!,
       };
@@ -15387,18 +15360,17 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (name != null) 'name': name!,
         if (parameters != null) 'parameters': parameters!,
@@ -15434,7 +15406,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -15671,7 +15643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (defaultResponsePlatforms != null)
           'defaultResponsePlatforms': defaultResponsePlatforms!,
@@ -15728,7 +15700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (followupIntentName != null)
           'followupIntentName': followupIntentName!,
         if (parentFollowupIntentName != null)
@@ -15845,13 +15817,12 @@
           _json['mediaContent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('platform')) {
       platform = _json['platform'] as core.String;
@@ -15879,7 +15850,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicCard != null) 'basicCard': basicCard!.toJson(),
         if (browseCarouselCard != null)
           'browseCarouselCard': browseCarouselCard!.toJson(),
@@ -15955,7 +15926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (formattedText != null) 'formattedText': formattedText!,
@@ -15992,7 +15963,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (openUriAction != null) 'openUriAction': openUriAction!.toJson(),
         if (title != null) 'title': title!,
       };
@@ -16014,7 +15985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -16071,7 +16042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageDisplayOptions != null)
           'imageDisplayOptions': imageDisplayOptions!,
         if (items != null)
@@ -16138,7 +16109,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (footer != null) 'footer': footer!,
         if (image != null) 'image': image!.toJson(),
@@ -16178,7 +16149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
         if (urlTypeHint != null) 'urlTypeHint': urlTypeHint!,
       };
@@ -16227,7 +16198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (imageUri != null) 'imageUri': imageUri!,
@@ -16259,7 +16230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (postback != null) 'postback': postback!,
         if (text != null) 'text': text!,
       };
@@ -16284,7 +16255,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
       };
@@ -16332,7 +16303,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (image != null) 'image': image!.toJson(),
         if (info != null) 'info': info!.toJson(),
@@ -16370,7 +16341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!,
         if (horizontalAlignment != null)
           'horizontalAlignment': horizontalAlignment!,
@@ -16401,7 +16372,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessibilityText != null) 'accessibilityText': accessibilityText!,
         if (imageUri != null) 'imageUri': imageUri!,
       };
@@ -16432,7 +16403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationName != null) 'destinationName': destinationName!,
         if (uri != null) 'uri': uri!,
       };
@@ -16473,7 +16444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (subtitle != null) 'subtitle': subtitle!,
@@ -16522,7 +16493,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (image != null) 'image': image!.toJson(),
         if (info != null) 'info': info!.toJson(),
@@ -16563,7 +16534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mediaObjects != null)
           'mediaObjects': mediaObjects!.map((value) => value.toJson()).toList(),
         if (mediaType != null) 'mediaType': mediaType!,
@@ -16620,7 +16591,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentUrl != null) 'contentUrl': contentUrl!,
         if (description != null) 'description': description!,
         if (icon != null) 'icon': icon!.toJson(),
@@ -16654,7 +16625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quickReplies != null) 'quickReplies': quickReplies!,
         if (title != null) 'title': title!,
       };
@@ -16686,7 +16657,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (synonyms != null) 'synonyms': synonyms!,
       };
@@ -16724,7 +16695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayText != null) 'displayText': displayText!,
         if (ssml != null) 'ssml': ssml!,
         if (textToSpeech != null) 'textToSpeech': textToSpeech!,
@@ -16755,7 +16726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (simpleResponses != null)
           'simpleResponses':
               simpleResponses!.map((value) => value.toJson()).toList(),
@@ -16778,7 +16749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (title != null) 'title': title!,
       };
 }
@@ -16802,7 +16773,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestions != null)
           'suggestions': suggestions!.map((value) => value.toJson()).toList(),
       };
@@ -16877,7 +16848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (columnProperties != null)
@@ -16905,7 +16876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -16937,7 +16908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cells != null)
           'cells': cells!.map((value) => value.toJson()).toList(),
         if (dividerAfter != null) 'dividerAfter': dividerAfter!,
@@ -16961,7 +16932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -17052,7 +17023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (displayName != null) 'displayName': displayName!,
         if (entityTypeDisplayName != null)
@@ -17132,7 +17103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (parts != null)
           'parts': parts!.map((value) => value.toJson()).toList(),
@@ -17189,7 +17160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alias != null) 'alias': alias!,
         if (entityType != null) 'entityType': entityType!,
         if (text != null) 'text': text!,
@@ -17271,7 +17242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (createTime != null) 'createTime': createTime!,
         if (languageCode != null) 'languageCode': languageCode!,
@@ -17310,7 +17281,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containEntities != null) 'containEntities': containEntities!,
         if (parts != null)
           'parts': parts!.map((value) => value.toJson()).toList(),
@@ -17353,13 +17324,12 @@
 
   GoogleCloudDialogflowV2OriginalDetectIntentRequest.fromJson(core.Map _json) {
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('source')) {
       source = _json['source'] as core.String;
@@ -17369,7 +17339,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payload != null) 'payload': payload!,
         if (source != null) 'source': source!,
         if (version != null) 'version': version!,
@@ -17496,14 +17466,13 @@
       allRequiredParamsPresent = _json['allRequiredParamsPresent'] as core.bool;
     }
     if (_json.containsKey('diagnosticInfo')) {
-      diagnosticInfo = (_json['diagnosticInfo'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      diagnosticInfo =
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('fulfillmentMessages')) {
       fulfillmentMessages = (_json['fulfillmentMessages'] as core.List)
@@ -17534,14 +17503,13 @@
           .toList();
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('queryText')) {
       queryText = _json['queryText'] as core.String;
@@ -17557,21 +17525,20 @@
           (_json['speechRecognitionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('webhookPayload')) {
-      webhookPayload = (_json['webhookPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      webhookPayload =
+          (_json['webhookPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('webhookSource')) {
       webhookSource = _json['webhookSource'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (allRequiredParamsPresent != null)
           'allRequiredParamsPresent': allRequiredParamsPresent!,
@@ -17621,7 +17588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (score != null) 'score': score!,
       };
@@ -17650,7 +17617,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queryTextSentiment != null)
           'queryTextSentiment': queryTextSentiment!.toJson(),
       };
@@ -17720,7 +17687,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
         if (entityOverrideMode != null)
@@ -17776,7 +17743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (originalDetectIntentRequest != null)
           'originalDetectIntentRequest': originalDetectIntentRequest!.toJson(),
         if (queryResult != null) 'queryResult': queryResult!.toJson(),
@@ -17890,13 +17857,12 @@
           .toList();
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sessionEntityTypes')) {
       sessionEntityTypes = (_json['sessionEntityTypes'] as core.List)
@@ -17910,7 +17876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (followupEventInput != null)
           'followupEventInput': followupEventInput!.toJson(),
         if (fulfillmentMessages != null)
@@ -17946,7 +17912,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityTypes != null)
           'entityTypes': entityTypes!.map((value) => value.toJson()).toList(),
       };
@@ -17970,7 +17936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intents != null)
           'intents': intents!.map((value) => value.toJson()).toList(),
       };
@@ -18044,18 +18010,17 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lifespanCount != null) 'lifespanCount': lifespanCount!,
         if (name != null) 'name': name!,
         if (parameters != null) 'parameters': parameters!,
@@ -18146,7 +18111,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoExpansionMode != null) 'autoExpansionMode': autoExpansionMode!,
         if (displayName != null) 'displayName': displayName!,
         if (enableFuzzyExtraction != null)
@@ -18193,7 +18158,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (synonyms != null) 'synonyms': synonyms!,
         if (value != null) 'value': value!,
       };
@@ -18246,18 +18211,17 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (name != null) 'name': name!,
         if (parameters != null) 'parameters': parameters!,
@@ -18293,7 +18257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentContent != null) 'agentContent': agentContent!,
         if (agentUri != null) 'agentUri': agentUri!,
       };
@@ -18565,7 +18529,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (defaultResponsePlatforms != null)
           'defaultResponsePlatforms': defaultResponsePlatforms!,
@@ -18625,7 +18589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (followupIntentName != null)
           'followupIntentName': followupIntentName!,
         if (parentFollowupIntentName != null)
@@ -18766,13 +18730,12 @@
               _json['mediaContent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('platform')) {
       platform = _json['platform'] as core.String;
@@ -18836,7 +18799,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicCard != null) 'basicCard': basicCard!.toJson(),
         if (browseCarouselCard != null)
           'browseCarouselCard': browseCarouselCard!.toJson(),
@@ -18924,7 +18887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (formattedText != null) 'formattedText': formattedText!,
@@ -18962,7 +18925,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (openUriAction != null) 'openUriAction': openUriAction!.toJson(),
         if (title != null) 'title': title!,
       };
@@ -18984,7 +18947,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -19041,7 +19004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageDisplayOptions != null)
           'imageDisplayOptions': imageDisplayOptions!,
         if (items != null)
@@ -19108,7 +19071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (footer != null) 'footer': footer!,
         if (image != null) 'image': image!.toJson(),
@@ -19148,7 +19111,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
         if (urlTypeHint != null) 'urlTypeHint': urlTypeHint!,
       };
@@ -19197,7 +19160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (imageUri != null) 'imageUri': imageUri!,
@@ -19231,7 +19194,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (postback != null) 'postback': postback!,
         if (text != null) 'text': text!,
       };
@@ -19258,7 +19221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
       };
@@ -19306,7 +19269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (image != null) 'image': image!.toJson(),
         if (info != null) 'info': info!.toJson(),
@@ -19344,7 +19307,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!,
         if (horizontalAlignment != null)
           'horizontalAlignment': horizontalAlignment!,
@@ -19375,7 +19338,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessibilityText != null) 'accessibilityText': accessibilityText!,
         if (imageUri != null) 'imageUri': imageUri!,
       };
@@ -19406,7 +19369,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationName != null) 'destinationName': destinationName!,
         if (uri != null) 'uri': uri!,
       };
@@ -19447,7 +19410,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (subtitle != null) 'subtitle': subtitle!,
@@ -19497,7 +19460,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (image != null) 'image': image!.toJson(),
         if (info != null) 'info': info!.toJson(),
@@ -19539,7 +19502,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mediaObjects != null)
           'mediaObjects': mediaObjects!.map((value) => value.toJson()).toList(),
         if (mediaType != null) 'mediaType': mediaType!,
@@ -19596,7 +19559,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentUrl != null) 'contentUrl': contentUrl!,
         if (description != null) 'description': description!,
         if (icon != null) 'icon': icon!.toJson(),
@@ -19631,7 +19594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quickReplies != null) 'quickReplies': quickReplies!,
         if (title != null) 'title': title!,
       };
@@ -19689,7 +19652,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (media != null) 'media': media!.toJson(),
         if (suggestions != null)
@@ -19751,7 +19714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileUri != null) 'fileUri': fileUri!,
         if (height != null) 'height': height!,
         if (thumbnailUri != null) 'thumbnailUri': thumbnailUri!,
@@ -19797,7 +19760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cardContents != null)
           'cardContents': cardContents!.map((value) => value.toJson()).toList(),
         if (cardWidth != null) 'cardWidth': cardWidth!,
@@ -19851,7 +19814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cardContent != null) 'cardContent': cardContent!.toJson(),
         if (cardOrientation != null) 'cardOrientation': cardOrientation!,
         if (thumbnailImageAlignment != null)
@@ -19913,7 +19876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dial != null) 'dial': dial!.toJson(),
         if (openUrl != null) 'openUrl': openUrl!.toJson(),
         if (postbackData != null) 'postbackData': postbackData!,
@@ -19942,7 +19905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
       };
 }
@@ -19966,7 +19929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -19980,7 +19943,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Rich Business Messaging (RBM) suggested reply that the user can click
@@ -20008,7 +19971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (postbackData != null) 'postbackData': postbackData!,
         if (text != null) 'text': text!,
       };
@@ -20041,7 +20004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!.toJson(),
         if (reply != null) 'reply': reply!.toJson(),
       };
@@ -20075,7 +20038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rbmSuggestion != null)
           'rbmSuggestion':
               rbmSuggestion!.map((value) => value.toJson()).toList(),
@@ -20110,7 +20073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (synonyms != null) 'synonyms': synonyms!,
       };
@@ -20149,7 +20112,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayText != null) 'displayText': displayText!,
         if (ssml != null) 'ssml': ssml!,
         if (textToSpeech != null) 'textToSpeech': textToSpeech!,
@@ -20181,7 +20144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (simpleResponses != null)
           'simpleResponses':
               simpleResponses!.map((value) => value.toJson()).toList(),
@@ -20204,7 +20167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (title != null) 'title': title!,
       };
 }
@@ -20229,7 +20192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestions != null)
           'suggestions': suggestions!.map((value) => value.toJson()).toList(),
       };
@@ -20306,7 +20269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buttons != null)
           'buttons': buttons!.map((value) => value.toJson()).toList(),
         if (columnProperties != null)
@@ -20335,7 +20298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -20368,7 +20331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cells != null)
           'cells': cells!.map((value) => value.toJson()).toList(),
         if (dividerAfter != null) 'dividerAfter': dividerAfter!,
@@ -20401,7 +20364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioUri != null) 'audioUri': audioUri!,
       };
 }
@@ -20434,7 +20397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ssml != null) 'ssml': ssml!,
         if (text != null) 'text': text!,
       };
@@ -20459,7 +20422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
       };
 }
@@ -20481,7 +20444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -20572,7 +20535,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (displayName != null) 'displayName': displayName!,
         if (entityTypeDisplayName != null)
@@ -20652,7 +20615,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (parts != null)
           'parts': parts!.map((value) => value.toJson()).toList(),
@@ -20710,7 +20673,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alias != null) 'alias': alias!,
         if (entityType != null) 'entityType': entityType!,
         if (text != null) 'text': text!,
@@ -20735,7 +20698,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (answers != null)
           'answers': answers!.map((value) => value.toJson()).toList(),
       };
@@ -20800,7 +20763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (answer != null) 'answer': answer!,
         if (faqQuestion != null) 'faqQuestion': faqQuestion!,
         if (matchConfidence != null) 'matchConfidence': matchConfidence!,
@@ -20831,7 +20794,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
       };
 }
@@ -20873,13 +20836,12 @@
   GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest.fromJson(
       core.Map _json) {
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('source')) {
       source = _json['source'] as core.String;
@@ -20889,7 +20851,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payload != null) 'payload': payload!,
         if (source != null) 'source': source!,
         if (version != null) 'version': version!,
@@ -21020,14 +20982,13 @@
       allRequiredParamsPresent = _json['allRequiredParamsPresent'] as core.bool;
     }
     if (_json.containsKey('diagnosticInfo')) {
-      diagnosticInfo = (_json['diagnosticInfo'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      diagnosticInfo =
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('fulfillmentMessages')) {
       fulfillmentMessages = (_json['fulfillmentMessages'] as core.List)
@@ -21062,14 +21023,13 @@
           .toList();
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('queryText')) {
       queryText = _json['queryText'] as core.String;
@@ -21085,21 +21045,20 @@
           (_json['speechRecognitionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('webhookPayload')) {
-      webhookPayload = (_json['webhookPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      webhookPayload =
+          (_json['webhookPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('webhookSource')) {
       webhookSource = _json['webhookSource'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (allRequiredParamsPresent != null)
           'allRequiredParamsPresent': allRequiredParamsPresent!,
@@ -21151,7 +21110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (score != null) 'score': score!,
       };
@@ -21180,7 +21139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queryTextSentiment != null)
           'queryTextSentiment': queryTextSentiment!.toJson(),
       };
@@ -21253,7 +21212,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
         if (entityOverrideMode != null)
@@ -21321,7 +21280,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternativeQueryResults != null)
           'alternativeQueryResults':
               alternativeQueryResults!.map((value) => value.toJson()).toList(),
@@ -21450,13 +21409,12 @@
           .toList();
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sessionEntityTypes')) {
       sessionEntityTypes = (_json['sessionEntityTypes'] as core.List)
@@ -21470,7 +21428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endInteraction != null) 'endInteraction': endInteraction!,
         if (followupEventInput != null)
           'followupEventInput': followupEventInput!.toJson(),
@@ -21507,7 +21465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -21531,7 +21489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -21558,7 +21516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
       };
 }
@@ -21581,7 +21539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -21604,7 +21562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (warnings != null)
           'warnings': warnings!.map((value) => value.toJson()).toList(),
       };
@@ -21628,7 +21586,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -21652,7 +21610,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericMetadata != null)
           'genericMetadata': genericMetadata!.toJson(),
       };
@@ -21681,7 +21639,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -21742,29 +21700,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -21787,7 +21743,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -21823,8 +21779,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -21837,7 +21793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -21871,7 +21827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
diff --git a/generated/googleapis/lib/digitalassetlinks/v1.dart b/generated/googleapis/lib/digitalassetlinks/v1.dart
index 6f69b8a..76d8337 100644
--- a/generated/googleapis/lib/digitalassetlinks/v1.dart
+++ b/generated/googleapis/lib/digitalassetlinks/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -356,7 +355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificate != null) 'certificate': certificate!.toJson(),
         if (packageName != null) 'packageName': packageName!,
       };
@@ -387,7 +386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidApp != null) 'androidApp': androidApp!.toJson(),
         if (web != null) 'web': web!.toJson(),
       };
@@ -420,7 +419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sha256Fingerprint != null) 'sha256Fingerprint': sha256Fingerprint!,
       };
 }
@@ -469,7 +468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugString != null) 'debugString': debugString!,
         if (errorCode != null) 'errorCode': errorCode!,
         if (linked != null) 'linked': linked!,
@@ -523,7 +522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugString != null) 'debugString': debugString!,
         if (errorCode != null) 'errorCode': errorCode!,
         if (maxAge != null) 'maxAge': maxAge!,
@@ -578,7 +577,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (relation != null) 'relation': relation!,
         if (source != null) 'source': source!.toJson(),
         if (target != null) 'target': target!.toJson(),
@@ -614,7 +613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (site != null) 'site': site!,
       };
 }
diff --git a/generated/googleapis/lib/discovery/v1.dart b/generated/googleapis/lib/discovery/v1.dart
index 1c98ace..a2336cd 100644
--- a/generated/googleapis/lib/discovery/v1.dart
+++ b/generated/googleapis/lib/discovery/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -157,7 +156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x16 != null) 'x16': x16!,
         if (x32 != null) 'x32': x32!,
       };
@@ -244,7 +243,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (discoveryLink != null) 'discoveryLink': discoveryLink!,
         if (discoveryRestUrl != null) 'discoveryRestUrl': discoveryRestUrl!,
@@ -289,7 +288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (discoveryVersion != null) 'discoveryVersion': discoveryVersion!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -312,7 +311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (required != null) 'required': required!,
       };
 }
@@ -332,7 +331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (P_ref != null) '\$ref': P_ref!,
         if (typeValue != null) 'type_value': typeValue!,
       };
@@ -363,7 +362,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (discriminant != null) 'discriminant': discriminant!,
         if (map != null) 'map': map!.map((value) => value.toJson()).toList(),
       };
@@ -505,14 +504,13 @@
       pattern = _json['pattern'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('readOnly')) {
       readOnly = _json['readOnly'] as core.bool;
@@ -532,7 +530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (P_ref != null) '\$ref': P_ref!,
         if (additionalProperties != null)
           'additionalProperties': additionalProperties!.toJson(),
@@ -572,7 +570,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
       };
 }
@@ -586,19 +584,17 @@
 
   RestDescriptionAuthOauth2.fromJson(core.Map _json) {
     if (_json.containsKey('scopes')) {
-      scopes = (_json['scopes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              RestDescriptionAuthOauth2ScopesValue.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      scopes = (_json['scopes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          RestDescriptionAuthOauth2ScopesValue.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (scopes != null)
           'scopes':
               scopes!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -619,7 +615,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (oauth2 != null) 'oauth2': oauth2!.toJson(),
       };
 }
@@ -643,7 +639,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x16 != null) 'x16': x16!,
         if (x32 != null) 'x32': x32!,
       };
@@ -809,14 +805,12 @@
           .toList();
     }
     if (_json.containsKey('methods')) {
-      methods = (_json['methods'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              RestMethod.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      methods = (_json['methods'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          RestMethod.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -831,28 +825,25 @@
       packagePath = _json['packagePath'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('protocol')) {
       protocol = _json['protocol'] as core.String;
     }
     if (_json.containsKey('resources')) {
-      resources = (_json['resources'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              RestResource.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      resources =
+          (_json['resources'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          RestResource.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('revision')) {
       revision = _json['revision'] as core.String;
@@ -861,14 +852,12 @@
       rootUrl = _json['rootUrl'] as core.String;
     }
     if (_json.containsKey('schemas')) {
-      schemas = (_json['schemas'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      schemas = (_json['schemas'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('servicePath')) {
       servicePath = _json['servicePath'] as core.String;
@@ -884,7 +873,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auth != null) 'auth': auth!.toJson(),
         if (basePath != null) 'basePath': basePath!,
         if (baseUrl != null) 'baseUrl': baseUrl!,
@@ -948,7 +937,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (multipart != null) 'multipart': multipart!,
         if (path != null) 'path': path!,
       };
@@ -975,7 +964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (multipart != null) 'multipart': multipart!,
         if (path != null) 'path': path!,
       };
@@ -1002,7 +991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resumable != null) 'resumable': resumable!.toJson(),
         if (simple != null) 'simple': simple!.toJson(),
       };
@@ -1036,7 +1025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accept != null) 'accept': accept!,
         if (maxSize != null) 'maxSize': maxSize!,
         if (protocols != null) 'protocols': protocols!.toJson(),
@@ -1062,7 +1051,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (P_ref != null) '\$ref': P_ref!,
         if (parameterName != null) 'parameterName': parameterName!,
       };
@@ -1081,7 +1070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (P_ref != null) '\$ref': P_ref!,
       };
 }
@@ -1171,14 +1160,13 @@
           .toList();
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('path')) {
       path = _json['path'] as core.String;
@@ -1210,7 +1198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (etagRequired != null) 'etagRequired': etagRequired!,
         if (httpMethod != null) 'httpMethod': httpMethod!,
@@ -1246,29 +1234,25 @@
 
   RestResource.fromJson(core.Map _json) {
     if (_json.containsKey('methods')) {
-      methods = (_json['methods'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              RestMethod.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      methods = (_json['methods'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          RestMethod.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('resources')) {
-      resources = (_json['resources'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              RestResource.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      resources =
+          (_json['resources'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          RestResource.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (methods != null)
           'methods':
               methods!.map((key, item) => core.MapEntry(key, item.toJson())),
diff --git a/generated/googleapis/lib/displayvideo/v1.dart b/generated/googleapis/lib/displayvideo/v1.dart
index 4136571..bd346e5 100644
--- a/generated/googleapis/lib/displayvideo/v1.dart
+++ b/generated/googleapis/lib/displayvideo/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -8781,7 +8780,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Configuration for custom Active View video viewability metrics.
@@ -8883,7 +8882,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (minimumDuration != null) 'minimumDuration': minimumDuration!,
         if (minimumQuartile != null) 'minimumQuartile': minimumQuartile!,
@@ -8909,7 +8908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedAdlooxCategories != null)
           'excludedAdlooxCategories': excludedAdlooxCategories!,
       };
@@ -9046,7 +9045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adServerConfig != null) 'adServerConfig': adServerConfig!.toJson(),
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (creativeConfig != null) 'creativeConfig': creativeConfig!.toJson(),
@@ -9086,7 +9085,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cmHybridConfig != null) 'cmHybridConfig': cmHybridConfig!.toJson(),
         if (thirdPartyOnlyConfig != null)
           'thirdPartyOnlyConfig': thirdPartyOnlyConfig!.toJson(),
@@ -9140,7 +9139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dynamicCreativeEnabled != null)
           'dynamicCreativeEnabled': dynamicCreativeEnabled!,
         if (iasClientId != null) 'iasClientId': iasClientId!,
@@ -9168,7 +9167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sdfConfig != null) 'sdfConfig': sdfConfig!.toJson(),
       };
 }
@@ -9229,7 +9228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (domainUrl != null) 'domainUrl': domainUrl!,
         if (timeZone != null) 'timeZone': timeZone!,
@@ -9264,7 +9263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (overridePartnerSdfConfig != null)
           'overridePartnerSdfConfig': overridePartnerSdfConfig!,
         if (sdfConfig != null) 'sdfConfig': sdfConfig!.toJson(),
@@ -9286,7 +9285,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptTvFromViewabilityTargeting != null)
           'exemptTvFromViewabilityTargeting': exemptTvFromViewabilityTargeting!,
       };
@@ -9335,7 +9334,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ageRange != null) 'ageRange': ageRange!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
       };
@@ -9370,7 +9369,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ageRange != null) 'ageRange': ageRange!,
       };
 }
@@ -9411,7 +9410,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appId != null) 'appId': appId!,
         if (displayName != null) 'displayName': displayName!,
         if (negative != null) 'negative': negative!,
@@ -9452,7 +9451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (negative != null) 'negative': negative!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
@@ -9479,7 +9478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -9508,7 +9507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (mediaId != null) 'mediaId': mediaId!,
       };
@@ -9620,7 +9619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (asset != null) 'asset': asset!.toJson(),
         if (role != null) 'role': role!,
       };
@@ -9662,7 +9661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedInventorySourceId != null)
           'assignedInventorySourceId': assignedInventorySourceId!,
         if (inventorySourceId != null) 'inventorySourceId': inventorySourceId!,
@@ -9709,7 +9708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedLocationId != null)
           'assignedLocationId': assignedLocationId!,
         if (name != null) 'name': name!,
@@ -10285,7 +10284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ageRangeDetails != null)
           'ageRangeDetails': ageRangeDetails!.toJson(),
         if (appCategoryDetails != null)
@@ -10444,7 +10443,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (assignedUserRoleId != null)
           'assignedUserRoleId': assignedUserRoleId!,
@@ -10540,7 +10539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedFirstAndThirdPartyAudienceGroup != null)
           'excludedFirstAndThirdPartyAudienceGroup':
               excludedFirstAndThirdPartyAudienceGroup!.toJson(),
@@ -10580,7 +10579,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (percentage != null) 'percentage': percentage!,
         if (seconds != null) 'seconds': seconds!,
       };
@@ -10677,7 +10676,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adGroupCriteriaCount != null)
           'adGroupCriteriaCount': adGroupCriteriaCount!,
         if (campaignCriteriaCount != null)
@@ -10736,7 +10735,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorizedSellerStatus != null)
           'authorizedSellerStatus': authorizedSellerStatus!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
@@ -10773,7 +10772,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorizedSellerStatus != null)
           'authorizedSellerStatus': authorizedSellerStatus!,
       };
@@ -10827,7 +10826,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixedBid != null) 'fixedBid': fixedBid!.toJson(),
         if (maximizeSpendAutoBid != null)
           'maximizeSpendAutoBid': maximizeSpendAutoBid!.toJson(),
@@ -10872,7 +10871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (negative != null) 'negative': negative!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
@@ -10897,7 +10896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -10939,7 +10938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createRequests != null)
           'createRequests':
               createRequests!.map((value) => value.toJson()).toList(),
@@ -10969,7 +10968,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAssignedTargetingOptions != null)
           'createdAssignedTargetingOptions': createdAssignedTargetingOptions!
               .map((value) => value.toJson())
@@ -11023,7 +11022,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (createdAssignedInventorySources != null)
           'createdAssignedInventorySources': createdAssignedInventorySources!
@@ -11056,7 +11055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedInventorySources != null)
           'assignedInventorySources':
               assignedInventorySources!.map((value) => value.toJson()).toList(),
@@ -11091,7 +11090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAssignedLocations != null)
           'createdAssignedLocations':
               createdAssignedLocations!.map((value) => value.toJson()).toList(),
@@ -11118,7 +11117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedLocations != null)
           'assignedLocations':
               assignedLocations!.map((value) => value.toJson()).toList(),
@@ -11156,7 +11155,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAssignedUserRoles != null)
           'createdAssignedUserRoles':
               createdAssignedUserRoles!.map((value) => value.toJson()).toList(),
@@ -11183,7 +11182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAssignedUserRoles != null)
           'createdAssignedUserRoles':
               createdAssignedUserRoles!.map((value) => value.toJson()).toList(),
@@ -11219,7 +11218,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createRequests != null)
           'createRequests':
               createRequests!.map((value) => value.toJson()).toList(),
@@ -11249,7 +11248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAssignedTargetingOptions != null)
           'createdAssignedTargetingOptions': createdAssignedTargetingOptions!
               .map((value) => value.toJson())
@@ -11283,7 +11282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdNegativeKeywords != null)
           'createdNegativeKeywords':
               createdNegativeKeywords!.map((value) => value.toJson()).toList(),
@@ -11310,7 +11309,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (negativeKeywords != null)
           'negativeKeywords':
               negativeKeywords!.map((value) => value.toJson()).toList(),
@@ -11350,7 +11349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createRequests != null)
           'createRequests':
               createRequests!.map((value) => value.toJson()).toList(),
@@ -11380,7 +11379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAssignedTargetingOptions != null)
           'createdAssignedTargetingOptions': createdAssignedTargetingOptions!
               .map((value) => value.toJson())
@@ -11424,7 +11423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (createdSites != null)
           'createdSites': createdSites!.map((value) => value.toJson()).toList(),
@@ -11451,7 +11450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sites != null)
           'sites': sites!.map((value) => value.toJson()).toList(),
       };
@@ -11487,7 +11486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedTargetingOptions != null)
           'assignedTargetingOptions':
               assignedTargetingOptions!.map((value) => value.toJson()).toList(),
@@ -11527,7 +11526,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedTargetingOptions != null)
           'assignedTargetingOptions':
               assignedTargetingOptions!.map((value) => value.toJson()).toList(),
@@ -11565,7 +11564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedTargetingOptions != null)
           'assignedTargetingOptions':
               assignedTargetingOptions!.map((value) => value.toJson()).toList(),
@@ -11679,7 +11678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (campaignFlight != null) 'campaignFlight': campaignFlight!.toJson(),
         if (campaignGoal != null) 'campaignGoal': campaignGoal!.toJson(),
@@ -11727,7 +11726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (plannedDates != null) 'plannedDates': plannedDates!.toJson(),
         if (plannedSpendAmountMicros != null)
           'plannedSpendAmountMicros': plannedSpendAmountMicros!,
@@ -11772,7 +11771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (campaignGoalType != null) 'campaignGoalType': campaignGoalType!,
         if (performanceGoal != null)
           'performanceGoal': performanceGoal!.toJson(),
@@ -11815,7 +11814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (negative != null) 'negative': negative!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
@@ -11855,7 +11854,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (type != null) 'type': type!,
       };
@@ -11894,7 +11893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (negative != null) 'negative': negative!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
@@ -11919,7 +11918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -11973,7 +11972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (channelId != null) 'channelId': channelId!,
         if (displayName != null) 'displayName': displayName!,
@@ -12013,7 +12012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (negative != null) 'negative': negative!,
       };
@@ -12083,7 +12082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cmAccountId != null) 'cmAccountId': cmAccountId!,
         if (cmFloodlightConfigId != null)
           'cmFloodlightConfigId': cmFloodlightConfigId!,
@@ -12122,7 +12121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cmAdId != null) 'cmAdId': cmAdId!,
         if (cmCreativeId != null) 'cmCreativeId': cmCreativeId!,
         if (cmPlacementId != null) 'cmPlacementId': cmPlacementId!,
@@ -12164,7 +12163,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (combinedAudienceId != null)
           'combinedAudienceId': combinedAudienceId!,
         if (displayName != null) 'displayName': displayName!,
@@ -12197,7 +12196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (settings != null)
           'settings': settings!.map((value) => value.toJson()).toList(),
       };
@@ -12220,7 +12219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (combinedAudienceId != null)
           'combinedAudienceId': combinedAudienceId!,
       };
@@ -12288,7 +12287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adType != null) 'adType': adType!,
         if (contentInstreamPosition != null)
           'contentInstreamPosition': contentInstreamPosition!,
@@ -12326,7 +12325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentInstreamPosition != null)
           'contentInstreamPosition': contentInstreamPosition!,
       };
@@ -12399,7 +12398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adType != null) 'adType': adType!,
         if (contentOutstreamPosition != null)
           'contentOutstreamPosition': contentOutstreamPosition!,
@@ -12442,7 +12441,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentOutstreamPosition != null)
           'contentOutstreamPosition': contentOutstreamPosition!,
       };
@@ -12483,7 +12482,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (floodlightActivityConfigs != null)
           'floodlightActivityConfigs': floodlightActivityConfigs!
               .map((value) => value.toJson())
@@ -12516,7 +12515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (reportingName != null) 'reportingName': reportingName!,
       };
@@ -12539,7 +12538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filename != null) 'filename': filename!,
       };
 }
@@ -12558,7 +12557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (asset != null) 'asset': asset!.toJson(),
       };
 }
@@ -12671,7 +12670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedTargetingOptions != null)
           'assignedTargetingOptions':
               assignedTargetingOptions!.map((value) => value.toJson()).toList(),
@@ -12748,7 +12747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (idFilter != null) 'idFilter': idFilter!.toJson(),
         if (inventorySourceFilter != null)
@@ -13432,7 +13431,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalDimensions != null)
           'additionalDimensions':
               additionalDimensions!.map((value) => value.toJson()).toList(),
@@ -13573,7 +13572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeType != null) 'creativeType': creativeType!,
         if (displayCreativeConfig != null)
           'displayCreativeConfig': displayCreativeConfig!.toJson(),
@@ -13671,7 +13670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (customBiddingAlgorithmId != null)
           'customBiddingAlgorithmId': customBiddingAlgorithmId!,
@@ -13720,7 +13719,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customListId != null) 'customListId': customListId!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -13750,7 +13749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (settings != null)
           'settings': settings!.map((value) => value.toJson()).toList(),
       };
@@ -13773,7 +13772,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customListId != null) 'customListId': customListId!,
       };
 }
@@ -13818,7 +13817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -13850,7 +13849,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!.toJson(),
         if (startDate != null) 'startDate': startDate!.toJson(),
       };
@@ -13920,7 +13919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dayOfWeek != null) 'dayOfWeek': dayOfWeek!,
         if (endHour != null) 'endHour': endHour!,
         if (startHour != null) 'startHour': startHour!,
@@ -13937,7 +13936,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A request listing which assigned targeting options of a given targeting type
@@ -14046,7 +14045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedTargetingOptionIds != null)
           'assignedTargetingOptionIds': assignedTargetingOptionIds!,
         if (targetingType != null) 'targetingType': targetingType!,
@@ -14086,7 +14085,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (negative != null) 'negative': negative!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
@@ -14111,7 +14110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -14150,7 +14149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceType != null) 'deviceType': deviceType!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
       };
@@ -14182,7 +14181,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceType != null) 'deviceType': deviceType!,
       };
 }
@@ -14226,7 +14225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentRatingTier != null) 'contentRatingTier': contentRatingTier!,
         if (excludedTargetingOptionId != null)
           'excludedTargetingOptionId': excludedTargetingOptionId!,
@@ -14264,7 +14263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentRatingTier != null) 'contentRatingTier': contentRatingTier!,
       };
 }
@@ -14288,7 +14287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (heightPixels != null) 'heightPixels': heightPixels!,
         if (widthPixels != null) 'widthPixels': widthPixels!,
       };
@@ -14356,7 +14355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appStarRating != null) 'appStarRating': appStarRating!.toJson(),
         if (avoidedAgeRatings != null) 'avoidedAgeRatings': avoidedAgeRatings!,
         if (brandSafetyCategories != null)
@@ -14401,7 +14400,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (avoidInsufficientStarRating != null)
           'avoidInsufficientStarRating': avoidInsufficientStarRating!,
         if (avoidedStarRating != null) 'avoidedStarRating': avoidedStarRating!,
@@ -14440,7 +14439,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (avoidUnknownBrandSafetyCategory != null)
           'avoidUnknownBrandSafetyCategory': avoidUnknownBrandSafetyCategory!,
         if (avoidedHighSeverityCategories != null)
@@ -14499,7 +14498,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iab != null) 'iab': iab!,
         if (viewableDuring != null) 'viewableDuring': viewableDuring!,
       };
@@ -14535,7 +14534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (avoidInsufficientOption != null)
           'avoidInsufficientOption': avoidInsufficientOption!,
         if (avoidedFraudOption != null)
@@ -14612,7 +14611,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (playerImpressionRate != null)
           'playerImpressionRate': playerImpressionRate!,
         if (videoIab != null) 'videoIab': videoIab!,
@@ -14634,7 +14633,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Assigned environment targeting option details.
@@ -14680,7 +14679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
       };
@@ -14719,7 +14718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!,
       };
 }
@@ -14743,7 +14742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
       };
 }
@@ -14767,7 +14766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabledExchanges != null)
           'enabledExchanges':
               enabledExchanges!.map((value) => value.toJson()).toList(),
@@ -14882,7 +14881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exchange != null) 'exchange': exchange!,
         if (googleAdManagerAgencyId != null)
           'googleAdManagerAgencyId': googleAdManagerAgencyId!,
@@ -14983,7 +14982,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exchange != null) 'exchange': exchange!,
         if (status != null) 'status': status!,
       };
@@ -15073,7 +15072,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exchange != null) 'exchange': exchange!,
       };
 }
@@ -15127,7 +15126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (reportingName != null) 'reportingName': reportingName!,
         if (type != null) 'type': type!,
@@ -15339,7 +15338,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeDisplayAudienceSize != null)
           'activeDisplayAudienceSize': activeDisplayAudienceSize!,
         if (audienceSource != null) 'audienceSource': audienceSource!,
@@ -15392,7 +15391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (settings != null)
           'settings': settings!.map((value) => value.toJson()).toList(),
       };
@@ -15458,7 +15457,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firstAndThirdPartyAudienceId != null)
           'firstAndThirdPartyAudienceId': firstAndThirdPartyAudienceId!,
         if (recency != null) 'recency': recency!,
@@ -15484,7 +15483,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidAmountMicros != null) 'bidAmountMicros': bidAmountMicros!,
       };
 }
@@ -15559,14 +15558,13 @@
           _json['activeViewConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customVariables')) {
-      customVariables = (_json['customVariables'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      customVariables =
+          (_json['customVariables'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
@@ -15586,7 +15584,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeViewConfig != null)
           'activeViewConfig': activeViewConfig!.toJson(),
         if (customVariables != null) 'customVariables': customVariables!,
@@ -15660,7 +15658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxImpressions != null) 'maxImpressions': maxImpressions!,
         if (timeUnit != null) 'timeUnit': timeUnit!,
         if (timeUnitCount != null) 'timeUnitCount': timeUnitCount!,
@@ -15702,7 +15700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gender != null) 'gender': gender!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
       };
@@ -15733,7 +15731,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gender != null) 'gender': gender!,
       };
 }
@@ -15818,7 +15816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (geoRegionType != null) 'geoRegionType': geoRegionType!,
         if (negative != null) 'negative': negative!,
@@ -15841,7 +15839,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (geoRegionQuery != null) 'geoRegionQuery': geoRegionQuery!,
       };
 }
@@ -15911,7 +15909,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (geoRegionType != null) 'geoRegionType': geoRegionType!,
       };
@@ -15976,7 +15974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (googleAudienceId != null) 'googleAudienceId': googleAudienceId!,
         if (googleAudienceType != null)
@@ -16008,7 +16006,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (settings != null)
           'settings': settings!.map((value) => value.toJson()).toList(),
       };
@@ -16031,7 +16029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (googleAudienceId != null) 'googleAudienceId': googleAudienceId!,
       };
 }
@@ -16049,7 +16047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceName != null) 'resourceName': resourceName!,
       };
 }
@@ -16099,7 +16097,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (householdIncome != null) 'householdIncome': householdIncome!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
       };
@@ -16141,7 +16139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (householdIncome != null) 'householdIncome': householdIncome!,
       };
 }
@@ -16219,7 +16217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adGroupAdIds != null) 'adGroupAdIds': adGroupAdIds!,
         if (adGroupIds != null) 'adGroupIds': adGroupIds!,
         if (campaignIds != null) 'campaignIds': campaignIds!,
@@ -16396,7 +16394,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (bidStrategy != null) 'bidStrategy': bidStrategy!.toJson(),
         if (budget != null) 'budget': budget!.toJson(),
@@ -16478,7 +16476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (automationType != null) 'automationType': automationType!,
         if (budgetSegments != null)
           'budgetSegments':
@@ -16537,7 +16535,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (budgetAmountMicros != null)
           'budgetAmountMicros': budgetAmountMicros!,
         if (campaignBudgetId != null) 'campaignBudgetId': campaignBudgetId!,
@@ -16714,7 +16712,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customSegmentId != null) 'customSegmentId': customSegmentId!,
         if (displayViewability != null)
           'displayViewability': displayViewability!,
@@ -16765,7 +16763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!,
         if (integrationCode != null) 'integrationCode': integrationCode!,
       };
@@ -16978,7 +16976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commitment != null) 'commitment': commitment!,
         if (creativeConfigs != null)
           'creativeConfigs':
@@ -17020,7 +17018,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inventorySourceId != null) 'inventorySourceId': inventorySourceId!,
       };
 }
@@ -17040,7 +17038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeSize != null) 'creativeSize': creativeSize!.toJson(),
       };
 }
@@ -17064,7 +17062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inventorySourceIds != null)
           'inventorySourceIds': inventorySourceIds!,
       };
@@ -17105,7 +17103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (inventorySourceGroupId != null)
           'inventorySourceGroupId': inventorySourceGroupId!,
@@ -17134,7 +17132,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inventorySourceGroupId != null)
           'inventorySourceGroupId': inventorySourceGroupId!,
       };
@@ -17235,7 +17233,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configStatus != null) 'configStatus': configStatus!,
         if (entityPauseReason != null) 'entityPauseReason': entityPauseReason!,
         if (entityStatus != null) 'entityStatus': entityStatus!,
@@ -17258,7 +17256,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
       };
 }
@@ -17291,7 +17289,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyword != null) 'keyword': keyword!,
         if (negative != null) 'negative': negative!,
       };
@@ -17333,7 +17331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (negative != null) 'negative': negative!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
@@ -17358,7 +17356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -17621,7 +17619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (bidStrategy != null) 'bidStrategy': bidStrategy!.toJson(),
         if (budget != null) 'budget': budget!.toJson(),
@@ -17713,7 +17711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (budgetAllocationType != null)
           'budgetAllocationType': budgetAllocationType!,
         if (budgetUnit != null) 'budgetUnit': budgetUnit!,
@@ -17770,7 +17768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dateRange != null) 'dateRange': dateRange!.toJson(),
         if (flightDateType != null) 'flightDateType': flightDateType!,
         if (triggerId != null) 'triggerId': triggerId!,
@@ -17808,7 +17806,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedTargetingOptions != null)
           'assignedTargetingOptions':
               assignedTargetingOptions!.map((value) => value.toJson()).toList(),
@@ -17842,7 +17840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertisers != null)
           'advertisers': advertisers!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -17880,7 +17878,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedInventorySources != null)
           'assignedInventorySources':
               assignedInventorySources!.map((value) => value.toJson()).toList(),
@@ -17915,7 +17913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedLocations != null)
           'assignedLocations':
               assignedLocations!.map((value) => value.toJson()).toList(),
@@ -17949,7 +17947,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (campaigns != null)
           'campaigns': campaigns!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -17982,7 +17980,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channels != null)
           'channels': channels!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -18015,7 +18013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (combinedAudiences != null)
           'combinedAudiences':
               combinedAudiences!.map((value) => value.toJson()).toList(),
@@ -18050,7 +18048,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creatives != null)
           'creatives': creatives!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -18085,7 +18083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customBiddingAlgorithms != null)
           'customBiddingAlgorithms':
               customBiddingAlgorithms!.map((value) => value.toJson()).toList(),
@@ -18119,7 +18117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customLists != null)
           'customLists': customLists!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -18156,7 +18154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firstAndThirdPartyAudiences != null)
           'firstAndThirdPartyAudiences': firstAndThirdPartyAudiences!
               .map((value) => value.toJson())
@@ -18191,7 +18189,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (googleAudiences != null)
           'googleAudiences':
               googleAudiences!.map((value) => value.toJson()).toList(),
@@ -18230,7 +18228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedTargetingOptions != null)
           'assignedTargetingOptions':
               assignedTargetingOptions!.map((value) => value.toJson()).toList(),
@@ -18264,7 +18262,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (insertionOrders != null)
           'insertionOrders':
               insertionOrders!.map((value) => value.toJson()).toList(),
@@ -18299,7 +18297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inventorySourceGroups != null)
           'inventorySourceGroups':
               inventorySourceGroups!.map((value) => value.toJson()).toList(),
@@ -18333,7 +18331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inventorySources != null)
           'inventorySources':
               inventorySources!.map((value) => value.toJson()).toList(),
@@ -18372,7 +18370,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedTargetingOptions != null)
           'assignedTargetingOptions':
               assignedTargetingOptions!.map((value) => value.toJson()).toList(),
@@ -18406,7 +18404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItems != null)
           'lineItems': lineItems!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -18439,7 +18437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locationLists != null)
           'locationLists':
               locationLists!.map((value) => value.toJson()).toList(),
@@ -18473,7 +18471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (manualTriggers != null)
           'manualTriggers':
               manualTriggers!.map((value) => value.toJson()).toList(),
@@ -18508,7 +18506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (negativeKeywordLists != null)
           'negativeKeywordLists':
               negativeKeywordLists!.map((value) => value.toJson()).toList(),
@@ -18543,7 +18541,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (negativeKeywords != null)
           'negativeKeywords':
               negativeKeywords!.map((value) => value.toJson()).toList(),
@@ -18581,7 +18579,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedTargetingOptions != null)
           'assignedTargetingOptions':
               assignedTargetingOptions!.map((value) => value.toJson()).toList(),
@@ -18615,7 +18613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (partners != null)
           'partners': partners!.map((value) => value.toJson()).toList(),
@@ -18649,7 +18647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sites != null)
           'sites': sites!.map((value) => value.toJson()).toList(),
@@ -18683,7 +18681,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (targetingOptions != null)
           'targetingOptions':
@@ -18718,7 +18716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (users != null)
           'users': users!.map((value) => value.toJson()).toList(),
@@ -18784,7 +18782,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (displayName != null) 'displayName': displayName!,
         if (locationListId != null) 'locationListId': locationListId!,
@@ -18815,7 +18813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clickDays != null) 'clickDays': clickDays!,
         if (impressionDays != null) 'impressionDays': impressionDays!,
       };
@@ -18898,7 +18896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activationDurationMinutes != null)
           'activationDurationMinutes': activationDurationMinutes!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
@@ -18966,7 +18964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customBiddingAlgorithmId != null)
           'customBiddingAlgorithmId': customBiddingAlgorithmId!,
         if (maxAverageCpmBidAmountMicros != null)
@@ -18997,7 +18995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dv360ToCmCostReportingEnabled != null)
           'dv360ToCmCostReportingEnabled': dv360ToCmCostReportingEnabled!,
         if (dv360ToCmDataSharingEnabled != null)
@@ -19052,7 +19050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appId != null) 'appId': appId!,
         if (displayName != null) 'displayName': displayName!,
         if (platform != null) 'platform': platform!,
@@ -19093,7 +19091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -19129,7 +19127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keywordValue != null) 'keywordValue': keywordValue!,
         if (name != null) 'name': name!,
       };
@@ -19178,7 +19176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -19208,7 +19206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (negativeKeywordListId != null)
           'negativeKeywordListId': negativeKeywordListId!,
       };
@@ -19296,7 +19294,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clickTrackingUrl != null) 'clickTrackingUrl': clickTrackingUrl!,
         if (dimensions != null) 'dimensions': dimensions!.toJson(),
         if (landingPageUrl != null) 'landingPageUrl': landingPageUrl!,
@@ -19365,7 +19363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adType != null) 'adType': adType!,
         if (onScreenPosition != null) 'onScreenPosition': onScreenPosition!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
@@ -19398,7 +19396,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (onScreenPosition != null) 'onScreenPosition': onScreenPosition!,
       };
 }
@@ -19436,7 +19434,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (negative != null) 'negative': negative!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
@@ -19461,7 +19459,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -19520,29 +19518,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -19621,7 +19617,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dailyMaxImpressions != null)
           'dailyMaxImpressions': dailyMaxImpressions!,
         if (dailyMaxMicros != null) 'dailyMaxMicros': dailyMaxMicros!,
@@ -19692,7 +19688,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileType != null) 'fileType': fileType!,
         if (filterIds != null) 'filterIds': filterIds!,
         if (filterType != null) 'filterType': filterType!,
@@ -19734,7 +19730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parentalStatus != null) 'parentalStatus': parentalStatus!,
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
       };
@@ -19766,7 +19762,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parentalStatus != null) 'parentalStatus': parentalStatus!,
       };
 }
@@ -19863,7 +19859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adServerConfig != null) 'adServerConfig': adServerConfig!.toJson(),
         if (dataAccessConfig != null)
           'dataAccessConfig': dataAccessConfig!.toJson(),
@@ -19891,7 +19887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (measurementConfig != null)
           'measurementConfig': measurementConfig!.toJson(),
       };
@@ -20021,7 +20017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (costType != null) 'costType': costType!,
         if (feeAmount != null) 'feeAmount': feeAmount!,
         if (feePercentageMillis != null)
@@ -20047,7 +20043,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sdfConfig != null) 'sdfConfig': sdfConfig!.toJson(),
       };
 }
@@ -20078,7 +20074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (timeZone != null) 'timeZone': timeZone!,
       };
@@ -20128,7 +20124,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (markupAmount != null) 'markupAmount': markupAmount!,
         if (markupType != null) 'markupType': markupType!,
       };
@@ -20219,7 +20215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (performanceGoalAmountMicros != null)
           'performanceGoalAmountMicros': performanceGoalAmountMicros!,
         if (performanceGoalPercentageMicros != null)
@@ -20320,7 +20316,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customBiddingAlgorithmId != null)
           'customBiddingAlgorithmId': customBiddingAlgorithmId!,
         if (maxAverageCpmBidAmountMicros != null)
@@ -20375,7 +20371,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (proximityLocationListId != null)
           'proximityLocationListId': proximityLocationListId!,
         if (proximityRadiusRange != null)
@@ -20408,7 +20404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publisherName != null) 'publisherName': publisherName!,
         if (status != null) 'status': status!,
       };
@@ -20465,7 +20461,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inventorySourceRateType != null)
           'inventorySourceRateType': inventorySourceRateType!,
         if (minimumSpend != null) 'minimumSpend': minimumSpend!.toJson(),
@@ -20501,7 +20497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (negative != null) 'negative': negative!,
         if (regionalLocationListId != null)
           'regionalLocationListId': regionalLocationListId!,
@@ -20580,7 +20576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approvalStatus != null) 'approvalStatus': approvalStatus!,
         if (contentAndPolicyReviewStatus != null)
           'contentAndPolicyReviewStatus': contentAndPolicyReviewStatus!,
@@ -20629,7 +20625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminEmail != null) 'adminEmail': adminEmail!,
         if (version != null) 'version': version!,
       };
@@ -20655,7 +20651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceName != null) 'resourceName': resourceName!,
       };
 }
@@ -20697,7 +20693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
         if (version != null) 'version': version!,
@@ -20747,7 +20743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (geoRegionSearchTerms != null)
           'geoRegionSearchTerms': geoRegionSearchTerms!.toJson(),
@@ -20783,7 +20779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (targetingOptions != null)
           'targetingOptions':
@@ -20869,7 +20865,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedTargetingOptionId != null)
           'excludedTargetingOptionId': excludedTargetingOptionId!,
         if (sensitiveCategory != null) 'sensitiveCategory': sensitiveCategory!,
@@ -20946,7 +20942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sensitiveCategory != null) 'sensitiveCategory': sensitiveCategory!,
       };
 }
@@ -20978,7 +20974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (urlOrAppId != null) 'urlOrAppId': urlOrAppId!,
       };
@@ -21017,8 +21013,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -21031,7 +21027,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -21057,7 +21053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
       };
 }
@@ -21080,7 +21076,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -21128,7 +21124,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludeFirstPartyAudience != null)
           'excludeFirstPartyAudience': excludeFirstPartyAudience!,
         if (targetingExpansionLevel != null)
@@ -21443,7 +21439,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ageRangeDetails != null)
           'ageRangeDetails': ageRangeDetails!.toJson(),
         if (appCategoryDetails != null)
@@ -21517,7 +21513,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pixelOrderIdReportingEnabled != null)
           'pixelOrderIdReportingEnabled': pixelOrderIdReportingEnabled!,
       };
@@ -21581,7 +21577,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (url != null) 'url': url!,
       };
@@ -21618,7 +21614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adloox != null) 'adloox': adloox!.toJson(),
         if (doubleVerify != null) 'doubleVerify': doubleVerify!.toJson(),
         if (integralAdScience != null)
@@ -21649,7 +21645,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -21678,7 +21674,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (reportingName != null) 'reportingName': reportingName!,
       };
@@ -21723,7 +21719,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (floodlightActivityId != null)
           'floodlightActivityId': floodlightActivityId!,
         if (postClickLookbackWindowDays != null)
@@ -21797,7 +21793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioBitRateKbps != null) 'audioBitRateKbps': audioBitRateKbps!,
         if (audioSampleRateHz != null) 'audioSampleRateHz': audioSampleRateHz!,
         if (bitRateKbps != null) 'bitRateKbps': bitRateKbps!,
@@ -21845,7 +21841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (registry != null) 'registry': registry!,
       };
@@ -21879,7 +21875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (negative != null) 'negative': negative!,
         if (url != null) 'url': url!,
       };
@@ -21940,7 +21936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedUserRoles != null)
           'assignedUserRoles':
               assignedUserRoles!.map((value) => value.toJson()).toList(),
@@ -21985,7 +21981,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
         if (userRewardedContent != null)
           'userRewardedContent': userRewardedContent!,
@@ -22017,7 +22013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userRewardedContent != null)
           'userRewardedContent': userRewardedContent!,
       };
@@ -22065,7 +22061,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
         if (videoPlayerSize != null) 'videoPlayerSize': videoPlayerSize!,
       };
@@ -22102,7 +22098,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (videoPlayerSize != null) 'videoPlayerSize': videoPlayerSize!,
       };
 }
@@ -22157,7 +22153,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetingOptionId != null) 'targetingOptionId': targetingOptionId!,
         if (viewability != null) 'viewability': viewability!,
       };
@@ -22203,7 +22199,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (viewability != null) 'viewability': viewability!,
       };
 }
diff --git a/generated/googleapis/lib/dlp/v2.dart b/generated/googleapis/lib/dlp/v2.dart
index e80ce8b..2be7688 100644
--- a/generated/googleapis/lib/dlp/v2.dart
+++ b/generated/googleapis/lib/dlp/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -5909,7 +5908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobNotificationEmails != null)
           'jobNotificationEmails': jobNotificationEmails!.toJson(),
         if (pubSub != null) 'pubSub': pubSub!.toJson(),
@@ -5932,7 +5931,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Result of a risk analysis operation request.
@@ -6012,7 +6011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoricalStatsResult != null)
           'categoricalStatsResult': categoricalStatsResult!.toJson(),
         if (deltaPresenceEstimationResult != null)
@@ -6082,7 +6081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quasiIds != null)
           'quasiIds': quasiIds!.map((value) => value.toJson()).toList(),
         if (relativeFrequency != null)
@@ -6112,7 +6111,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!.toJson(),
         if (table != null) 'table': table!.toJson(),
       };
@@ -6143,7 +6142,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rowNumber != null) 'rowNumber': rowNumber!,
         if (tableReference != null) 'tableReference': tableReference!.toJson(),
       };
@@ -6225,7 +6224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedFields != null)
           'excludedFields':
               excludedFields!.map((value) => value.toJson()).toList(),
@@ -6270,7 +6269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetId != null) 'datasetId': datasetId!,
         if (projectId != null) 'projectId': projectId!,
         if (tableId != null) 'tableId': tableId!,
@@ -6312,7 +6311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (left != null) 'left': left!,
         if (top != null) 'top': top!,
@@ -6352,7 +6351,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (max != null) 'max': max!.toJson(),
         if (min != null) 'min': min!.toJson(),
         if (replacementValue != null)
@@ -6387,7 +6386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buckets != null)
           'buckets': buckets!.map((value) => value.toJson()).toList(),
       };
@@ -6433,7 +6432,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
         if (type != null) 'type': type!,
       };
@@ -6447,7 +6446,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Compute numerical stats over an individual column, including number of
@@ -6469,7 +6468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!.toJson(),
       };
 }
@@ -6519,7 +6518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketSize != null) 'bucketSize': bucketSize!,
         if (bucketValueCount != null) 'bucketValueCount': bucketValueCount!,
         if (bucketValues != null)
@@ -6550,7 +6549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (valueFrequencyHistogramBuckets != null)
           'valueFrequencyHistogramBuckets': valueFrequencyHistogramBuckets!
               .map((value) => value.toJson())
@@ -6618,7 +6617,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (charactersToIgnore != null)
           'charactersToIgnore':
               charactersToIgnore!.map((value) => value.toJson()).toList(),
@@ -6660,7 +6659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (charactersToSkip != null) 'charactersToSkip': charactersToSkip!,
         if (commonCharactersToIgnore != null)
           'commonCharactersToIgnore': commonCharactersToIgnore!,
@@ -6682,7 +6681,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -6760,7 +6759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bytesLimitPerFile != null) 'bytesLimitPerFile': bytesLimitPerFile!,
         if (bytesLimitPerFilePercent != null)
           'bytesLimitPerFilePercent': bytesLimitPerFilePercent!,
@@ -6786,7 +6785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (path != null) 'path': path!,
       };
 }
@@ -6855,7 +6854,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketName != null) 'bucketName': bucketName!,
         if (excludeRegex != null) 'excludeRegex': excludeRegex!,
         if (includeRegex != null) 'includeRegex': includeRegex!,
@@ -6887,7 +6886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blue != null) 'blue': blue!,
         if (green != null) 'green': green!,
         if (red != null) 'red': red!,
@@ -6949,7 +6948,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!.toJson(),
         if (operator != null) 'operator': operator!,
         if (value != null) 'value': value!.toJson(),
@@ -6973,7 +6972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
       };
@@ -7049,7 +7048,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullPath != null) 'fullPath': fullPath!,
         if (projectId != null) 'projectId': projectId!,
         if (relativePath != null) 'relativePath': relativePath!,
@@ -7092,7 +7091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (byteItem != null) 'byteItem': byteItem!.toJson(),
         if (table != null) 'table': table!.toJson(),
         if (value != null) 'value': value!,
@@ -7165,7 +7164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerName != null) 'containerName': containerName!,
         if (containerTimestamp != null)
           'containerTimestamp': containerTimestamp!,
@@ -7213,7 +7212,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deidentifyTemplate != null)
           'deidentifyTemplate': deidentifyTemplate!.toJson(),
         if (locationId != null) 'locationId': locationId!,
@@ -7264,7 +7263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inspectJob != null) 'inspectJob': inspectJob!.toJson(),
         if (jobId != null) 'jobId': jobId!,
         if (locationId != null) 'locationId': locationId!,
@@ -7306,7 +7305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inspectTemplate != null)
           'inspectTemplate': inspectTemplate!.toJson(),
         if (locationId != null) 'locationId': locationId!,
@@ -7348,7 +7347,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobTrigger != null) 'jobTrigger': jobTrigger!.toJson(),
         if (locationId != null) 'locationId': locationId!,
         if (triggerId != null) 'triggerId': triggerId!,
@@ -7390,7 +7389,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (locationId != null) 'locationId': locationId!,
         if (storedInfoTypeId != null) 'storedInfoTypeId': storedInfoTypeId!,
@@ -7465,7 +7464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (cryptoKey != null) 'cryptoKey': cryptoKey!.toJson(),
         if (surrogateInfoType != null)
@@ -7493,7 +7492,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cryptoKey != null) 'cryptoKey': cryptoKey!.toJson(),
       };
 }
@@ -7531,7 +7530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsWrapped != null) 'kmsWrapped': kmsWrapped!.toJson(),
         if (transient != null) 'transient': transient!.toJson(),
         if (unwrapped != null) 'unwrapped': unwrapped!.toJson(),
@@ -7646,7 +7645,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonAlphabet != null) 'commonAlphabet': commonAlphabet!,
         if (context != null) 'context': context!.toJson(),
         if (cryptoKey != null) 'cryptoKey': cryptoKey!.toJson(),
@@ -7755,7 +7754,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectionRules != null)
           'detectionRules':
               detectionRules!.map((value) => value.toJson()).toList(),
@@ -7783,7 +7782,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityKey != null) 'entityKey': entityKey!.toJson(),
       };
 }
@@ -7812,7 +7811,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!.toJson(),
         if (partitionId != null) 'partitionId': partitionId!.toJson(),
       };
@@ -7869,7 +7868,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (cryptoKey != null) 'cryptoKey': cryptoKey!.toJson(),
         if (lowerBoundDays != null) 'lowerBoundDays': lowerBoundDays!,
@@ -7924,7 +7923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (dayOfWeek != null) 'dayOfWeek': dayOfWeek!,
         if (time != null) 'time': time!.toJson(),
@@ -7972,7 +7971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (infoTypeTransformations != null)
           'infoTypeTransformations': infoTypeTransformations!.toJson(),
         if (recordTransformations != null)
@@ -8048,7 +8047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deidentifyConfig != null)
           'deidentifyConfig': deidentifyConfig!.toJson(),
         if (deidentifyTemplateName != null)
@@ -8082,7 +8081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (item != null) 'item': item!.toJson(),
         if (overview != null) 'overview': overview!.toJson(),
       };
@@ -8144,7 +8143,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (deidentifyConfig != null)
           'deidentifyConfig': deidentifyConfig!.toJson(),
@@ -8202,7 +8201,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auxiliaryTables != null)
           'auxiliaryTables':
               auxiliaryTables!.map((value) => value.toJson()).toList(),
@@ -8263,7 +8262,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketSize != null) 'bucketSize': bucketSize!,
         if (bucketValueCount != null) 'bucketValueCount': bucketValueCount!,
         if (bucketValues != null)
@@ -8306,7 +8305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (estimatedProbability != null)
           'estimatedProbability': estimatedProbability!,
         if (quasiIdsValues != null)
@@ -8345,7 +8344,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deltaPresenceEstimationHistogram != null)
           'deltaPresenceEstimationHistogram': deltaPresenceEstimationHistogram!
               .map((value) => value.toJson())
@@ -8371,7 +8370,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hotwordRule != null) 'hotwordRule': hotwordRule!.toJson(),
       };
 }
@@ -8419,7 +8418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudStoragePath != null)
           'cloudStoragePath': cloudStoragePath!.toJson(),
         if (wordList != null) 'wordList': wordList!.toJson(),
@@ -8516,7 +8515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
         if (errors != null)
@@ -8545,7 +8544,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileOffset != null) 'fileOffset': fileOffset!,
       };
 }
@@ -8570,7 +8569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!.toJson(),
       };
 }
@@ -8598,7 +8597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!.toJson(),
         if (timestamps != null) 'timestamps': timestamps!,
       };
@@ -8629,7 +8628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (infoTypes != null)
           'infoTypes': infoTypes!.map((value) => value.toJson()).toList(),
       };
@@ -8683,7 +8682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dictionary != null) 'dictionary': dictionary!.toJson(),
         if (excludeInfoTypes != null)
           'excludeInfoTypes': excludeInfoTypes!.toJson(),
@@ -8717,7 +8716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conditions != null) 'conditions': conditions!.toJson(),
         if (logicalOperator != null) 'logicalOperator': logicalOperator!,
       };
@@ -8736,7 +8735,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -8793,7 +8792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
@@ -8833,7 +8832,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (regexFileSet != null) 'regexFileSet': regexFileSet!.toJson(),
         if (url != null) 'url': url!,
       };
@@ -8927,13 +8926,12 @@
       jobName = _json['jobName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('likelihood')) {
       likelihood = _json['likelihood'] as core.String;
@@ -8960,7 +8958,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (findingId != null) 'findingId': findingId!,
         if (infoType != null) 'infoType': infoType!.toJson(),
@@ -9015,7 +9013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxFindingsPerInfoType != null)
           'maxFindingsPerInfoType':
               maxFindingsPerInfoType!.map((value) => value.toJson()).toList(),
@@ -9034,7 +9032,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Buckets values based on fixed size ranges.
@@ -9093,7 +9091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketSize != null) 'bucketSize': bucketSize!,
         if (lowerBound != null) 'lowerBound': lowerBound!.toJson(),
         if (upperBound != null) 'upperBound': upperBound!.toJson(),
@@ -9137,7 +9135,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hotwordRegex != null) 'hotwordRegex': hotwordRegex!.toJson(),
         if (likelihoodAdjustment != null)
           'likelihoodAdjustment': likelihoodAdjustment!.toJson(),
@@ -9168,7 +9166,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (findingDetails != null) 'findingDetails': findingDetails!.toJson(),
         if (item != null) 'item': item!.toJson(),
       };
@@ -9224,13 +9222,12 @@
       fileOffset = _json['fileOffset'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('rowOffset')) {
       rowOffset = _json['rowOffset'] as core.String;
@@ -9241,7 +9238,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerDetails != null)
           'containerDetails': containerDetails!.toJson(),
         if (fileOffset != null) 'fileOffset': fileOffset!,
@@ -9265,7 +9262,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hybridItem != null) 'hybridItem': hybridItem!.toJson(),
       };
 }
@@ -9284,7 +9281,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hybridItem != null) 'hybridItem': hybridItem!.toJson(),
       };
 }
@@ -9297,7 +9294,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Statistics related to processing hybrid inspect requests.
@@ -9331,7 +9328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (abortedCount != null) 'abortedCount': abortedCount!,
         if (pendingCount != null) 'pendingCount': pendingCount!,
         if (processedCount != null) 'processedCount': processedCount!,
@@ -9376,13 +9373,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('requiredFindingLabelKeys')) {
       requiredFindingLabelKeys =
@@ -9396,7 +9392,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (labels != null) 'labels': labels!,
         if (requiredFindingLabelKeys != null)
@@ -9423,7 +9419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBoxes != null)
           'boundingBoxes':
               boundingBoxes!.map((value) => value.toJson()).toList(),
@@ -9466,7 +9462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (infoType != null) 'infoType': infoType!.toJson(),
         if (redactAllText != null) 'redactAllText': redactAllText!,
         if (redactionColor != null) 'redactionColor': redactionColor!.toJson(),
@@ -9492,7 +9488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -9532,7 +9528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -9565,7 +9561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (infoType != null) 'infoType': infoType!.toJson(),
         if (maxFindings != null) 'maxFindings': maxFindings!,
       };
@@ -9591,7 +9587,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (infoType != null) 'infoType': infoType!.toJson(),
       };
@@ -9629,7 +9625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (infoTypes != null)
           'infoTypes': infoTypes!.map((value) => value.toJson()).toList(),
         if (primitiveTransformation != null)
@@ -9660,7 +9656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transformations != null)
           'transformations':
               transformations!.map((value) => value.toJson()).toList(),
@@ -9768,7 +9764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentOptions != null) 'contentOptions': contentOptions!,
         if (customInfoTypes != null)
           'customInfoTypes':
@@ -9827,7 +9823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inspectConfig != null) 'inspectConfig': inspectConfig!.toJson(),
         if (inspectTemplateName != null)
           'inspectTemplateName': inspectTemplateName!,
@@ -9850,7 +9846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
       };
 }
@@ -9876,7 +9872,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedOptions != null)
           'requestedOptions': requestedOptions!.toJson(),
         if (result != null) 'result': result!.toJson(),
@@ -9923,7 +9919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actions != null)
           'actions': actions!.map((value) => value.toJson()).toList(),
         if (inspectConfig != null) 'inspectConfig': inspectConfig!.toJson(),
@@ -9962,7 +9958,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (findings != null)
           'findings': findings!.map((value) => value.toJson()).toList(),
         if (findingsTruncated != null) 'findingsTruncated': findingsTruncated!,
@@ -10029,7 +10025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -10061,7 +10057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclusionRule != null) 'exclusionRule': exclusionRule!.toJson(),
         if (hotwordRule != null) 'hotwordRule': hotwordRule!.toJson(),
       };
@@ -10098,7 +10094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (infoTypes != null)
           'infoTypes': infoTypes!.map((value) => value.toJson()).toList(),
         if (rules != null)
@@ -10115,7 +10111,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Contains a configuration to make dlp api calls on a repeating basis.
@@ -10221,7 +10217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -10275,7 +10271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityId != null) 'entityId': entityId!.toJson(),
         if (quasiIds != null)
           'quasiIds': quasiIds!.map((value) => value.toJson()).toList(),
@@ -10309,7 +10305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (equivalenceClassSize != null)
           'equivalenceClassSize': equivalenceClassSize!,
         if (quasiIdsValues != null)
@@ -10363,7 +10359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketSize != null) 'bucketSize': bucketSize!,
         if (bucketValueCount != null) 'bucketValueCount': bucketValueCount!,
         if (bucketValues != null)
@@ -10394,7 +10390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (equivalenceClassHistogramBuckets != null)
           'equivalenceClassHistogramBuckets': equivalenceClassHistogramBuckets!
               .map((value) => value.toJson())
@@ -10452,7 +10448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auxiliaryTables != null)
           'auxiliaryTables':
               auxiliaryTables!.map((value) => value.toJson()).toList(),
@@ -10512,7 +10508,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketSize != null) 'bucketSize': bucketSize!,
         if (bucketValueCount != null) 'bucketValueCount': bucketValueCount!,
         if (bucketValues != null)
@@ -10545,7 +10541,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (estimatedAnonymity != null)
           'estimatedAnonymity': estimatedAnonymity!,
         if (quasiIdsValues != null)
@@ -10581,7 +10577,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kMapEstimationHistogram != null)
           'kMapEstimationHistogram':
               kMapEstimationHistogram!.map((value) => value.toJson()).toList(),
@@ -10627,7 +10623,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (partitionId != null) 'partitionId': partitionId!.toJson(),
         if (path != null) 'path': path!.map((value) => value.toJson()).toList(),
       };
@@ -10646,7 +10642,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -10685,7 +10681,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cryptoKeyName != null) 'cryptoKeyName': cryptoKeyName!,
         if (wrappedKey != null) 'wrappedKey': wrappedKey!,
       };
@@ -10719,7 +10715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quasiIds != null)
           'quasiIds': quasiIds!.map((value) => value.toJson()).toList(),
         if (sensitiveAttribute != null)
@@ -10769,7 +10765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (equivalenceClassSize != null)
           'equivalenceClassSize': equivalenceClassSize!,
         if (numDistinctSensitiveValues != null)
@@ -10830,7 +10826,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketSize != null) 'bucketSize': bucketSize!,
         if (bucketValueCount != null) 'bucketValueCount': bucketValueCount!,
         if (bucketValues != null)
@@ -10863,7 +10859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sensitiveValueFrequencyHistogramBuckets != null)
           'sensitiveValueFrequencyHistogramBuckets':
               sensitiveValueFrequencyHistogramBuckets!
@@ -10910,7 +10906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigQueryField != null) 'bigQueryField': bigQueryField!.toJson(),
         if (cloudStorageFileSet != null)
           'cloudStorageFileSet': cloudStorageFileSet!.toJson(),
@@ -10931,7 +10927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approxNumPhrases != null) 'approxNumPhrases': approxNumPhrases!,
       };
 }
@@ -10948,7 +10944,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Message for specifying an adjustment to the likelihood of a finding as part
@@ -10985,7 +10981,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixedLikelihood != null) 'fixedLikelihood': fixedLikelihood!,
         if (relativeLikelihood != null)
           'relativeLikelihood': relativeLikelihood!,
@@ -11017,7 +11013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deidentifyTemplates != null)
           'deidentifyTemplates':
               deidentifyTemplates!.map((value) => value.toJson()).toList(),
@@ -11048,7 +11044,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -11071,7 +11067,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (infoTypes != null)
           'infoTypes': infoTypes!.map((value) => value.toJson()).toList(),
       };
@@ -11101,7 +11097,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inspectTemplates != null)
           'inspectTemplates':
               inspectTemplates!.map((value) => value.toJson()).toList(),
@@ -11133,7 +11129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobTriggers != null)
           'jobTriggers': jobTriggers!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -11164,7 +11160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (storedInfoTypes != null)
           'storedInfoTypes':
@@ -11218,7 +11214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (byteRange != null) 'byteRange': byteRange!.toJson(),
         if (codepointRange != null) 'codepointRange': codepointRange!.toJson(),
         if (container != null) 'container': container!.toJson(),
@@ -11238,7 +11234,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Metadata Location
@@ -11264,7 +11260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (storageLabel != null) 'storageLabel': storageLabel!.toJson(),
         if (type != null) 'type': type!,
       };
@@ -11287,7 +11283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!.toJson(),
       };
 }
@@ -11324,7 +11320,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxValue != null) 'maxValue': maxValue!.toJson(),
         if (minValue != null) 'minValue': minValue!.toJson(),
         if (quantileValues != null)
@@ -11383,7 +11379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputSchema != null) 'outputSchema': outputSchema!,
         if (table != null) 'table': table!.toJson(),
       };
@@ -11412,7 +11408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namespaceId != null) 'namespaceId': namespaceId!,
         if (projectId != null) 'projectId': projectId!,
       };
@@ -11455,7 +11451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -11554,7 +11550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketingConfig != null)
           'bucketingConfig': bucketingConfig!.toJson(),
         if (characterMaskConfig != null)
@@ -11631,7 +11627,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoricalStatsConfig != null)
           'categoricalStatsConfig': categoricalStatsConfig!.toJson(),
         if (deltaPresenceEstimationConfig != null)
@@ -11667,7 +11663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (windowAfter != null) 'windowAfter': windowAfter!,
         if (windowBefore != null) 'windowBefore': windowBefore!,
       };
@@ -11690,7 +11686,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Publish the result summary of a DlpJob to the Cloud Security Command Center
@@ -11710,7 +11706,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Publish a message into given Pub/Sub topic when DlpJob has completed.
@@ -11735,7 +11731,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topic != null) 'topic': topic!,
       };
 }
@@ -11752,7 +11748,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A column with a semantic tag attached.
@@ -11800,7 +11796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customTag != null) 'customTag': customTag!,
         if (field != null) 'field': field!.toJson(),
         if (inferred != null) 'inferred': inferred!.toJson(),
@@ -11829,7 +11825,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customTag != null) 'customTag': customTag!,
         if (field != null) 'field': field!.toJson(),
       };
@@ -11859,7 +11855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customTag != null) 'customTag': customTag!,
         if (field != null) 'field': field!.toJson(),
       };
@@ -11879,7 +11875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dateTime != null) 'dateTime': dateTime!.toJson(),
       };
 }
@@ -11903,7 +11899,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (end != null) 'end': end!,
         if (start != null) 'start': start!,
       };
@@ -11924,7 +11920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expressions != null) 'expressions': expressions!.toJson(),
       };
 }
@@ -11958,7 +11954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigQueryKey != null) 'bigQueryKey': bigQueryKey!.toJson(),
         if (datastoreKey != null) 'datastoreKey': datastoreKey!.toJson(),
         if (idValues != null) 'idValues': idValues!,
@@ -11993,7 +11989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldId != null) 'fieldId': fieldId!.toJson(),
         if (recordKey != null) 'recordKey': recordKey!.toJson(),
         if (tableLocation != null) 'tableLocation': tableLocation!.toJson(),
@@ -12016,7 +12012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
       };
 }
@@ -12051,7 +12047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldTransformations != null)
           'fieldTransformations':
               fieldTransformations!.map((value) => value.toJson()).toList(),
@@ -12073,7 +12069,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to search for potentially sensitive info in an image and redact it
@@ -12123,7 +12119,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (byteItem != null) 'byteItem': byteItem!.toJson(),
         if (imageRedactionConfigs != null)
           'imageRedactionConfigs':
@@ -12173,7 +12169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (extractedText != null) 'extractedText': extractedText!,
         if (inspectResult != null) 'inspectResult': inspectResult!.toJson(),
         if (redactedImage != null) 'redactedImage': redactedImage!,
@@ -12207,7 +12203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupIndexes != null) 'groupIndexes': groupIndexes!,
         if (pattern != null) 'pattern': pattern!,
       };
@@ -12283,7 +12279,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inspectConfig != null) 'inspectConfig': inspectConfig!.toJson(),
         if (inspectTemplateName != null)
           'inspectTemplateName': inspectTemplateName!,
@@ -12317,7 +12313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (item != null) 'item': item!.toJson(),
         if (overview != null) 'overview': overview!.toJson(),
       };
@@ -12337,7 +12333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newValue != null) 'newValue': newValue!.toJson(),
       };
 }
@@ -12350,7 +12346,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Snapshot of the inspection configuration.
@@ -12376,7 +12372,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobConfig != null) 'jobConfig': jobConfig!.toJson(),
         if (snapshotInspectTemplate != null)
           'snapshotInspectTemplate': snapshotInspectTemplate!.toJson(),
@@ -12397,7 +12393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobConfig != null) 'jobConfig': jobConfig!.toJson(),
       };
 }
@@ -12439,7 +12435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hybridStats != null) 'hybridStats': hybridStats!.toJson(),
         if (infoTypeStats != null)
           'infoTypeStats':
@@ -12485,7 +12481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actions != null)
           'actions': actions!.map((value) => value.toJson()).toList(),
         if (privacyMetric != null) 'privacyMetric': privacyMetric!.toJson(),
@@ -12510,7 +12506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
       };
@@ -12534,7 +12530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
 }
@@ -12558,7 +12554,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (recurrencePeriodDuration != null)
           'recurrencePeriodDuration': recurrencePeriodDuration!,
       };
@@ -12611,7 +12607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quasiIds != null)
           'quasiIds': quasiIds!.map((value) => value.toJson()).toList(),
         if (relativeFrequency != null)
@@ -12660,7 +12656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigQueryOptions != null)
           'bigQueryOptions': bigQueryOptions!.toJson(),
         if (cloudStorageOptions != null)
@@ -12684,7 +12680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
       };
 }
@@ -12722,7 +12718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentVersion != null) 'currentVersion': currentVersion!.toJson(),
         if (name != null) 'name': name!,
         if (pendingVersions != null)
@@ -12776,7 +12772,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (dictionary != null) 'dictionary': dictionary!.toJson(),
         if (displayName != null) 'displayName': displayName!,
@@ -12802,7 +12798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (largeCustomDictionary != null)
           'largeCustomDictionary': largeCustomDictionary!.toJson(),
       };
@@ -12876,7 +12872,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (errors != null)
@@ -12910,7 +12906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (name != null) 'name': name!,
       };
@@ -12947,7 +12943,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (count != null) 'count': count!,
         if (details != null) 'details': details!,
@@ -12969,7 +12965,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Structured content to inspect.
@@ -13002,7 +12998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headers != null)
           'headers': headers!.map((value) => value.toJson()).toList(),
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
@@ -13028,7 +13024,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rowIndex != null) 'rowIndex': rowIndex!,
       };
 }
@@ -13055,7 +13051,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identifyingFields != null)
           'identifyingFields':
               identifyingFields!.map((value) => value.toJson()).toList(),
@@ -13107,7 +13103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customTag != null) 'customTag': customTag!,
         if (field != null) 'field': field!.toJson(),
         if (inferred != null) 'inferred': inferred!.toJson(),
@@ -13123,7 +13119,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
@@ -13148,7 +13144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (partToExtract != null) 'partToExtract': partToExtract!,
       };
 }
@@ -13168,7 +13164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (offsetMinutes != null) 'offsetMinutes': offsetMinutes!,
       };
 }
@@ -13229,7 +13225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableAutoPopulationOfTimespanConfig != null)
           'enableAutoPopulationOfTimespanConfig':
               enableAutoPopulationOfTimespanConfig!,
@@ -13267,7 +13263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (leaveUntransformed != null)
           'leaveUntransformed': leaveUntransformed!.toJson(),
         if (throwError != null) 'throwError': throwError!.toJson(),
@@ -13297,7 +13293,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transformationSummaries != null)
           'transformationSummaries':
               transformationSummaries!.map((value) => value.toJson()).toList(),
@@ -13372,7 +13368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!.toJson(),
         if (fieldTransformations != null)
           'fieldTransformations':
@@ -13409,7 +13405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -13437,7 +13433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (manual != null) 'manual': manual!.toJson(),
         if (schedule != null) 'schedule': schedule!.toJson(),
       };
@@ -13467,7 +13463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
       };
 }
@@ -13492,7 +13488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deidentifyTemplate != null)
           'deidentifyTemplate': deidentifyTemplate!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
@@ -13519,7 +13515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inspectTemplate != null)
           'inspectTemplate': inspectTemplate!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
@@ -13546,7 +13542,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobTrigger != null) 'jobTrigger': jobTrigger!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -13575,7 +13571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -13653,7 +13649,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (booleanValue != null) 'booleanValue': booleanValue!,
         if (dateValue != null) 'dateValue': dateValue!.toJson(),
         if (dayOfWeekValue != null) 'dayOfWeekValue': dayOfWeekValue!,
@@ -13685,7 +13681,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (value != null) 'value': value!.toJson(),
       };
@@ -13709,7 +13705,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (words != null) 'words': words!,
       };
 }
@@ -13728,7 +13724,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -13764,8 +13760,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -13778,7 +13774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -13825,7 +13821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -13877,7 +13873,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
diff --git a/generated/googleapis/lib/dns/v1.dart b/generated/googleapis/lib/dns/v1.dart
index 133a76e..521fda7 100644
--- a/generated/googleapis/lib/dns/v1.dart
+++ b/generated/googleapis/lib/dns/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1278,7 +1277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additions != null)
           'additions': additions!.map((value) => value.toJson()).toList(),
         if (deletions != null)
@@ -1334,7 +1333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changes != null)
           'changes': changes!.map((value) => value.toJson()).toList(),
         if (header != null) 'header': header!.toJson(),
@@ -1457,7 +1456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (creationTime != null) 'creationTime': creationTime!,
         if (description != null) 'description': description!,
@@ -1497,7 +1496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digest != null) 'digest': digest!,
         if (type != null) 'type': type!,
       };
@@ -1550,7 +1549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (keyLength != null) 'keyLength': keyLength!,
         if (keyType != null) 'keyType': keyType!,
@@ -1600,7 +1599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dnsKeys != null)
           'dnsKeys': dnsKeys!.map((value) => value.toJson()).toList(),
         if (header != null) 'header': header!.toJson(),
@@ -1719,13 +1718,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1761,7 +1759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (description != null) 'description': description!,
         if (dnsName != null) 'dnsName': dnsName!,
@@ -1827,7 +1825,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultKeySpecs != null)
           'defaultKeySpecs':
               defaultKeySpecs!.map((value) => value.toJson()).toList(),
@@ -1861,7 +1859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (targetNameServers != null)
           'targetNameServers':
@@ -1901,7 +1899,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (forwardingPath != null) 'forwardingPath': forwardingPath!,
         if (ipv4Address != null) 'ipv4Address': ipv4Address!,
         if (kind != null) 'kind': kind!,
@@ -1948,7 +1946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!.toJson(),
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1975,7 +1973,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (targetNetwork != null) 'targetNetwork': targetNetwork!.toJson(),
       };
@@ -2011,7 +2009,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deactivateTime != null) 'deactivateTime': deactivateTime!,
         if (kind != null) 'kind': kind!,
         if (networkUrl != null) 'networkUrl': networkUrl!,
@@ -2039,7 +2037,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (networks != null)
           'networks': networks!.map((value) => value.toJson()).toList(),
@@ -2066,7 +2064,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (networkUrl != null) 'networkUrl': networkUrl!,
       };
@@ -2083,7 +2081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -2107,7 +2105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (namespace != null) 'namespace': namespace!.toJson(),
       };
@@ -2141,7 +2139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deletionTime != null) 'deletionTime': deletionTime!,
         if (kind != null) 'kind': kind!,
         if (namespaceUrl != null) 'namespaceUrl': namespaceUrl!,
@@ -2190,7 +2188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!.toJson(),
         if (kind != null) 'kind': kind!,
         if (managedZones != null)
@@ -2278,7 +2276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dnsKeyContext != null) 'dnsKeyContext': dnsKeyContext!.toJson(),
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -2310,7 +2308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newValue != null) 'newValue': newValue!.toJson(),
         if (oldValue != null) 'oldValue': oldValue!.toJson(),
       };
@@ -2336,7 +2334,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newValue != null) 'newValue': newValue!.toJson(),
         if (oldValue != null) 'oldValue': oldValue!.toJson(),
       };
@@ -2384,7 +2382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!.toJson(),
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2410,7 +2408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!.toJson(),
         if (policy != null) 'policy': policy!.toJson(),
       };
@@ -2433,7 +2431,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!.toJson(),
         if (policy != null) 'policy': policy!.toJson(),
       };
@@ -2511,7 +2509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternativeNameServerConfig != null)
           'alternativeNameServerConfig': alternativeNameServerConfig!.toJson(),
         if (description != null) 'description': description!,
@@ -2552,7 +2550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (targetNameServers != null)
           'targetNameServers':
@@ -2593,7 +2591,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (forwardingPath != null) 'forwardingPath': forwardingPath!,
         if (ipv4Address != null) 'ipv4Address': ipv4Address!,
         if (kind != null) 'kind': kind!,
@@ -2620,7 +2618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (networkUrl != null) 'networkUrl': networkUrl!,
       };
@@ -2660,7 +2658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
         if (number != null) 'number': number!,
@@ -2773,7 +2771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dnsKeysPerManagedZone != null)
           'dnsKeysPerManagedZone': dnsKeysPerManagedZone!,
         if (kind != null) 'kind': kind!,
@@ -2853,7 +2851,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
         if (rrdatas != null) 'rrdatas': rrdatas!,
@@ -2905,7 +2903,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!.toJson(),
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2930,7 +2928,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationId != null) 'operationId': operationId!,
       };
 }
diff --git a/generated/googleapis/lib/docs/v1.dart b/generated/googleapis/lib/docs/v1.dart
index 1c4e762..9ffd6cd 100644
--- a/generated/googleapis/lib/docs/v1.dart
+++ b/generated/googleapis/lib/docs/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -269,16 +268,15 @@
           .toList();
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
-      suggestedTextStyleChanges =
-          (_json['suggestedTextStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedTextStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedTextStyleChanges = (_json['suggestedTextStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('textStyle')) {
       textStyle = TextStyle.fromJson(
@@ -289,7 +287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestedDeletionIds != null)
           'suggestedDeletionIds': suggestedDeletionIds!,
         if (suggestedInsertionIds != null)
@@ -316,7 +314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
       };
 }
@@ -338,7 +336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColorSuggested != null)
           'backgroundColorSuggested': backgroundColorSuggested!,
       };
@@ -367,7 +365,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
         if (writeControl != null) 'writeControl': writeControl!.toJson(),
@@ -406,7 +404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentId != null) 'documentId': documentId!,
         if (replies != null)
           'replies': replies!.map((value) => value.toJson()).toList(),
@@ -435,7 +433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null)
           'content': content!.map((value) => value.toJson()).toList(),
       };
@@ -467,7 +465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (listId != null) 'listId': listId!,
         if (nestingLevel != null) 'nestingLevel': nestingLevel!,
         if (textStyle != null) 'textStyle': textStyle!.toJson(),
@@ -505,7 +503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (listIdSuggested != null) 'listIdSuggested': listIdSuggested!,
         if (nestingLevelSuggested != null)
           'nestingLevelSuggested': nestingLevelSuggested!,
@@ -528,7 +526,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rgbColor != null) 'rgbColor': rgbColor!.toJson(),
       };
 }
@@ -574,16 +572,15 @@
           .toList();
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
-      suggestedTextStyleChanges =
-          (_json['suggestedTextStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedTextStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedTextStyleChanges = (_json['suggestedTextStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('textStyle')) {
       textStyle = TextStyle.fromJson(
@@ -591,7 +588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestedDeletionIds != null)
           'suggestedDeletionIds': suggestedDeletionIds!,
         if (suggestedInsertionIds != null)
@@ -636,7 +633,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sectionBreakLocation != null)
           'sectionBreakLocation': sectionBreakLocation!.toJson(),
         if (type != null) 'type': type!,
@@ -656,7 +653,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (footerId != null) 'footerId': footerId!,
       };
 }
@@ -697,7 +694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endOfSegmentLocation != null)
           'endOfSegmentLocation': endOfSegmentLocation!.toJson(),
         if (location != null) 'location': location!.toJson(),
@@ -717,7 +714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (footnoteId != null) 'footnoteId': footnoteId!,
       };
 }
@@ -755,7 +752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sectionBreakLocation != null)
           'sectionBreakLocation': sectionBreakLocation!.toJson(),
         if (type != null) 'type': type!,
@@ -775,7 +772,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headerId != null) 'headerId': headerId!,
       };
 }
@@ -803,7 +800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (range != null) 'range': range!.toJson(),
       };
@@ -822,7 +819,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namedRangeId != null) 'namedRangeId': namedRangeId!,
       };
 }
@@ -896,7 +893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bulletPreset != null) 'bulletPreset': bulletPreset!,
         if (range != null) 'range': range!.toJson(),
       };
@@ -958,7 +955,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angle != null) 'angle': angle!,
         if (offsetBottom != null) 'offsetBottom': offsetBottom!,
         if (offsetLeft != null) 'offsetLeft': offsetLeft!,
@@ -1007,7 +1004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angleSuggested != null) 'angleSuggested': angleSuggested!,
         if (offsetBottomSuggested != null)
           'offsetBottomSuggested': offsetBottomSuggested!,
@@ -1047,7 +1044,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
       };
 }
@@ -1071,7 +1068,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (footerId != null) 'footerId': footerId!,
       };
 }
@@ -1095,7 +1092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headerId != null) 'headerId': headerId!,
       };
 }
@@ -1121,7 +1118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (namedRangeId != null) 'namedRangeId': namedRangeId!,
       };
@@ -1145,7 +1142,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
       };
 }
@@ -1163,7 +1160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -1187,7 +1184,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tableCellLocation != null)
           'tableCellLocation': tableCellLocation!.toJson(),
       };
@@ -1211,7 +1208,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tableCellLocation != null)
           'tableCellLocation': tableCellLocation!.toJson(),
       };
@@ -1239,7 +1236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (unit != null) 'unit': unit!,
       };
@@ -1372,107 +1369,95 @@
           _json['documentStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('footers')) {
-      footers = (_json['footers'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Footer.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      footers = (_json['footers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Footer.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('footnotes')) {
-      footnotes = (_json['footnotes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Footnote.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      footnotes =
+          (_json['footnotes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Footnote.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('headers')) {
-      headers = (_json['headers'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Header.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Header.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('inlineObjects')) {
-      inlineObjects = (_json['inlineObjects'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              InlineObject.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      inlineObjects =
+          (_json['inlineObjects'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          InlineObject.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('lists')) {
-      lists = (_json['lists'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              List.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      lists = (_json['lists'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          List.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('namedRanges')) {
-      namedRanges = (_json['namedRanges'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              NamedRanges.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      namedRanges =
+          (_json['namedRanges'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          NamedRanges.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('namedStyles')) {
       namedStyles = NamedStyles.fromJson(
           _json['namedStyles'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positionedObjects')) {
-      positionedObjects = (_json['positionedObjects'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              PositionedObject.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      positionedObjects =
+          (_json['positionedObjects'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          PositionedObject.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('revisionId')) {
       revisionId = _json['revisionId'] as core.String;
     }
     if (_json.containsKey('suggestedDocumentStyleChanges')) {
-      suggestedDocumentStyleChanges =
-          (_json['suggestedDocumentStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedDocumentStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedDocumentStyleChanges = (_json['suggestedDocumentStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedDocumentStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('suggestedNamedStylesChanges')) {
-      suggestedNamedStylesChanges =
-          (_json['suggestedNamedStylesChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedNamedStyles.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedNamedStylesChanges = (_json['suggestedNamedStylesChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedNamedStyles.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('suggestionsViewMode')) {
       suggestionsViewMode = _json['suggestionsViewMode'] as core.String;
@@ -1482,7 +1467,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!.toJson(),
         if (documentId != null) 'documentId': documentId!,
         if (documentStyle != null) 'documentStyle': documentStyle!.toJson(),
@@ -1690,7 +1675,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (background != null) 'background': background!.toJson(),
         if (defaultFooterId != null) 'defaultFooterId': defaultFooterId!,
         if (defaultHeaderId != null) 'defaultHeaderId': defaultHeaderId!,
@@ -1847,7 +1832,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundSuggestionState != null)
           'backgroundSuggestionState': backgroundSuggestionState!.toJson(),
         if (defaultFooterIdSuggested != null)
@@ -1897,7 +1882,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A mask that indicates which of the fields on the base
@@ -1911,7 +1896,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An embedded object in the document.
@@ -2006,7 +1991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (embeddedDrawingProperties != null)
           'embeddedDrawingProperties': embeddedDrawingProperties!.toJson(),
@@ -2072,7 +2057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (dashStyle != null) 'dashStyle': dashStyle!,
         if (propertyState != null) 'propertyState': propertyState!,
@@ -2114,7 +2099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colorSuggested != null) 'colorSuggested': colorSuggested!,
         if (dashStyleSuggested != null)
           'dashStyleSuggested': dashStyleSuggested!,
@@ -2218,7 +2203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (descriptionSuggested != null)
           'descriptionSuggested': descriptionSuggested!,
         if (embeddedDrawingPropertiesSuggestionState != null)
@@ -2264,7 +2249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segmentId != null) 'segmentId': segmentId!,
       };
 }
@@ -2297,7 +2282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestedDeletionIds != null)
           'suggestedDeletionIds': suggestedDeletionIds!,
         if (suggestedInsertionIds != null)
@@ -2329,7 +2314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null)
           'content': content!.map((value) => value.toJson()).toList(),
         if (footerId != null) 'footerId': footerId!,
@@ -2360,7 +2345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null)
           'content': content!.map((value) => value.toJson()).toList(),
         if (footnoteId != null) 'footnoteId': footnoteId!,
@@ -2417,16 +2402,15 @@
           .toList();
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
-      suggestedTextStyleChanges =
-          (_json['suggestedTextStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedTextStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedTextStyleChanges = (_json['suggestedTextStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('textStyle')) {
       textStyle = TextStyle.fromJson(
@@ -2434,7 +2418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (footnoteId != null) 'footnoteId': footnoteId!,
         if (footnoteNumber != null) 'footnoteNumber': footnoteNumber!,
         if (suggestedDeletionIds != null)
@@ -2472,7 +2456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null)
           'content': content!.map((value) => value.toJson()).toList(),
         if (headerId != null) 'headerId': headerId!,
@@ -2517,16 +2501,15 @@
           .toList();
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
-      suggestedTextStyleChanges =
-          (_json['suggestedTextStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedTextStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedTextStyleChanges = (_json['suggestedTextStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('textStyle')) {
       textStyle = TextStyle.fromJson(
@@ -2534,7 +2517,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestedDeletionIds != null)
           'suggestedDeletionIds': suggestedDeletionIds!,
         if (suggestedInsertionIds != null)
@@ -2611,7 +2594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angle != null) 'angle': angle!,
         if (brightness != null) 'brightness': brightness!,
         if (contentUri != null) 'contentUri': contentUri!,
@@ -2677,7 +2660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angleSuggested != null) 'angleSuggested': angleSuggested!,
         if (brightnessSuggested != null)
           'brightnessSuggested': brightnessSuggested!,
@@ -2737,22 +2720,22 @@
     }
     if (_json.containsKey('suggestedInlineObjectPropertiesChanges')) {
       suggestedInlineObjectPropertiesChanges =
-          (_json['suggestedInlineObjectPropertiesChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
+          (_json['suggestedInlineObjectPropertiesChanges']
+                  as core.Map<core.String, core.dynamic>)
               .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedInlineObjectProperties.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedInlineObjectProperties.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('suggestedInsertionId')) {
       suggestedInsertionId = _json['suggestedInsertionId'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inlineObjectProperties != null)
           'inlineObjectProperties': inlineObjectProperties!.toJson(),
         if (objectId != null) 'objectId': objectId!,
@@ -2811,16 +2794,15 @@
           .toList();
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
-      suggestedTextStyleChanges =
-          (_json['suggestedTextStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedTextStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedTextStyleChanges = (_json['suggestedTextStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('textStyle')) {
       textStyle = TextStyle.fromJson(
@@ -2828,7 +2810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inlineObjectId != null) 'inlineObjectId': inlineObjectId!,
         if (suggestedDeletionIds != null)
           'suggestedDeletionIds': suggestedDeletionIds!,
@@ -2855,7 +2837,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (embeddedObject != null) 'embeddedObject': embeddedObject!.toJson(),
       };
 }
@@ -2879,7 +2861,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (embeddedObjectSuggestionState != null)
           'embeddedObjectSuggestionState':
               embeddedObjectSuggestionState!.toJson(),
@@ -2941,7 +2923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endOfSegmentLocation != null)
           'endOfSegmentLocation': endOfSegmentLocation!.toJson(),
         if (location != null) 'location': location!.toJson(),
@@ -2963,7 +2945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -2981,7 +2963,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -3018,7 +3000,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endOfSegmentLocation != null)
           'endOfSegmentLocation': endOfSegmentLocation!.toJson(),
         if (location != null) 'location': location!.toJson(),
@@ -3070,7 +3052,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endOfSegmentLocation != null)
           'endOfSegmentLocation': endOfSegmentLocation!.toJson(),
         if (location != null) 'location': location!.toJson(),
@@ -3104,7 +3086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (insertRight != null) 'insertRight': insertRight!,
         if (tableCellLocation != null)
           'tableCellLocation': tableCellLocation!.toJson(),
@@ -3156,7 +3138,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null) 'columns': columns!,
         if (endOfSegmentLocation != null)
           'endOfSegmentLocation': endOfSegmentLocation!.toJson(),
@@ -3191,7 +3173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (insertBelow != null) 'insertBelow': insertBelow!,
         if (tableCellLocation != null)
           'tableCellLocation': tableCellLocation!.toJson(),
@@ -3241,7 +3223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endOfSegmentLocation != null)
           'endOfSegmentLocation': endOfSegmentLocation!.toJson(),
         if (location != null) 'location': location!.toJson(),
@@ -3274,7 +3256,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bookmarkId != null) 'bookmarkId': bookmarkId!,
         if (headingId != null) 'headingId': headingId!,
         if (url != null) 'url': url!,
@@ -3295,7 +3277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sheetsChartReference != null)
           'sheetsChartReference': sheetsChartReference!.toJson(),
       };
@@ -3321,7 +3303,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sheetsChartReferenceSuggestionState != null)
           'sheetsChartReferenceSuggestionState':
               sheetsChartReferenceSuggestionState!.toJson(),
@@ -3367,20 +3349,19 @@
       suggestedInsertionId = _json['suggestedInsertionId'] as core.String;
     }
     if (_json.containsKey('suggestedListPropertiesChanges')) {
-      suggestedListPropertiesChanges =
-          (_json['suggestedListPropertiesChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedListProperties.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedListPropertiesChanges = (_json['suggestedListPropertiesChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedListProperties.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (listProperties != null) 'listProperties': listProperties!.toJson(),
         if (suggestedDeletionIds != null)
           'suggestedDeletionIds': suggestedDeletionIds!,
@@ -3414,7 +3395,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nestingLevels != null)
           'nestingLevels':
               nestingLevels!.map((value) => value.toJson()).toList(),
@@ -3446,7 +3427,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nestingLevelsSuggestionStates != null)
           'nestingLevelsSuggestionStates': nestingLevelsSuggestionStates!
               .map((value) => value.toJson())
@@ -3478,7 +3459,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (index != null) 'index': index!,
         if (segmentId != null) 'segmentId': segmentId!,
       };
@@ -3505,7 +3486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tableRange != null) 'tableRange': tableRange!.toJson(),
       };
 }
@@ -3548,7 +3529,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (namedRangeId != null) 'namedRangeId': namedRangeId!,
         if (ranges != null)
@@ -3578,7 +3559,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (namedRanges != null)
           'namedRanges': namedRanges!.map((value) => value.toJson()).toList(),
@@ -3626,7 +3607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namedStyleType != null) 'namedStyleType': namedStyleType!,
         if (paragraphStyle != null) 'paragraphStyle': paragraphStyle!.toJson(),
         if (textStyle != null) 'textStyle': textStyle!.toJson(),
@@ -3678,7 +3659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namedStyleType != null) 'namedStyleType': namedStyleType!,
         if (paragraphStyleSuggestionState != null)
           'paragraphStyleSuggestionState':
@@ -3709,7 +3690,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (styles != null)
           'styles': styles!.map((value) => value.toJson()).toList(),
       };
@@ -3736,7 +3717,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stylesSuggestionStates != null)
           'stylesSuggestionStates':
               stylesSuggestionStates!.map((value) => value.toJson()).toList(),
@@ -3864,7 +3845,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bulletAlignment != null) 'bulletAlignment': bulletAlignment!,
         if (glyphFormat != null) 'glyphFormat': glyphFormat!,
         if (glyphSymbol != null) 'glyphSymbol': glyphSymbol!,
@@ -3938,7 +3919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bulletAlignmentSuggested != null)
           'bulletAlignmentSuggested': bulletAlignmentSuggested!,
         if (glyphFormatSuggested != null)
@@ -3973,7 +3954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectIds != null) 'objectIds': objectIds!,
       };
 }
@@ -3994,7 +3975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
       };
 }
@@ -4039,16 +4020,15 @@
           .toList();
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
-      suggestedTextStyleChanges =
-          (_json['suggestedTextStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedTextStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedTextStyleChanges = (_json['suggestedTextStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('textStyle')) {
       textStyle = TextStyle.fromJson(
@@ -4056,7 +4036,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (suggestedDeletionIds != null)
           'suggestedDeletionIds': suggestedDeletionIds!,
         if (suggestedInsertionIds != null)
@@ -4122,43 +4102,40 @@
           .toList();
     }
     if (_json.containsKey('suggestedBulletChanges')) {
-      suggestedBulletChanges = (_json['suggestedBulletChanges'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
+      suggestedBulletChanges = (_json['suggestedBulletChanges']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              SuggestedBullet.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedBullet.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('suggestedParagraphStyleChanges')) {
-      suggestedParagraphStyleChanges =
-          (_json['suggestedParagraphStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedParagraphStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedParagraphStyleChanges = (_json['suggestedParagraphStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedParagraphStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('suggestedPositionedObjectIds')) {
-      suggestedPositionedObjectIds =
-          (_json['suggestedPositionedObjectIds'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  ObjectReferences.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedPositionedObjectIds = (_json['suggestedPositionedObjectIds']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          ObjectReferences.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bullet != null) 'bullet': bullet!.toJson(),
         if (elements != null)
           'elements': elements!.map((value) => value.toJson()).toList(),
@@ -4219,7 +4196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (dashStyle != null) 'dashStyle': dashStyle!,
         if (padding != null) 'padding': padding!.toJson(),
@@ -4304,7 +4281,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoText != null) 'autoText': autoText!.toJson(),
         if (columnBreak != null) 'columnBreak': columnBreak!.toJson(),
         if (endIndex != null) 'endIndex': endIndex!,
@@ -4570,7 +4547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alignment != null) 'alignment': alignment!,
         if (avoidWidowAndOrphan != null)
           'avoidWidowAndOrphan': avoidWidowAndOrphan!,
@@ -4733,7 +4710,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alignmentSuggested != null)
           'alignmentSuggested': alignmentSuggested!,
         if (avoidWidowAndOrphanSuggested != null)
@@ -4824,19 +4801,19 @@
     }
     if (_json.containsKey('suggestedPositionedObjectPropertiesChanges')) {
       suggestedPositionedObjectPropertiesChanges =
-          (_json['suggestedPositionedObjectPropertiesChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
+          (_json['suggestedPositionedObjectPropertiesChanges']
+                  as core.Map<core.String, core.dynamic>)
               .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedPositionedObjectProperties.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedPositionedObjectProperties.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
         if (positionedObjectProperties != null)
           'positionedObjectProperties': positionedObjectProperties!.toJson(),
@@ -4899,7 +4876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (layout != null) 'layout': layout!,
         if (leftOffset != null) 'leftOffset': leftOffset!.toJson(),
         if (topOffset != null) 'topOffset': topOffset!.toJson(),
@@ -4934,7 +4911,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (layoutSuggested != null) 'layoutSuggested': layoutSuggested!,
         if (leftOffsetSuggested != null)
           'leftOffsetSuggested': leftOffsetSuggested!,
@@ -4965,7 +4942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (embeddedObject != null) 'embeddedObject': embeddedObject!.toJson(),
         if (positioning != null) 'positioning': positioning!.toJson(),
       };
@@ -5000,7 +4977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (embeddedObjectSuggestionState != null)
           'embeddedObjectSuggestionState':
               embeddedObjectSuggestionState!.toJson(),
@@ -5044,7 +5021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endIndex != null) 'endIndex': endIndex!,
         if (segmentId != null) 'segmentId': segmentId!,
         if (startIndex != null) 'startIndex': startIndex!,
@@ -5071,7 +5048,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containsText != null) 'containsText': containsText!.toJson(),
         if (replaceText != null) 'replaceText': replaceText!,
       };
@@ -5090,7 +5067,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (occurrencesChanged != null)
           'occurrencesChanged': occurrencesChanged!,
       };
@@ -5137,7 +5114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageObjectId != null) 'imageObjectId': imageObjectId!,
         if (imageReplaceMethod != null)
           'imageReplaceMethod': imageReplaceMethod!,
@@ -5184,7 +5161,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namedRangeId != null) 'namedRangeId': namedRangeId!,
         if (namedRangeName != null) 'namedRangeName': namedRangeName!,
         if (text != null) 'text': text!,
@@ -5427,7 +5404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createFooter != null) 'createFooter': createFooter!.toJson(),
         if (createFootnote != null) 'createFootnote': createFootnote!.toJson(),
         if (createHeader != null) 'createHeader': createHeader!.toJson(),
@@ -5541,7 +5518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createFooter != null) 'createFooter': createFooter!.toJson(),
         if (createFootnote != null) 'createFootnote': createFootnote!.toJson(),
         if (createHeader != null) 'createHeader': createHeader!.toJson(),
@@ -5580,7 +5557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blue != null) 'blue': blue!,
         if (green != null) 'green': green!,
         if (red != null) 'red': red!,
@@ -5627,7 +5604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sectionStyle != null) 'sectionStyle': sectionStyle!.toJson(),
         if (suggestedDeletionIds != null)
           'suggestedDeletionIds': suggestedDeletionIds!,
@@ -5659,7 +5636,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (paddingEnd != null) 'paddingEnd': paddingEnd!.toJson(),
         if (width != null) 'width': width!.toJson(),
       };
@@ -5903,7 +5880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnProperties != null)
           'columnProperties':
               columnProperties!.map((value) => value.toJson()).toList(),
@@ -5943,7 +5920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null)
           'backgroundColor': backgroundColor!.toJson(),
       };
@@ -5965,7 +5942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColorSuggested != null)
           'backgroundColorSuggested': backgroundColorSuggested!,
       };
@@ -5991,7 +5968,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chartId != null) 'chartId': chartId!,
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
       };
@@ -6019,7 +5996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chartIdSuggested != null) 'chartIdSuggested': chartIdSuggested!,
         if (spreadsheetIdSuggested != null)
           'spreadsheetIdSuggested': spreadsheetIdSuggested!,
@@ -6047,7 +6024,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!.toJson(),
         if (width != null) 'width': width!.toJson(),
       };
@@ -6075,7 +6052,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (heightSuggested != null) 'heightSuggested': heightSuggested!,
         if (widthSuggested != null) 'widthSuggested': widthSuggested!,
       };
@@ -6131,7 +6108,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endIndex != null) 'endIndex': endIndex!,
         if (paragraph != null) 'paragraph': paragraph!.toJson(),
         if (sectionBreak != null) 'sectionBreak': sectionBreak!.toJson(),
@@ -6164,7 +6141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matchCase != null) 'matchCase': matchCase!,
         if (text != null) 'text': text!,
       };
@@ -6196,7 +6173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bullet != null) 'bullet': bullet!.toJson(),
         if (bulletSuggestionState != null)
           'bulletSuggestionState': bulletSuggestionState!.toJson(),
@@ -6229,7 +6206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentStyle != null) 'documentStyle': documentStyle!.toJson(),
         if (documentStyleSuggestionState != null)
           'documentStyleSuggestionState':
@@ -6266,7 +6243,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inlineObjectProperties != null)
           'inlineObjectProperties': inlineObjectProperties!.toJson(),
         if (inlineObjectPropertiesSuggestionState != null)
@@ -6301,7 +6278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (listProperties != null) 'listProperties': listProperties!.toJson(),
         if (listPropertiesSuggestionState != null)
           'listPropertiesSuggestionState':
@@ -6335,7 +6312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namedStyles != null) 'namedStyles': namedStyles!.toJson(),
         if (namedStylesSuggestionState != null)
           'namedStylesSuggestionState': namedStylesSuggestionState!.toJson(),
@@ -6368,7 +6345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (paragraphStyle != null) 'paragraphStyle': paragraphStyle!.toJson(),
         if (paragraphStyleSuggestionState != null)
           'paragraphStyleSuggestionState':
@@ -6407,7 +6384,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (positionedObjectProperties != null)
           'positionedObjectProperties': positionedObjectProperties!.toJson(),
         if (positionedObjectPropertiesSuggestionState != null)
@@ -6442,7 +6419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tableCellStyle != null) 'tableCellStyle': tableCellStyle!.toJson(),
         if (tableCellStyleSuggestionState != null)
           'tableCellStyleSuggestionState':
@@ -6476,7 +6453,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tableRowStyle != null) 'tableRowStyle': tableRowStyle!.toJson(),
         if (tableRowStyleSuggestionState != null)
           'tableRowStyleSuggestionState':
@@ -6510,7 +6487,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (textStyle != null) 'textStyle': textStyle!.toJson(),
         if (textStyleSuggestionState != null)
           'textStyleSuggestionState': textStyleSuggestionState!.toJson(),
@@ -6546,7 +6523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alignment != null) 'alignment': alignment!,
         if (offset != null) 'offset': offset!.toJson(),
       };
@@ -6611,7 +6588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null) 'columns': columns!,
         if (rows != null) 'rows': rows!,
         if (suggestedDeletionIds != null)
@@ -6679,16 +6656,15 @@
           .toList();
     }
     if (_json.containsKey('suggestedTableCellStyleChanges')) {
-      suggestedTableCellStyleChanges =
-          (_json['suggestedTableCellStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedTableCellStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedTableCellStyleChanges = (_json['suggestedTableCellStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedTableCellStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('tableCellStyle')) {
       tableCellStyle = TableCellStyle.fromJson(
@@ -6696,7 +6672,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null)
           'content': content!.map((value) => value.toJson()).toList(),
         if (endIndex != null) 'endIndex': endIndex!,
@@ -6752,7 +6728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (dashStyle != null) 'dashStyle': dashStyle!,
         if (width != null) 'width': width!.toJson(),
@@ -6789,7 +6765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnIndex != null) 'columnIndex': columnIndex!,
         if (rowIndex != null) 'rowIndex': rowIndex!,
         if (tableStartLocation != null)
@@ -6905,7 +6881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null)
           'backgroundColor': backgroundColor!.toJson(),
         if (borderBottom != null) 'borderBottom': borderBottom!.toJson(),
@@ -7005,7 +6981,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColorSuggested != null)
           'backgroundColorSuggested': backgroundColorSuggested!,
         if (borderBottomSuggested != null)
@@ -7062,7 +7038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (width != null) 'width': width!.toJson(),
         if (widthType != null) 'widthType': widthType!,
       };
@@ -7105,7 +7081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null)
           'content': content!.map((value) => value.toJson()).toList(),
         if (suggestedDeletionIds != null)
@@ -7148,7 +7124,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnSpan != null) 'columnSpan': columnSpan!,
         if (rowSpan != null) 'rowSpan': rowSpan!,
         if (tableCellLocation != null)
@@ -7207,16 +7183,15 @@
           .toList();
     }
     if (_json.containsKey('suggestedTableRowStyleChanges')) {
-      suggestedTableRowStyleChanges =
-          (_json['suggestedTableRowStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedTableRowStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedTableRowStyleChanges = (_json['suggestedTableRowStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedTableRowStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('tableCells')) {
       tableCells = (_json['tableCells'] as core.List)
@@ -7230,7 +7205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endIndex != null) 'endIndex': endIndex!,
         if (startIndex != null) 'startIndex': startIndex!,
         if (suggestedDeletionIds != null)
@@ -7264,7 +7239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minRowHeight != null) 'minRowHeight': minRowHeight!.toJson(),
       };
 }
@@ -7285,7 +7260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minRowHeightSuggested != null)
           'minRowHeightSuggested': minRowHeightSuggested!,
       };
@@ -7311,7 +7286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tableColumnProperties != null)
           'tableColumnProperties':
               tableColumnProperties!.map((value) => value.toJson()).toList(),
@@ -7361,16 +7336,15 @@
           .toList();
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
-      suggestedTextStyleChanges =
-          (_json['suggestedTextStyleChanges'] as core.Map)
-              .cast<core.String, core.Map<core.String, core.Object?>>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  SuggestedTextStyle.fromJson(
-                      item as core.Map<core.String, core.dynamic>),
-                ),
-              );
+      suggestedTextStyleChanges = (_json['suggestedTextStyleChanges']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('textStyle')) {
       textStyle = TextStyle.fromJson(
@@ -7378,7 +7352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (suggestedDeletionIds != null)
           'suggestedDeletionIds': suggestedDeletionIds!,
@@ -7519,7 +7493,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null)
           'backgroundColor': backgroundColor!.toJson(),
         if (baselineOffset != null) 'baselineOffset': baselineOffset!,
@@ -7614,7 +7588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColorSuggested != null)
           'backgroundColorSuggested': backgroundColorSuggested!,
         if (baselineOffsetSuggested != null)
@@ -7657,7 +7631,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tableRange != null) 'tableRange': tableRange!.toJson(),
       };
 }
@@ -7691,7 +7665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentStyle != null) 'documentStyle': documentStyle!.toJson(),
         if (fields != null) 'fields': fields!,
       };
@@ -7734,7 +7708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (paragraphStyle != null) 'paragraphStyle': paragraphStyle!.toJson(),
         if (range != null) 'range': range!.toJson(),
@@ -7780,7 +7754,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (range != null) 'range': range!.toJson(),
         if (sectionStyle != null) 'sectionStyle': sectionStyle!.toJson(),
@@ -7838,7 +7812,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (tableCellStyle != null) 'tableCellStyle': tableCellStyle!.toJson(),
         if (tableRange != null) 'tableRange': tableRange!.toJson(),
@@ -7893,7 +7867,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnIndices != null) 'columnIndices': columnIndices!,
         if (fields != null) 'fields': fields!,
         if (tableColumnProperties != null)
@@ -7945,7 +7919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (rowIndices != null) 'rowIndices': rowIndices!,
         if (tableRowStyle != null) 'tableRowStyle': tableRowStyle!.toJson(),
@@ -7997,7 +7971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (range != null) 'range': range!.toJson(),
         if (textStyle != null) 'textStyle': textStyle!.toJson(),
@@ -8042,7 +8016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fontFamily != null) 'fontFamily': fontFamily!,
         if (weight != null) 'weight': weight!,
       };
@@ -8088,7 +8062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requiredRevisionId != null)
           'requiredRevisionId': requiredRevisionId!,
         if (targetRevisionId != null) 'targetRevisionId': targetRevisionId!,
diff --git a/generated/googleapis/lib/domainsrdap/v1.dart b/generated/googleapis/lib/domainsrdap/v1.dart
index 76266bd..b01cb65 100644
--- a/generated/googleapis/lib/domainsrdap/v1.dart
+++ b/generated/googleapis/lib/domainsrdap/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -513,8 +512,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -524,7 +523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (data != null) 'data': data!,
         if (extensions != null) 'extensions': extensions!,
@@ -595,7 +594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (href != null) 'href': href!,
         if (hreflang != null) 'hreflang': hreflang!,
         if (media != null) 'media': media!,
@@ -649,7 +648,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (links != null)
           'links': links!.map((value) => value.toJson()).toList(),
@@ -720,7 +719,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (errorCode != null) 'errorCode': errorCode!,
         if (jsonResponse != null) 'jsonResponse': jsonResponse!.toJson(),
diff --git a/generated/googleapis/lib/doubleclickbidmanager/v1_1.dart b/generated/googleapis/lib/doubleclickbidmanager/v1_1.dart
index a0f594d..de6f246 100644
--- a/generated/googleapis/lib/doubleclickbidmanager/v1_1.dart
+++ b/generated/googleapis/lib/doubleclickbidmanager/v1_1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -466,7 +465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fallbackName != null) 'fallbackName': fallbackName!,
         if (name != null) 'name': name!,
         if (rules != null)
@@ -493,7 +492,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventFilters != null)
           'eventFilters': eventFilters!.map((value) => value.toJson()).toList(),
       };
@@ -547,7 +546,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileSpec != null) 'fileSpec': fileSpec!,
         if (filterIds != null) 'filterIds': filterIds!,
         if (filterType != null) 'filterType': filterType!,
@@ -570,7 +569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineItems != null) 'lineItems': lineItems!,
       };
 }
@@ -631,7 +630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileTypes != null) 'fileTypes': fileTypes!,
         if (filterIds != null) 'filterIds': filterIds!,
         if (filterType != null) 'filterType': filterType!,
@@ -680,7 +679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adGroups != null) 'adGroups': adGroups!,
         if (ads != null) 'ads': ads!,
         if (campaigns != null) 'campaigns': campaigns!,
@@ -705,7 +704,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionFilter != null)
           'dimensionFilter': dimensionFilter!.toJson(),
       };
@@ -993,7 +992,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
       };
@@ -1029,7 +1028,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (queries != null)
@@ -1067,7 +1066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (reports != null)
@@ -1098,7 +1097,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeOnlyTargetedUserLists != null)
           'includeOnlyTargetedUserLists': includeOnlyTargetedUserLists!,
         if (pathQueryOptions != null)
@@ -1194,7 +1193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filters != null)
           'filters': filters!.map((value) => value.toJson()).toList(),
         if (groupBys != null) 'groupBys': groupBys!,
@@ -1237,7 +1236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventFilters != null)
           'eventFilters': eventFilters!.map((value) => value.toJson()).toList(),
         if (pathMatchPosition != null) 'pathMatchPosition': pathMatchPosition!,
@@ -1269,7 +1268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelGrouping != null)
           'channelGrouping': channelGrouping!.toJson(),
         if (pathFilters != null)
@@ -1573,7 +1572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
         if (match != null) 'match': match!,
         if (values != null) 'values': values!,
@@ -1648,7 +1647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (params != null) 'params': params!.toJson(),
@@ -1777,7 +1776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataRange != null) 'dataRange': dataRange!,
         if (format != null) 'format': format!,
         if (googleCloudStoragePathForLatestReport != null)
@@ -1847,7 +1846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTimeMs != null) 'endTimeMs': endTimeMs!,
         if (frequency != null) 'frequency': frequency!,
         if (nextRunMinuteOfDay != null)
@@ -1886,7 +1885,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!.toJson(),
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (params != null) 'params': params!.toJson(),
@@ -1925,7 +1924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorCode != null) 'errorCode': errorCode!,
       };
 }
@@ -1949,7 +1948,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queryId != null) 'queryId': queryId!,
         if (reportId != null) 'reportId': reportId!,
       };
@@ -1988,7 +1987,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (googleCloudStoragePath != null)
           'googleCloudStoragePath': googleCloudStoragePath!,
         if (reportDataEndTimeMs != null)
@@ -2039,7 +2038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failure != null) 'failure': failure!.toJson(),
         if (finishTimeMs != null) 'finishTimeMs': finishTimeMs!,
         if (format != null) 'format': format!,
@@ -2092,7 +2091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changed != null) 'changed': changed!,
         if (entityId != null) 'entityId': entityId!,
         if (entityName != null) 'entityName': entityName!,
@@ -2128,7 +2127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disjunctiveMatchStatements != null)
           'disjunctiveMatchStatements': disjunctiveMatchStatements!
               .map((value) => value.toJson())
@@ -2197,7 +2196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataRange != null) 'dataRange': dataRange!,
         if (reportDataEndTimeMs != null)
           'reportDataEndTimeMs': reportDataEndTimeMs!,
@@ -2239,7 +2238,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dryRun != null) 'dryRun': dryRun!,
         if (format != null) 'format': format!,
         if (lineItems != null) 'lineItems': lineItems!,
@@ -2260,7 +2259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uploadStatus != null) 'uploadStatus': uploadStatus!.toJson(),
       };
 }
@@ -2289,7 +2288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null) 'errors': errors!,
         if (rowStatus != null)
           'rowStatus': rowStatus!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/doubleclicksearch/v2.dart b/generated/googleapis/lib/doubleclicksearch/v2.dart
index bbc7931..93ee0cf 100644
--- a/generated/googleapis/lib/doubleclicksearch/v2.dart
+++ b/generated/googleapis/lib/doubleclicksearch/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -526,7 +525,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (agencyId != null) 'agencyId': agencyId!,
         if (availabilityTimestamp != null)
@@ -786,7 +785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adGroupId != null) 'adGroupId': adGroupId!,
         if (adId != null) 'adId': adId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
@@ -853,7 +852,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conversion != null)
           'conversion': conversion!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -879,7 +878,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -904,7 +903,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -928,7 +927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (byteCount != null) 'byteCount': byteCount!,
         if (url != null) 'url': url!,
       };
@@ -1028,7 +1027,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (files != null)
           'files': files!.map((value) => value.toJson()).toList(),
         if (id != null) 'id': id!,
@@ -1145,7 +1144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnName != null) 'columnName': columnName!,
         if (customDimensionName != null)
           'customDimensionName': customDimensionName!,
@@ -1196,7 +1195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (column != null) 'column': column!.toJson(),
         if (operator != null) 'operator': operator!,
         if (values != null) 'values': values!,
@@ -1224,7 +1223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (column != null) 'column': column!.toJson(),
         if (sortOrder != null) 'sortOrder': sortOrder!,
       };
@@ -1283,7 +1282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adGroupId != null) 'adGroupId': adGroupId!,
         if (adId != null) 'adId': adId!,
         if (advertiserId != null) 'advertiserId': advertiserId!,
@@ -1332,7 +1331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changedAttributesSinceTimestamp != null)
           'changedAttributesSinceTimestamp': changedAttributesSinceTimestamp!,
         if (changedMetricsSinceTimestamp != null)
@@ -1489,7 +1488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null)
           'columns': columns!.map((value) => value.toJson()).toList(),
         if (downloadFormat != null) 'downloadFormat': downloadFormat!,
@@ -1579,7 +1578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (savedColumnName != null) 'savedColumnName': savedColumnName!,
         if (type != null) 'type': type!,
@@ -1614,7 +1613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -1637,7 +1636,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availabilities != null)
           'availabilities':
               availabilities!.map((value) => value.toJson()).toList(),
@@ -1660,7 +1659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availabilities != null)
           'availabilities':
               availabilities!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/drive/v2.dart b/generated/googleapis/lib/drive/v2.dart
index 5359c06..44ee525 100644
--- a/generated/googleapis/lib/drive/v2.dart
+++ b/generated/googleapis/lib/drive/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -4313,7 +4312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalRoles != null) 'additionalRoles': additionalRoles!,
         if (primaryRole != null) 'primaryRole': primaryRole!,
       };
@@ -4341,7 +4340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (roleSets != null)
           'roleSets': roleSets!.map((value) => value.toJson()).toList(),
         if (type != null) 'type': type!,
@@ -4372,7 +4371,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundImageLink != null)
           'backgroundImageLink': backgroundImageLink!,
         if (colorRgb != null) 'colorRgb': colorRgb!,
@@ -4400,7 +4399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (source != null) 'source': source!,
         if (targets != null) 'targets': targets!,
       };
@@ -4424,7 +4423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (featureName != null) 'featureName': featureName!,
         if (featureRate != null) 'featureRate': featureRate!,
       };
@@ -4450,7 +4449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (source != null) 'source': source!,
         if (targets != null) 'targets': targets!,
       };
@@ -4474,7 +4473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (size != null) 'size': size!,
         if (type != null) 'type': type!,
       };
@@ -4498,7 +4497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bytesUsed != null) 'bytesUsed': bytesUsed!,
         if (serviceName != null) 'serviceName': serviceName!,
       };
@@ -4528,7 +4527,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundImageLink != null)
           'backgroundImageLink': backgroundImageLink!,
         if (colorRgb != null) 'colorRgb': colorRgb!,
@@ -4759,7 +4758,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalRoleInfo != null)
           'additionalRoleInfo':
               additionalRoleInfo!.map((value) => value.toJson()).toList(),
@@ -4843,7 +4842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (iconUrl != null) 'iconUrl': iconUrl!,
         if (size != null) 'size': size!,
@@ -5025,7 +5024,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorized != null) 'authorized': authorized!,
         if (createInFolderTemplate != null)
           'createInFolderTemplate': createInFolderTemplate!,
@@ -5104,7 +5103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultAppIds != null) 'defaultAppIds': defaultAppIds!,
         if (etag != null) 'etag': etag!,
         if (items != null)
@@ -5212,7 +5211,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changeType != null) 'changeType': changeType!,
         if (deleted != null) 'deleted': deleted!,
         if (drive != null) 'drive': drive!.toJson(),
@@ -5298,7 +5297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -5372,13 +5371,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('payload')) {
       payload = _json['payload'] as core.bool;
@@ -5397,7 +5395,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (expiration != null) 'expiration': expiration!,
         if (id != null) 'id': id!,
@@ -5464,7 +5462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -5506,7 +5504,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childLink != null) 'childLink': childLink!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -5536,7 +5534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
       };
@@ -5660,7 +5658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (anchor != null) 'anchor': anchor!,
         if (author != null) 'author': author!.toJson(),
         if (commentId != null) 'commentId': commentId!,
@@ -5728,7 +5726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5814,7 +5812,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (author != null) 'author': author!.toJson(),
         if (content != null) 'content': content!,
         if (createdDate != null) 'createdDate': createdDate!.toIso8601String(),
@@ -5875,7 +5873,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5937,7 +5935,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (readOnly != null) 'readOnly': readOnly!,
         if (reason != null) 'reason': reason!,
         if (restrictingUser != null)
@@ -5999,7 +5997,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (width != null) 'width': width!,
         if (xCoordinate != null) 'xCoordinate': xCoordinate!,
@@ -6137,7 +6135,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canAddChildren != null) 'canAddChildren': canAddChildren!,
         if (canChangeCopyRequiresWriterPermissionRestriction != null)
           'canChangeCopyRequiresWriterPermissionRestriction':
@@ -6209,7 +6207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminManagedRestrictions != null)
           'adminManagedRestrictions': adminManagedRestrictions!,
         if (copyRequiresWriterPermission != null)
@@ -6311,7 +6309,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundImageFile != null)
           'backgroundImageFile': backgroundImageFile!.toJson(),
         if (backgroundImageLink != null)
@@ -6363,7 +6361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -6648,7 +6646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canAddChildren != null) 'canAddChildren': canAddChildren!,
         if (canAddFolderFromAnotherDrive != null)
           'canAddFolderFromAnotherDrive': canAddFolderFromAnotherDrive!,
@@ -6728,7 +6726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (altitude != null) 'altitude': altitude!,
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
@@ -6874,7 +6872,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aperture != null) 'aperture': aperture!,
         if (cameraMake != null) 'cameraMake': cameraMake!,
         if (cameraModel != null) 'cameraModel': cameraModel!,
@@ -6912,7 +6910,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (text != null) 'text': text!,
       };
 }
@@ -6967,7 +6965,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hidden != null) 'hidden': hidden!,
         if (modified != null) 'modified': modified!,
         if (restricted != null) 'restricted': restricted!,
@@ -7002,7 +7000,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetId != null) 'targetId': targetId!,
         if (targetMimeType != null) 'targetMimeType': targetMimeType!,
       };
@@ -7039,7 +7037,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (image != null) 'image': image!,
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -7072,7 +7070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (durationMillis != null) 'durationMillis': durationMillis!,
         if (height != null) 'height': height!,
         if (width != null) 'width': width!,
@@ -7464,14 +7462,13 @@
       explicitlyTrashed = _json['explicitlyTrashed'] as core.bool;
     }
     if (_json.containsKey('exportLinks')) {
-      exportLinks = (_json['exportLinks'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      exportLinks =
+          (_json['exportLinks'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('fileExtension')) {
       fileExtension = _json['fileExtension'] as core.String;
@@ -7547,14 +7544,13 @@
       modifiedDate = core.DateTime.parse(_json['modifiedDate'] as core.String);
     }
     if (_json.containsKey('openWithLinks')) {
-      openWithLinks = (_json['openWithLinks'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      openWithLinks =
+          (_json['openWithLinks'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('originalFilename')) {
       originalFilename = _json['originalFilename'] as core.String;
@@ -7670,7 +7666,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateLink != null) 'alternateLink': alternateLink!,
         if (appDataContents != null) 'appDataContents': appDataContents!,
         if (canComment != null) 'canComment': canComment!,
@@ -7828,7 +7824,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (incompleteSearch != null) 'incompleteSearch': incompleteSearch!,
         if (items != null)
@@ -7867,7 +7863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ids != null) 'ids': ids!,
         if (kind != null) 'kind': kind!,
         if (space != null) 'space': space!,
@@ -7908,7 +7904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -7954,7 +7950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (isRoot != null) 'isRoot': isRoot!,
         if (kind != null) 'kind': kind!,
@@ -8020,7 +8016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalRoles != null) 'additionalRoles': additionalRoles!,
         if (inherited != null) 'inherited': inherited!,
         if (inheritedFrom != null) 'inheritedFrom': inheritedFrom!,
@@ -8067,7 +8063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalRoles != null) 'additionalRoles': additionalRoles!,
         if (inherited != null) 'inherited': inherited!,
         if (inheritedFrom != null) 'inheritedFrom': inheritedFrom!,
@@ -8259,7 +8255,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalRoles != null) 'additionalRoles': additionalRoles!,
         if (authKey != null) 'authKey': authKey!,
         if (deleted != null) 'deleted': deleted!,
@@ -8307,7 +8303,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
       };
@@ -8357,7 +8353,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -8422,7 +8418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (key != null) 'key': key!,
         if (kind != null) 'kind': kind!,
@@ -8467,7 +8463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -8561,14 +8557,13 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('exportLinks')) {
-      exportLinks = (_json['exportLinks'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      exportLinks =
+          (_json['exportLinks'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('fileSize')) {
       fileSize = _json['fileSize'] as core.String;
@@ -8618,7 +8613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (downloadUrl != null) 'downloadUrl': downloadUrl!,
         if (etag != null) 'etag': etag!,
         if (exportLinks != null) 'exportLinks': exportLinks!,
@@ -8691,7 +8686,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -8721,7 +8716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (startPageToken != null) 'startPageToken': startPageToken!,
       };
@@ -8778,7 +8773,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (width != null) 'width': width!,
         if (xCoordinate != null) 'xCoordinate': xCoordinate!,
@@ -8923,7 +8918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canAddChildren != null) 'canAddChildren': canAddChildren!,
         if (canChangeCopyRequiresWriterPermissionRestriction != null)
           'canChangeCopyRequiresWriterPermissionRestriction':
@@ -8998,7 +8993,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminManagedRestrictions != null)
           'adminManagedRestrictions': adminManagedRestrictions!,
         if (copyRequiresWriterPermission != null)
@@ -9094,7 +9089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundImageFile != null)
           'backgroundImageFile': backgroundImageFile!.toJson(),
         if (backgroundImageLink != null)
@@ -9138,7 +9133,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -9159,7 +9154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -9209,7 +9204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (emailAddress != null) 'emailAddress': emailAddress!,
         if (isAuthenticatedUser != null)
diff --git a/generated/googleapis/lib/drive/v3.dart b/generated/googleapis/lib/drive/v3.dart
index 051e130..524a113 100644
--- a/generated/googleapis/lib/drive/v3.dart
+++ b/generated/googleapis/lib/drive/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2814,7 +2813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundImageLink != null)
           'backgroundImageLink': backgroundImageLink!,
         if (colorRgb != null) 'colorRgb': colorRgb!,
@@ -2857,7 +2856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (limit != null) 'limit': limit!,
         if (usage != null) 'usage': usage!,
         if (usageInDrive != null) 'usageInDrive': usageInDrive!,
@@ -2889,7 +2888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundImageLink != null)
           'backgroundImageLink': backgroundImageLink!,
         if (colorRgb != null) 'colorRgb': colorRgb!,
@@ -2961,16 +2960,15 @@
           .toList();
     }
     if (_json.containsKey('exportFormats')) {
-      exportFormats = (_json['exportFormats'] as core.Map)
-          .cast<core.String, core.List<core.String>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              (item as core.List)
-                  .map<core.String>((value) => value as core.String)
-                  .toList(),
-            ),
-          );
+      exportFormats =
+          (_json['exportFormats'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          (item as core.List)
+              .map<core.String>((value) => value as core.String)
+              .toList(),
+        ),
+      );
     }
     if (_json.containsKey('folderColorPalette')) {
       folderColorPalette = (_json['folderColorPalette'] as core.List)
@@ -2978,29 +2976,27 @@
           .toList();
     }
     if (_json.containsKey('importFormats')) {
-      importFormats = (_json['importFormats'] as core.Map)
-          .cast<core.String, core.List<core.String>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              (item as core.List)
-                  .map<core.String>((value) => value as core.String)
-                  .toList(),
-            ),
-          );
+      importFormats =
+          (_json['importFormats'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          (item as core.List)
+              .map<core.String>((value) => value as core.String)
+              .toList(),
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('maxImportSizes')) {
-      maxImportSizes = (_json['maxImportSizes'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      maxImportSizes =
+          (_json['maxImportSizes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('maxUploadSize')) {
       maxUploadSize = _json['maxUploadSize'] as core.String;
@@ -3021,7 +3017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appInstalled != null) 'appInstalled': appInstalled!,
         if (canCreateDrives != null) 'canCreateDrives': canCreateDrives!,
         if (canCreateTeamDrives != null)
@@ -3130,7 +3126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changeType != null) 'changeType': changeType!,
         if (drive != null) 'drive': drive!.toJson(),
         if (driveId != null) 'driveId': driveId!,
@@ -3191,7 +3187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changes != null)
           'changes': changes!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3261,13 +3257,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('payload')) {
       payload = _json['payload'] as core.bool;
@@ -3286,7 +3281,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (expiration != null) 'expiration': expiration!,
         if (id != null) 'id': id!,
@@ -3325,7 +3320,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mimeType != null) 'mimeType': mimeType!,
         if (value != null) 'value': value!,
       };
@@ -3432,7 +3427,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (anchor != null) 'anchor': anchor!,
         if (author != null) 'author': author!.toJson(),
         if (content != null) 'content': content!,
@@ -3488,7 +3483,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comments != null)
           'comments': comments!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3548,7 +3543,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (readOnly != null) 'readOnly': readOnly!,
         if (reason != null) 'reason': reason!,
         if (restrictingUser != null)
@@ -3610,7 +3605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (width != null) 'width': width!,
         if (xCoordinate != null) 'xCoordinate': xCoordinate!,
@@ -3748,7 +3743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canAddChildren != null) 'canAddChildren': canAddChildren!,
         if (canChangeCopyRequiresWriterPermissionRestriction != null)
           'canChangeCopyRequiresWriterPermissionRestriction':
@@ -3820,7 +3815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminManagedRestrictions != null)
           'adminManagedRestrictions': adminManagedRestrictions!,
         if (copyRequiresWriterPermission != null)
@@ -3924,7 +3919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundImageFile != null)
           'backgroundImageFile': backgroundImageFile!.toJson(),
         if (backgroundImageLink != null)
@@ -3978,7 +3973,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (drives != null)
           'drives': drives!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -4263,7 +4258,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canAddChildren != null) 'canAddChildren': canAddChildren!,
         if (canAddFolderFromAnotherDrive != null)
           'canAddFolderFromAnotherDrive': canAddFolderFromAnotherDrive!,
@@ -4345,7 +4340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (image != null) 'image': image!,
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -4378,7 +4373,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexableText != null) 'indexableText': indexableText!,
         if (thumbnail != null) 'thumbnail': thumbnail!.toJson(),
       };
@@ -4409,7 +4404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (altitude != null) 'altitude': altitude!,
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
@@ -4552,7 +4547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aperture != null) 'aperture': aperture!,
         if (cameraMake != null) 'cameraMake': cameraMake!,
         if (cameraModel != null) 'cameraModel': cameraModel!,
@@ -4602,7 +4597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetId != null) 'targetId': targetId!,
         if (targetMimeType != null) 'targetMimeType': targetMimeType!,
       };
@@ -4635,7 +4630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (durationMillis != null) 'durationMillis': durationMillis!,
         if (height != null) 'height': height!,
         if (width != null) 'width': width!,
@@ -4931,14 +4926,13 @@
 
   File.fromJson(core.Map _json) {
     if (_json.containsKey('appProperties')) {
-      appProperties = (_json['appProperties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      appProperties =
+          (_json['appProperties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('capabilities')) {
       capabilities = FileCapabilities.fromJson(
@@ -4971,14 +4965,13 @@
       explicitlyTrashed = _json['explicitlyTrashed'] as core.bool;
     }
     if (_json.containsKey('exportLinks')) {
-      exportLinks = (_json['exportLinks'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      exportLinks =
+          (_json['exportLinks'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('fileExtension')) {
       fileExtension = _json['fileExtension'] as core.String;
@@ -5066,14 +5059,13 @@
           .toList();
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('quotaBytesUsed')) {
       quotaBytesUsed = _json['quotaBytesUsed'] as core.String;
@@ -5151,7 +5143,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appProperties != null) 'appProperties': appProperties!,
         if (capabilities != null) 'capabilities': capabilities!.toJson(),
         if (contentHints != null) 'contentHints': contentHints!.toJson(),
@@ -5276,7 +5268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (files != null)
           'files': files!.map((value) => value.toJson()).toList(),
         if (incompleteSearch != null) 'incompleteSearch': incompleteSearch!,
@@ -5314,7 +5306,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ids != null) 'ids': ids!,
         if (kind != null) 'kind': kind!,
         if (space != null) 'space': space!,
@@ -5368,7 +5360,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inherited != null) 'inherited': inherited!,
         if (inheritedFrom != null) 'inheritedFrom': inheritedFrom!,
         if (permissionType != null) 'permissionType': permissionType!,
@@ -5406,7 +5398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inherited != null) 'inherited': inherited!,
         if (inheritedFrom != null) 'inheritedFrom': inheritedFrom!,
         if (role != null) 'role': role!,
@@ -5564,7 +5556,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowFileDiscovery != null)
           'allowFileDiscovery': allowFileDiscovery!,
         if (deleted != null) 'deleted': deleted!,
@@ -5626,7 +5618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (permissions != null)
@@ -5709,7 +5701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (author != null) 'author': author!.toJson(),
         if (content != null) 'content': content!,
@@ -5760,7 +5752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (replies != null)
@@ -5838,14 +5830,13 @@
 
   Revision.fromJson(core.Map _json) {
     if (_json.containsKey('exportLinks')) {
-      exportLinks = (_json['exportLinks'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      exportLinks =
+          (_json['exportLinks'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -5889,7 +5880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exportLinks != null) 'exportLinks': exportLinks!,
         if (id != null) 'id': id!,
         if (keepForever != null) 'keepForever': keepForever!,
@@ -5947,7 +5938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (revisions != null)
@@ -5975,7 +5966,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (startPageToken != null) 'startPageToken': startPageToken!,
       };
@@ -6032,7 +6023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (width != null) 'width': width!,
         if (xCoordinate != null) 'xCoordinate': xCoordinate!,
@@ -6177,7 +6168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canAddChildren != null) 'canAddChildren': canAddChildren!,
         if (canChangeCopyRequiresWriterPermissionRestriction != null)
           'canChangeCopyRequiresWriterPermissionRestriction':
@@ -6252,7 +6243,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminManagedRestrictions != null)
           'adminManagedRestrictions': adminManagedRestrictions!,
         if (copyRequiresWriterPermission != null)
@@ -6350,7 +6341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundImageFile != null)
           'backgroundImageFile': backgroundImageFile!.toJson(),
         if (backgroundImageLink != null)
@@ -6403,7 +6394,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (teamDrives != null)
@@ -6459,7 +6450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (emailAddress != null) 'emailAddress': emailAddress!,
         if (kind != null) 'kind': kind!,
diff --git a/generated/googleapis/lib/driveactivity/v2.dart b/generated/googleapis/lib/driveactivity/v2.dart
index e771a75..efce234 100644
--- a/generated/googleapis/lib/driveactivity/v2.dart
+++ b/generated/googleapis/lib/driveactivity/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -145,7 +144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actor != null) 'actor': actor!.toJson(),
         if (detail != null) 'detail': detail!.toJson(),
         if (target != null) 'target': target!.toJson(),
@@ -238,7 +237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comment != null) 'comment': comment!.toJson(),
         if (create != null) 'create': create!.toJson(),
         if (delete != null) 'delete': delete!.toJson(),
@@ -296,7 +295,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (administrator != null) 'administrator': administrator!.toJson(),
         if (anonymous != null) 'anonymous': anonymous!.toJson(),
         if (impersonation != null) 'impersonation': impersonation!.toJson(),
@@ -313,7 +312,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Empty message representing an anonymous user or indicating the authenticated
@@ -325,7 +324,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents any user (including a logged out user).
@@ -336,7 +335,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Activity in applications other than Drive.
@@ -356,7 +355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -390,7 +389,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignedUser != null) 'assignedUser': assignedUser!.toJson(),
         if (subtype != null) 'subtype': subtype!,
       };
@@ -433,7 +432,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignment != null) 'assignment': assignment!.toJson(),
         if (mentionedUsers != null)
           'mentionedUsers':
@@ -469,7 +468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (legacy != null) 'legacy': legacy!.toJson(),
         if (none != null) 'none': none!.toJson(),
       };
@@ -489,7 +488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (originalObject != null) 'originalObject': originalObject!.toJson(),
       };
 }
@@ -524,7 +523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (copy != null) 'copy': copy!.toJson(),
         if (new_ != null) 'new': new_!.toJson(),
         if (upload != null) 'upload': upload!.toJson(),
@@ -550,7 +549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -572,7 +571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -585,7 +584,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Information about a domain.
@@ -607,7 +606,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (legacyId != null) 'legacyId': legacyId!,
         if (name != null) 'name': name!,
       };
@@ -642,7 +641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (root != null) 'root': root!.toJson(),
         if (title != null) 'title': title!,
@@ -717,7 +716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actions != null)
           'actions': actions!.map((value) => value.toJson()).toList(),
         if (actors != null)
@@ -739,7 +738,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A Drive item which is a folder.
@@ -760,7 +759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -831,7 +830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driveFile != null) 'driveFile': driveFile!.toJson(),
         if (driveFolder != null) 'driveFolder': driveFolder!.toJson(),
         if (file != null) 'file': file!.toJson(),
@@ -894,7 +893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driveFile != null) 'driveFile': driveFile!.toJson(),
         if (driveFolder != null) 'driveFolder': driveFolder!.toJson(),
         if (file != null) 'file': file!.toJson(),
@@ -926,7 +925,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (title != null) 'title': title!,
       };
@@ -940,7 +939,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// This item is deprecated; please see `DriveFile` instead.
@@ -951,7 +950,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A comment on a file.
@@ -994,7 +993,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (legacyCommentId != null) 'legacyCommentId': legacyCommentId!,
         if (legacyDiscussionId != null)
           'legacyDiscussionId': legacyDiscussionId!,
@@ -1025,7 +1024,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -1049,7 +1048,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (title != null) 'title': title!,
       };
@@ -1072,7 +1071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (impersonatedUser != null)
           'impersonatedUser': impersonatedUser!.toJson(),
       };
@@ -1101,7 +1100,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isCurrentUser != null) 'isCurrentUser': isCurrentUser!,
         if (personName != null) 'personName': personName!,
       };
@@ -1121,7 +1120,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An object was moved.
@@ -1149,7 +1148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addedParents != null)
           'addedParents': addedParents!.map((value) => value.toJson()).toList(),
         if (removedParents != null)
@@ -1166,7 +1165,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A strategy which does no consolidation of individual activities.
@@ -1177,7 +1176,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Information about the owner of a Drive item.
@@ -1215,7 +1214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domain != null) 'domain': domain!.toJson(),
         if (drive != null) 'drive': drive!.toJson(),
         if (teamDrive != null) 'teamDrive': teamDrive!.toJson(),
@@ -1289,7 +1288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowDiscovery != null) 'allowDiscovery': allowDiscovery!,
         if (anyone != null) 'anyone': anyone!.toJson(),
         if (domain != null) 'domain': domain!.toJson(),
@@ -1324,7 +1323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addedPermissions != null)
           'addedPermissions':
               addedPermissions!.map((value) => value.toJson()).toList(),
@@ -1355,7 +1354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (subtype != null) 'subtype': subtype!,
       };
 }
@@ -1429,7 +1428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ancestorName != null) 'ancestorName': ancestorName!,
         if (consolidationStrategy != null)
           'consolidationStrategy': consolidationStrategy!.toJson(),
@@ -1463,7 +1462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activities != null)
           'activities': activities!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1489,7 +1488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newTitle != null) 'newTitle': newTitle!,
         if (oldTitle != null) 'oldTitle': oldTitle!,
       };
@@ -1511,7 +1510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -1550,7 +1549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feature != null) 'feature': feature!,
         if (newRestriction != null) 'newRestriction': newRestriction!,
       };
@@ -1572,7 +1571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (restrictionChanges != null)
           'restrictionChanges':
               restrictionChanges!.map((value) => value.toJson()).toList(),
@@ -1602,7 +1601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (subtype != null) 'subtype': subtype!,
       };
 }
@@ -1626,7 +1625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -1666,7 +1665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (drive != null) 'drive': drive!.toJson(),
         if (driveItem != null) 'driveItem': driveItem!.toJson(),
         if (fileComment != null) 'fileComment': fileComment!.toJson(),
@@ -1702,7 +1701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (drive != null) 'drive': drive!.toJson(),
         if (driveItem != null) 'driveItem': driveItem!.toJson(),
         if (teamDrive != null) 'teamDrive': teamDrive!.toJson(),
@@ -1735,7 +1734,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (root != null) 'root': root!.toJson(),
         if (title != null) 'title': title!,
@@ -1761,7 +1760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (title != null) 'title': title!,
       };
@@ -1786,7 +1785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -1800,7 +1799,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An object was uploaded into Drive.
@@ -1811,7 +1810,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Information about an end user.
@@ -1842,7 +1841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deletedUser != null) 'deletedUser': deletedUser!.toJson(),
         if (knownUser != null) 'knownUser': knownUser!.toJson(),
         if (unknownUser != null) 'unknownUser': unknownUser!.toJson(),
diff --git a/generated/googleapis/lib/eventarc/v1.dart b/generated/googleapis/lib/eventarc/v1.dart
index e019c3c..8fda001 100644
--- a/generated/googleapis/lib/eventarc/v1.dart
+++ b/generated/googleapis/lib/eventarc/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -811,7 +810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -853,7 +852,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -925,7 +924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -970,7 +969,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (path != null) 'path': path!,
         if (region != null) 'region': region!,
         if (service != null) 'service': service!,
@@ -993,7 +992,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudRun != null) 'cloudRun': cloudRun!.toJson(),
       };
 }
@@ -1012,7 +1011,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Filters events based on exact matches on the CloudEvents attributes.
@@ -1041,7 +1040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribute != null) 'attribute': attribute!,
         if (value != null) 'value': value!,
       };
@@ -1108,7 +1107,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1124,7 +1123,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Operations.ListOperations.
@@ -1150,7 +1149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1211,29 +1210,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1275,8 +1272,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1289,7 +1286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1318,7 +1315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1357,7 +1354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (triggers != null)
           'triggers': triggers!.map((value) => value.toJson()).toList(),
@@ -1402,32 +1399,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1503,7 +1498,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -1619,7 +1614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -1661,7 +1656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (subscription != null) 'subscription': subscription!,
         if (topic != null) 'topic': topic!,
       };
@@ -1694,7 +1689,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -1719,7 +1714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1740,7 +1735,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1761,7 +1756,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pubsub != null) 'pubsub': pubsub!.toJson(),
       };
 }
@@ -1876,7 +1871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (destination != null) 'destination': destination!.toJson(),
         if (etag != null) 'etag': etag!,
diff --git a/generated/googleapis/lib/fcm/v1.dart b/generated/googleapis/lib/fcm/v1.dart
index 83c95d9..51fe891 100644
--- a/generated/googleapis/lib/fcm/v1.dart
+++ b/generated/googleapis/lib/fcm/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -190,12 +189,12 @@
       collapseKey = _json['collapseKey'] as core.String;
     }
     if (_json.containsKey('data')) {
-      data = (_json['data'] as core.Map).cast<core.String, core.String>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      data = (_json['data'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('directBootOk')) {
       directBootOk = _json['directBootOk'] as core.bool;
@@ -219,7 +218,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collapseKey != null) 'collapseKey': collapseKey!,
         if (data != null) 'data': data!,
         if (directBootOk != null) 'directBootOk': directBootOk!,
@@ -245,7 +244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyticsLabel != null) 'analyticsLabel': analyticsLabel!,
       };
 }
@@ -550,7 +549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!,
         if (bodyLocArgs != null) 'bodyLocArgs': bodyLocArgs!,
         if (bodyLocKey != null) 'bodyLocKey': bodyLocKey!,
@@ -614,26 +613,24 @@
           _json['fcmOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('payload')) {
-      payload =
-          (_json['payload'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      payload = (_json['payload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fcmOptions != null) 'fcmOptions': fcmOptions!.toJson(),
         if (headers != null) 'headers': headers!,
         if (payload != null) 'payload': payload!,
@@ -662,7 +659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyticsLabel != null) 'analyticsLabel': analyticsLabel!,
         if (image != null) 'image': image!,
       };
@@ -756,7 +753,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alpha != null) 'alpha': alpha!,
         if (blue != null) 'blue': blue!,
         if (green != null) 'green': green!,
@@ -777,7 +774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyticsLabel != null) 'analyticsLabel': analyticsLabel!,
       };
 }
@@ -821,7 +818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (lightOffDuration != null) 'lightOffDuration': lightOffDuration!,
         if (lightOnDuration != null) 'lightOnDuration': lightOnDuration!,
@@ -894,12 +891,12 @@
       condition = _json['condition'] as core.String;
     }
     if (_json.containsKey('data')) {
-      data = (_json['data'] as core.Map).cast<core.String, core.String>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      data = (_json['data'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('fcmOptions')) {
       fcmOptions = FcmOptions.fromJson(
@@ -924,7 +921,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (android != null) 'android': android!.toJson(),
         if (apns != null) 'apns': apns!.toJson(),
         if (condition != null) 'condition': condition!,
@@ -970,7 +967,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!,
         if (image != null) 'image': image!,
         if (title != null) 'title': title!,
@@ -999,7 +996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (message != null) 'message': message!.toJson(),
         if (validateOnly != null) 'validateOnly': validateOnly!,
       };
@@ -1037,39 +1034,37 @@
 
   WebpushConfig.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
-      data = (_json['data'] as core.Map).cast<core.String, core.String>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      data = (_json['data'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('fcmOptions')) {
       fcmOptions = WebpushFcmOptions.fromJson(
           _json['fcmOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('notification')) {
-      notification = (_json['notification'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      notification =
+          (_json['notification'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
         if (fcmOptions != null) 'fcmOptions': fcmOptions!.toJson(),
         if (headers != null) 'headers': headers!,
@@ -1098,7 +1093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyticsLabel != null) 'analyticsLabel': analyticsLabel!,
         if (link != null) 'link': link!,
       };
diff --git a/generated/googleapis/lib/file/v1.dart b/generated/googleapis/lib/file/v1.dart
index 44bd435..66e9b43 100644
--- a/generated/googleapis/lib/file/v1.dart
+++ b/generated/googleapis/lib/file/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -991,13 +990,12 @@
       downloadBytes = _json['downloadBytes'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1019,7 +1017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (capacityGb != null) 'capacityGb': capacityGb!,
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
@@ -1043,7 +1041,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Time window specified for daily operations.
@@ -1068,7 +1066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (startTime != null) 'startTime': startTime!.toJson(),
       };
@@ -1114,7 +1112,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -1164,7 +1162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!.toJson(),
         if (startDate != null) 'startDate': startDate!.toJson(),
         if (time != null) 'time': time!.toJson(),
@@ -1185,7 +1183,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// File share configuration for the instance.
@@ -1228,7 +1226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (capacityGb != null) 'capacityGb': capacityGb!,
         if (name != null) 'name': name!,
         if (nfsExportOptions != null)
@@ -1363,34 +1361,33 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('maintenancePolicyNames')) {
-      maintenancePolicyNames = (_json['maintenancePolicyNames'] as core.Map)
-          .cast<core.String, core.String>()
+      maintenancePolicyNames = (_json['maintenancePolicyNames']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('maintenanceSchedules')) {
-      maintenanceSchedules = (_json['maintenanceSchedules'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      maintenanceSchedules =
+          (_json['maintenanceSchedules'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('maintenanceSettings')) {
       maintenanceSettings =
@@ -1402,14 +1399,14 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('producerMetadata')) {
-      producerMetadata = (_json['producerMetadata'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      producerMetadata =
+          (_json['producerMetadata'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('provisionedResources')) {
       provisionedResources = (_json['provisionedResources'] as core.List)
@@ -1428,14 +1425,14 @@
               _json['sloMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('softwareVersions')) {
-      softwareVersions = (_json['softwareVersions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      softwareVersions =
+          (_json['softwareVersions'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -1448,7 +1445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDefinedName != null)
           'consumerDefinedName': consumerDefinedName!,
         if (createTime != null) 'createTime': createTime!,
@@ -1525,7 +1522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canReschedule != null) 'canReschedule': canReschedule!,
         if (endTime != null) 'endTime': endTime!,
         if (rolloutManagementPolicy != null)
@@ -1578,19 +1575,19 @@
       isRollback = _json['isRollback'] as core.bool;
     }
     if (_json.containsKey('maintenancePolicies')) {
-      maintenancePolicies = (_json['maintenancePolicies'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              MaintenancePolicy.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      maintenancePolicies =
+          (_json['maintenancePolicies'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          MaintenancePolicy.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclude != null) 'exclude': exclude!,
         if (isRollback != null) 'isRollback': isRollback!,
         if (maintenancePolicies != null)
@@ -1642,7 +1639,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclusions != null)
           'exclusions': exclusions!.map((value) => value.toJson()).toList(),
         if (location != null) 'location': location!,
@@ -1675,19 +1672,18 @@
   GoogleCloudSaasacceleratorManagementProvidersV1PerSliSloEligibility.fromJson(
       core.Map _json) {
     if (_json.containsKey('eligibilities')) {
-      eligibilities = (_json['eligibilities'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      eligibilities =
+          (_json['eligibilities'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eligibilities != null)
           'eligibilities': eligibilities!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -1722,7 +1718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceType != null) 'resourceType': resourceType!,
         if (resourceUrl != null) 'resourceUrl': resourceUrl!,
       };
@@ -1753,7 +1749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eligible != null) 'eligible': eligible!,
         if (reason != null) 'reason': reason!,
       };
@@ -1808,7 +1804,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (reason != null) 'reason': reason!,
         if (sliName != null) 'sliName': sliName!,
@@ -1905,7 +1901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eligibility != null) 'eligibility': eligibility!.toJson(),
         if (exclusions != null)
           'exclusions': exclusions!.map((value) => value.toJson()).toList(),
@@ -2006,13 +2002,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2034,7 +2029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (etag != null) 'etag': etag!,
@@ -2088,7 +2083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backups != null)
           'backups': backups!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2134,7 +2129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2164,7 +2159,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2193,7 +2188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -2237,32 +2232,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -2332,13 +2325,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2355,7 +2347,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (labels != null) 'labels': labels!,
@@ -2387,7 +2379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dailyCycle != null) 'dailyCycle': dailyCycle!.toJson(),
         if (weeklyCycle != null) 'weeklyCycle': weeklyCycle!.toJson(),
       };
@@ -2443,7 +2435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipAddresses != null) 'ipAddresses': ipAddresses!,
         if (modes != null) 'modes': modes!,
         if (network != null) 'network': network!,
@@ -2520,7 +2512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessMode != null) 'accessMode': accessMode!,
         if (anonGid != null) 'anonGid': anonGid!,
         if (anonUid != null) 'anonUid': anonUid!,
@@ -2583,29 +2575,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2681,7 +2671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (cancelRequested != null) 'cancelRequested': cancelRequested!,
         if (createTime != null) 'createTime': createTime!,
@@ -2716,7 +2706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileShare != null) 'fileShare': fileShare!,
         if (sourceBackup != null) 'sourceBackup': sourceBackup!,
       };
@@ -2759,7 +2749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (duration != null) 'duration': duration!,
         if (startTime != null) 'startTime': startTime!.toJson(),
@@ -2799,8 +2789,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2813,7 +2803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2865,7 +2855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
@@ -2914,7 +2904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channel != null) 'channel': channel!,
         if (denyMaintenancePeriods != null)
           'denyMaintenancePeriods':
@@ -2941,7 +2931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (schedule != null)
           'schedule': schedule!.map((value) => value.toJson()).toList(),
       };
diff --git a/generated/googleapis/lib/firebasedynamiclinks/v1.dart b/generated/googleapis/lib/firebasedynamiclinks/v1.dart
index b5a2b72..a7e88c9 100644
--- a/generated/googleapis/lib/firebasedynamiclinks/v1.dart
+++ b/generated/googleapis/lib/firebasedynamiclinks/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -309,7 +308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (googlePlayAnalytics != null)
           'googlePlayAnalytics': googlePlayAnalytics!.toJson(),
         if (itunesConnectAnalytics != null)
@@ -352,7 +351,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidFallbackLink != null)
           'androidFallbackLink': androidFallbackLink!,
         if (androidLink != null) 'androidLink': androidLink!,
@@ -416,7 +415,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dynamicLinkInfo != null)
           'dynamicLinkInfo': dynamicLinkInfo!.toJson(),
         if (longDynamicLink != null) 'longDynamicLink': longDynamicLink!,
@@ -459,7 +458,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (managedShortLink != null)
           'managedShortLink': managedShortLink!.toJson(),
         if (previewLink != null) 'previewLink': previewLink!,
@@ -511,7 +510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dynamicLinkInfo != null)
           'dynamicLinkInfo': dynamicLinkInfo!.toJson(),
         if (longDynamicLink != null) 'longDynamicLink': longDynamicLink!,
@@ -552,7 +551,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (previewLink != null) 'previewLink': previewLink!,
         if (shortLink != null) 'shortLink': shortLink!,
         if (warning != null)
@@ -573,7 +572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (desktopFallbackLink != null)
           'desktopFallbackLink': desktopFallbackLink!,
       };
@@ -633,7 +632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceModelName != null) 'deviceModelName': deviceModelName!,
         if (languageCode != null) 'languageCode': languageCode!,
         if (languageCodeFromWebview != null)
@@ -691,7 +690,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (event != null) 'event': event!,
         if (platform != null) 'platform': platform!,
@@ -792,7 +791,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyticsInfo != null) 'analyticsInfo': analyticsInfo!.toJson(),
         if (androidInfo != null) 'androidInfo': androidInfo!.toJson(),
         if (desktopInfo != null) 'desktopInfo': desktopInfo!.toJson(),
@@ -822,7 +821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (linkEventStats != null)
           'linkEventStats':
               linkEventStats!.map((value) => value.toJson()).toList(),
@@ -899,7 +898,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (warningCode != null) 'warningCode': warningCode!,
         if (warningDocumentLink != null)
           'warningDocumentLink': warningDocumentLink!,
@@ -995,7 +994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appInstallationTime != null)
           'appInstallationTime': appInstallationTime!,
         if (bundleId != null) 'bundleId': bundleId!,
@@ -1149,7 +1148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appMinimumVersion != null) 'appMinimumVersion': appMinimumVersion!,
         if (attributionConfidence != null)
           'attributionConfidence': attributionConfidence!,
@@ -1205,7 +1204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bundleId != null) 'bundleId': bundleId!,
         if (requestedLink != null) 'requestedLink': requestedLink!,
         if (sdkVersion != null) 'sdkVersion': sdkVersion!,
@@ -1281,7 +1280,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deepLink != null) 'deepLink': deepLink!,
         if (invitationId != null) 'invitationId': invitationId!,
         if (iosMinAppVersion != null) 'iosMinAppVersion': iosMinAppVersion!,
@@ -1346,7 +1345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gclid != null) 'gclid': gclid!,
         if (utmCampaign != null) 'utmCampaign': utmCampaign!,
         if (utmContent != null) 'utmContent': utmContent!,
@@ -1389,7 +1388,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (at != null) 'at': at!,
         if (ct != null) 'ct': ct!,
         if (mt != null) 'mt': mt!,
@@ -1449,7 +1448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iosAppStoreId != null) 'iosAppStoreId': iosAppStoreId!,
         if (iosBundleId != null) 'iosBundleId': iosBundleId!,
         if (iosCustomScheme != null) 'iosCustomScheme': iosCustomScheme!,
@@ -1518,7 +1517,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (flaggedAttribute != null) 'flaggedAttribute': flaggedAttribute!,
         if (info != null) 'info': info!.toJson(),
@@ -1542,7 +1541,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableForcedRedirect != null)
           'enableForcedRedirect': enableForcedRedirect!,
       };
@@ -1581,7 +1580,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (socialDescription != null) 'socialDescription': socialDescription!,
         if (socialImageLink != null) 'socialImageLink': socialImageLink!,
         if (socialTitle != null) 'socialTitle': socialTitle!,
@@ -1621,7 +1620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customSuffix != null) 'customSuffix': customSuffix!,
         if (option != null) 'option': option!,
       };
diff --git a/generated/googleapis/lib/firebasehosting/v1.dart b/generated/googleapis/lib/firebasehosting/v1.dart
index bf87beb..b4c69c4 100644
--- a/generated/googleapis/lib/firebasehosting/v1.dart
+++ b/generated/googleapis/lib/firebasehosting/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -215,7 +214,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -232,7 +231,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Operations.ListOperations.
@@ -257,7 +256,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -318,29 +317,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -382,8 +379,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -396,7 +393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/firebaseml/v1.dart b/generated/googleapis/lib/firebaseml/v1.dart
index b6533fc..6fb501e 100644
--- a/generated/googleapis/lib/firebaseml/v1.dart
+++ b/generated/googleapis/lib/firebaseml/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -213,7 +212,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -230,7 +229,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Operations.ListOperations.
@@ -255,7 +254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -286,7 +285,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicOperationStatus != null)
           'basicOperationStatus': basicOperationStatus!,
         if (name != null) 'name': name!,
@@ -347,29 +346,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -411,8 +408,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -425,7 +422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/firebaserules/v1.dart b/generated/googleapis/lib/firebaserules/v1.dart
index 4df0c48..f2b0eab 100644
--- a/generated/googleapis/lib/firebaserules/v1.dart
+++ b/generated/googleapis/lib/firebaserules/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -646,7 +645,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (anyValue != null) 'anyValue': anyValue!.toJson(),
         if (exactValue != null) 'exactValue': exactValue!,
       };
@@ -666,7 +665,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Describes where in a file an expression is found and what it was evaluated
@@ -702,7 +701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (children != null)
           'children': children!.map((value) => value.toJson()).toList(),
         if (sourcePosition != null) 'sourcePosition': sourcePosition!.toJson(),
@@ -743,7 +742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (name != null) 'name': name!,
@@ -775,7 +774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (args != null) 'args': args!,
         if (function != null) 'function': function!,
       };
@@ -823,7 +822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (args != null) 'args': args!.map((value) => value.toJson()).toList(),
         if (function != null) 'function': function!,
         if (result != null) 'result': result!.toJson(),
@@ -895,7 +894,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executable != null) 'executable': executable!,
         if (executableVersion != null) 'executableVersion': executableVersion!,
         if (language != null) 'language': language!,
@@ -938,7 +937,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (severity != null) 'severity': severity!,
         if (sourcePosition != null) 'sourcePosition': sourcePosition!.toJson(),
@@ -969,7 +968,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (releases != null)
           'releases': releases!.map((value) => value.toJson()).toList(),
@@ -1000,7 +999,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (rulesets != null)
           'rulesets': rulesets!.map((value) => value.toJson()).toList(),
@@ -1024,7 +1023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (services != null) 'services': services!,
       };
 }
@@ -1085,7 +1084,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (name != null) 'name': name!,
         if (rulesetName != null) 'rulesetName': rulesetName!,
@@ -1118,7 +1117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (undefined != null) 'undefined': undefined!.toJson(),
         if (value != null) 'value': value!,
       };
@@ -1165,7 +1164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (name != null) 'name': name!,
@@ -1189,7 +1188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (files != null)
           'files': files!.map((value) => value.toJson()).toList(),
       };
@@ -1237,7 +1236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (column != null) 'column': column!,
         if (currentOffset != null) 'currentOffset': currentOffset!,
         if (endOffset != null) 'endOffset': endOffset!,
@@ -1337,7 +1336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expectation != null) 'expectation': expectation!,
         if (expressionReportLevel != null)
           'expressionReportLevel': expressionReportLevel!,
@@ -1435,7 +1434,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugMessages != null) 'debugMessages': debugMessages!,
         if (errorPosition != null) 'errorPosition': errorPosition!.toJson(),
         if (expressionReports != null)
@@ -1474,7 +1473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (source != null) 'source': source!.toJson(),
         if (testSuite != null) 'testSuite': testSuite!.toJson(),
       };
@@ -1510,7 +1509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (issues != null)
           'issues': issues!.map((value) => value.toJson()).toList(),
         if (testResults != null)
@@ -1538,7 +1537,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (testCases != null)
           'testCases': testCases!.map((value) => value.toJson()).toList(),
       };
@@ -1564,7 +1563,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (release != null) 'release': release!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -1593,7 +1592,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (value != null) 'value': value!,
       };
@@ -1622,7 +1621,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sourcePosition != null) 'sourcePosition': sourcePosition!.toJson(),
         if (value != null) 'value': value!,
       };
diff --git a/generated/googleapis/lib/firestore/v1.dart b/generated/googleapis/lib/firestore/v1.dart
index 00d9379..8154f2d 100644
--- a/generated/googleapis/lib/firestore/v1.dart
+++ b/generated/googleapis/lib/firestore/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1649,7 +1648,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
       };
@@ -1716,7 +1715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documents != null) 'documents': documents!,
         if (mask != null) 'mask': mask!.toJson(),
         if (newTransaction != null) 'newTransaction': newTransaction!.toJson(),
@@ -1774,7 +1773,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (found != null) 'found': found!.toJson(),
         if (missing != null) 'missing': missing!,
         if (readTime != null) 'readTime': readTime!,
@@ -1798,13 +1797,12 @@
 
   BatchWriteRequest.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('writes')) {
       writes = (_json['writes'] as core.List)
@@ -1814,7 +1812,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (writes != null)
           'writes': writes!.map((value) => value.toJson()).toList(),
@@ -1850,7 +1848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null)
           'status': status!.map((value) => value.toJson()).toList(),
         if (writeResults != null)
@@ -1874,7 +1872,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -1899,7 +1897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transaction != null) 'transaction': transaction!,
       };
 }
@@ -1928,7 +1926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allDescendants != null) 'allDescendants': allDescendants!,
         if (collectionId != null) 'collectionId': collectionId!,
       };
@@ -1965,7 +1963,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transaction != null) 'transaction': transaction!,
         if (writes != null)
           'writes': writes!.map((value) => value.toJson()).toList(),
@@ -1999,7 +1997,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commitTime != null) 'commitTime': commitTime!,
         if (writeResults != null)
           'writeResults': writeResults!.map((value) => value.toJson()).toList(),
@@ -2034,7 +2032,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filters != null)
           'filters': filters!.map((value) => value.toJson()).toList(),
         if (op != null) 'op': op!,
@@ -2067,7 +2065,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (before != null) 'before': before!,
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
@@ -2126,14 +2124,12 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('fields')) {
-      fields = (_json['fields'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Value.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      fields = (_json['fields'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Value.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2143,7 +2139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (fields != null)
           'fields':
@@ -2190,7 +2186,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
         if (removedTargetIds != null) 'removedTargetIds': removedTargetIds!,
         if (targetIds != null) 'targetIds': targetIds!,
@@ -2230,7 +2226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!,
         if (readTime != null) 'readTime': readTime!,
         if (removedTargetIds != null) 'removedTargetIds': removedTargetIds!,
@@ -2258,7 +2254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldPaths != null) 'fieldPaths': fieldPaths!,
       };
 }
@@ -2298,7 +2294,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!,
         if (readTime != null) 'readTime': readTime!,
         if (removedTargetIds != null) 'removedTargetIds': removedTargetIds!,
@@ -2330,7 +2326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!,
         if (fieldTransforms != null)
           'fieldTransforms':
@@ -2358,7 +2354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documents != null) 'documents': documents!,
       };
 }
@@ -2377,7 +2373,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A digest of all the documents that match a given target.
@@ -2402,7 +2398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (targetId != null) 'targetId': targetId!,
       };
@@ -2462,7 +2458,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!.toJson(),
         if (op != null) 'op': op!,
         if (value != null) 'value': value!.toJson(),
@@ -2481,7 +2477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldPath != null) 'fieldPath': fieldPath!,
       };
 }
@@ -2591,7 +2587,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appendMissingElements != null)
           'appendMissingElements': appendMissingElements!.toJson(),
         if (fieldPath != null) 'fieldPath': fieldPath!,
@@ -2632,7 +2628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compositeFilter != null)
           'compositeFilter': compositeFilter!.toJson(),
         if (fieldFilter != null) 'fieldFilter': fieldFilter!.toJson(),
@@ -2709,7 +2705,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collectionIds != null) 'collectionIds': collectionIds!,
         if (endTime != null) 'endTime': endTime!,
         if (operationState != null) 'operationState': operationState!,
@@ -2753,7 +2749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collectionIds != null) 'collectionIds': collectionIds!,
         if (outputUriPrefix != null) 'outputUriPrefix': outputUriPrefix!,
       };
@@ -2775,7 +2771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputUriPrefix != null) 'outputUriPrefix': outputUriPrefix!,
       };
 }
@@ -2825,7 +2821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexConfig != null) 'indexConfig': indexConfig!.toJson(),
         if (name != null) 'name': name!,
       };
@@ -2905,7 +2901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (field != null) 'field': field!,
         if (indexConfigDeltas != null)
@@ -2988,7 +2984,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collectionIds != null) 'collectionIds': collectionIds!,
         if (endTime != null) 'endTime': endTime!,
         if (inputUriPrefix != null) 'inputUriPrefix': inputUriPrefix!,
@@ -3027,7 +3023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collectionIds != null) 'collectionIds': collectionIds!,
         if (inputUriPrefix != null) 'inputUriPrefix': inputUriPrefix!,
       };
@@ -3116,7 +3112,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -3175,7 +3171,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ancestorField != null) 'ancestorField': ancestorField!,
         if (indexes != null)
           'indexes': indexes!.map((value) => value.toJson()).toList(),
@@ -3210,7 +3206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changeType != null) 'changeType': changeType!,
         if (index != null) 'index': index!.toJson(),
       };
@@ -3256,7 +3252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arrayConfig != null) 'arrayConfig': arrayConfig!,
         if (fieldPath != null) 'fieldPath': fieldPath!,
         if (order != null) 'order': order!,
@@ -3327,7 +3323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (index != null) 'index': index!,
         if (progressBytes != null) 'progressBytes': progressBytes!.toJson(),
@@ -3363,7 +3359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3395,7 +3391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexes != null)
           'indexes': indexes!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3410,7 +3406,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Describes the progress of the operation.
@@ -3435,7 +3431,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completedWork != null) 'completedWork': completedWork!,
         if (estimatedWork != null) 'estimatedWork': estimatedWork!,
       };
@@ -3449,7 +3445,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Operations.ListOperations.
@@ -3475,7 +3471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -3536,29 +3532,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -3594,7 +3588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
@@ -3621,7 +3615,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
       };
@@ -3648,7 +3642,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collectionIds != null) 'collectionIds': collectionIds!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -3676,7 +3670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documents != null)
           'documents': documents!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3705,7 +3699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3731,20 +3725,19 @@
           _json['addTarget'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('removeTarget')) {
       removeTarget = _json['removeTarget'] as core.int;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addTarget != null) 'addTarget': addTarget!.toJson(),
         if (labels != null) 'labels': labels!,
         if (removeTarget != null) 'removeTarget': removeTarget!,
@@ -3798,7 +3791,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentChange != null) 'documentChange': documentChange!.toJson(),
         if (documentDelete != null) 'documentDelete': documentDelete!.toJson(),
         if (documentRemove != null) 'documentRemove': documentRemove!.toJson(),
@@ -3844,32 +3837,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -3892,18 +3883,16 @@
 
   MapValue.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
-      fields = (_json['fields'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Value.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      fields = (_json['fields'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Value.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields':
               fields!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -3936,7 +3925,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (direction != null) 'direction': direction!,
         if (field != null) 'field': field!.toJson(),
       };
@@ -3999,7 +3988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
         if (partitionCount != null) 'partitionCount': partitionCount!,
@@ -4044,7 +4033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (partitions != null)
           'partitions': partitions!.map((value) => value.toJson()).toList(),
@@ -4073,7 +4062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exists != null) 'exists': exists!,
         if (updateTime != null) 'updateTime': updateTime!,
       };
@@ -4098,7 +4087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
       };
@@ -4130,7 +4119,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parent != null) 'parent': parent!,
         if (structuredQuery != null)
           'structuredQuery': structuredQuery!.toJson(),
@@ -4152,7 +4141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (readTime != null) 'readTime': readTime!,
       };
 }
@@ -4177,7 +4166,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (retryTransaction != null) 'retryTransaction': retryTransaction!,
       };
 }
@@ -4204,7 +4193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transaction != null) 'transaction': transaction!,
       };
 }
@@ -4254,7 +4243,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newTransaction != null) 'newTransaction': newTransaction!.toJson(),
         if (readTime != null) 'readTime': readTime!,
         if (structuredQuery != null)
@@ -4315,7 +4304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
         if (readTime != null) 'readTime': readTime!,
         if (skippedResults != null) 'skippedResults': skippedResults!,
@@ -4356,8 +4345,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4370,7 +4359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4458,7 +4447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endAt != null) 'endAt': endAt!.toJson(),
         if (from != null) 'from': from!.map((value) => value.toJson()).toList(),
         if (limit != null) 'limit': limit!,
@@ -4529,7 +4518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documents != null) 'documents': documents!.toJson(),
         if (once != null) 'once': once!,
         if (query != null) 'query': query!.toJson(),
@@ -4613,7 +4602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cause != null) 'cause': cause!.toJson(),
         if (readTime != null) 'readTime': readTime!,
         if (resumeToken != null) 'resumeToken': resumeToken!,
@@ -4643,7 +4632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (readOnly != null) 'readOnly': readOnly!.toJson(),
         if (readWrite != null) 'readWrite': readWrite!.toJson(),
       };
@@ -4679,7 +4668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!.toJson(),
         if (op != null) 'op': op!,
       };
@@ -4786,7 +4775,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arrayValue != null) 'arrayValue': arrayValue!.toJson(),
         if (booleanValue != null) 'booleanValue': booleanValue!,
         if (bytesValue != null) 'bytesValue': bytesValue!,
@@ -4868,7 +4857,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentDocument != null)
           'currentDocument': currentDocument!.toJson(),
         if (delete != null) 'delete': delete!,
@@ -4928,13 +4917,12 @@
 
   WriteRequest.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('streamId')) {
       streamId = _json['streamId'] as core.String;
@@ -4950,7 +4938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (streamId != null) 'streamId': streamId!,
         if (streamToken != null) 'streamToken': streamToken!,
@@ -5010,7 +4998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commitTime != null) 'commitTime': commitTime!,
         if (streamId != null) 'streamId': streamId!,
         if (streamToken != null) 'streamToken': streamToken!,
@@ -5045,7 +5033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transformResults != null)
           'transformResults':
               transformResults!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/fitness/v1.dart b/generated/googleapis/lib/fitness/v1.dart
index 6bd3d05..c410691 100644
--- a/generated/googleapis/lib/fitness/v1.dart
+++ b/generated/googleapis/lib/fitness/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -977,7 +976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activity != null) 'activity': activity!,
         if (dataset != null)
           'dataset': dataset!.map((value) => value.toJson()).toList(),
@@ -1020,7 +1019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceId != null) 'dataSourceId': dataSourceId!,
         if (dataTypeName != null) 'dataTypeName': dataTypeName!,
       };
@@ -1121,7 +1120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregateBy != null)
           'aggregateBy': aggregateBy!.map((value) => value.toJson()).toList(),
         if (bucketByActivitySegment != null)
@@ -1153,7 +1152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucket != null)
           'bucket': bucket!.map((value) => value.toJson()).toList(),
       };
@@ -1202,7 +1201,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detailsUrl != null) 'detailsUrl': detailsUrl!,
         if (name != null) 'name': name!,
         if (packageName != null) 'packageName': packageName!,
@@ -1231,7 +1230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activityDataSourceId != null)
           'activityDataSourceId': activityDataSourceId!,
         if (minDurationMillis != null) 'minDurationMillis': minDurationMillis!,
@@ -1251,7 +1250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minDurationMillis != null) 'minDurationMillis': minDurationMillis!,
       };
 }
@@ -1277,7 +1276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (durationMillis != null) 'durationMillis': durationMillis!,
         if (period != null) 'period': period!.toJson(),
       };
@@ -1309,7 +1308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (timeZoneId != null) 'timeZoneId': timeZoneId!,
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
@@ -1401,7 +1400,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (computationTimeMillis != null)
           'computationTimeMillis': computationTimeMillis!,
         if (dataTypeName != null) 'dataTypeName': dataTypeName!,
@@ -1531,7 +1530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (application != null) 'application': application!.toJson(),
         if (dataQualityStandard != null)
           'dataQualityStandard': dataQualityStandard!,
@@ -1568,7 +1567,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null)
           'field': field!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -1614,7 +1613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (format != null) 'format': format!,
         if (name != null) 'name': name!,
         if (optional != null) 'optional': optional!,
@@ -1683,7 +1682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceId != null) 'dataSourceId': dataSourceId!,
         if (maxEndTimeNs != null) 'maxEndTimeNs': maxEndTimeNs!,
         if (minStartTimeNs != null) 'minStartTimeNs': minStartTimeNs!,
@@ -1754,7 +1753,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (manufacturer != null) 'manufacturer': manufacturer!,
         if (model != null) 'model': model!,
         if (type != null) 'type': type!,
@@ -1804,7 +1803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceId != null) 'dataSourceId': dataSourceId!,
         if (deletedDataPoint != null)
           'deletedDataPoint':
@@ -1831,7 +1830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSource != null)
           'dataSource': dataSource!.map((value) => value.toJson()).toList(),
       };
@@ -1881,7 +1880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deletedSession != null)
           'deletedSession':
               deletedSession!.map((value) => value.toJson()).toList(),
@@ -1908,7 +1907,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fpVal != null) 'fpVal': fpVal!,
       };
 }
@@ -1982,7 +1981,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeTimeMillis != null) 'activeTimeMillis': activeTimeMillis!,
         if (activityType != null) 'activityType': activityType!,
         if (application != null) 'application': application!.toJson(),
@@ -2046,7 +2045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fpVal != null) 'fpVal': fpVal!,
         if (intVal != null) 'intVal': intVal!,
         if (mapVal != null)
@@ -2071,7 +2070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!.toJson(),
       };
diff --git a/generated/googleapis/lib/games/v1.dart b/generated/googleapis/lib/games/v1.dart
index 88396cf..d609971 100644
--- a/generated/googleapis/lib/games/v1.dart
+++ b/generated/googleapis/lib/games/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1716,7 +1715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (achievementType != null) 'achievementType': achievementType!,
         if (description != null) 'description': description!,
         if (experiencePoints != null) 'experiencePoints': experiencePoints!,
@@ -1767,7 +1766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -1803,7 +1802,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentSteps != null) 'currentSteps': currentSteps!,
         if (kind != null) 'kind': kind!,
         if (newlyUnlocked != null) 'newlyUnlocked': newlyUnlocked!,
@@ -1837,7 +1836,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentState != null) 'currentState': currentState!,
         if (kind != null) 'kind': kind!,
       };
@@ -1872,7 +1871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentSteps != null) 'currentSteps': currentSteps!,
         if (kind != null) 'kind': kind!,
         if (newlyUnlocked != null) 'newlyUnlocked': newlyUnlocked!,
@@ -1901,7 +1900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (newlyUnlocked != null) 'newlyUnlocked': newlyUnlocked!,
       };
@@ -1932,7 +1931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (updates != null)
           'updates': updates!.map((value) => value.toJson()).toList(),
@@ -1965,7 +1964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (updatedAchievements != null)
           'updatedAchievements':
@@ -2024,7 +2023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (achievementId != null) 'achievementId': achievementId!,
         if (incrementPayload != null)
           'incrementPayload': incrementPayload!.toJson(),
@@ -2086,7 +2085,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (achievementId != null) 'achievementId': achievementId!,
         if (currentState != null) 'currentState': currentState!,
         if (currentSteps != null) 'currentSteps': currentSteps!,
@@ -2194,7 +2193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (achievementCount != null) 'achievement_count': achievementCount!,
         if (assets != null)
           'assets': assets!.map((value) => value.toJson()).toList(),
@@ -2241,7 +2240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (primary != null) 'primary': primary!,
         if (secondary != null) 'secondary': secondary!,
@@ -2278,7 +2277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternatePlayerId != null)
           'alternate_player_id': alternatePlayerId!,
         if (kind != null) 'kind': kind!,
@@ -2313,7 +2312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (experiencePoints != null) 'experiencePoints': experiencePoints!,
         if (kind != null) 'kind': kind!,
@@ -2350,7 +2349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -2371,7 +2370,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -2418,7 +2417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failureCause != null) 'failureCause': failureCause!,
         if (kind != null) 'kind': kind!,
         if (range != null) 'range': range!.toJson(),
@@ -2446,7 +2445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childId != null) 'childId': childId!,
         if (kind != null) 'kind': kind!,
       };
@@ -2518,7 +2517,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childEvents != null)
           'childEvents': childEvents!.map((value) => value.toJson()).toList(),
         if (description != null) 'description': description!,
@@ -2561,7 +2560,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -2598,7 +2597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (periodEndMillis != null) 'periodEndMillis': periodEndMillis!,
         if (periodStartMillis != null) 'periodStartMillis': periodStartMillis!,
@@ -2636,7 +2635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (timePeriod != null) 'timePeriod': timePeriod!.toJson(),
         if (updates != null)
@@ -2677,7 +2676,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventId != null) 'eventId': eventId!,
         if (failureCause != null) 'failureCause': failureCause!,
         if (kind != null) 'kind': kind!,
@@ -2721,7 +2720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentTimeMillis != null) 'currentTimeMillis': currentTimeMillis!,
         if (kind != null) 'kind': kind!,
         if (requestId != null) 'requestId': requestId!,
@@ -2757,7 +2756,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (definitionId != null) 'definitionId': definitionId!,
         if (kind != null) 'kind': kind!,
         if (updateCount != null) 'updateCount': updateCount!,
@@ -2807,7 +2806,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchFailures != null)
           'batchFailures':
               batchFailures!.map((value) => value.toJson()).toList(),
@@ -2847,7 +2846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (requestId != null) 'requestId': requestId!,
         if (steps != null) 'steps': steps!,
@@ -2875,7 +2874,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (steps != null) 'steps': steps!,
       };
@@ -2920,7 +2919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -3000,7 +2999,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acquisitionUri != null) 'acquisitionUri': acquisitionUri!,
         if (androidInstance != null)
           'androidInstance': androidInstance!.toJson(),
@@ -3047,7 +3046,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enablePiracyCheck != null) 'enablePiracyCheck': enablePiracyCheck!,
         if (kind != null) 'kind': kind!,
         if (packageName != null) 'packageName': packageName!,
@@ -3108,7 +3107,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bundleIdentifier != null) 'bundleIdentifier': bundleIdentifier!,
         if (itunesAppId != null) 'itunesAppId': itunesAppId!,
         if (kind != null) 'kind': kind!,
@@ -3147,7 +3146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (launchUrl != null) 'launchUrl': launchUrl!,
         if (preferred != null) 'preferred': preferred!,
@@ -3206,7 +3205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iconUrl != null) 'iconUrl': iconUrl!,
         if (id != null) 'id': id!,
         if (isIconUrlDefault != null) 'isIconUrlDefault': isIconUrlDefault!,
@@ -3289,7 +3288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedScore != null) 'formattedScore': formattedScore!,
         if (formattedScoreRank != null)
           'formattedScoreRank': formattedScoreRank!,
@@ -3334,7 +3333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3381,7 +3380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedNumScores != null)
           'formattedNumScores': formattedNumScores!,
         if (formattedRank != null) 'formattedRank': formattedRank!,
@@ -3445,7 +3444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3488,7 +3487,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentVersion != null) 'currentVersion': currentVersion!,
         if (kind != null) 'kind': kind!,
         if (playerLevels != null)
@@ -3519,7 +3518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (familyName != null) 'familyName': familyName!,
         if (givenName != null) 'givenName': givenName!,
       };
@@ -3623,7 +3622,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (avatarImageUrl != null) 'avatarImageUrl': avatarImageUrl!,
         if (bannerUrlLandscape != null)
           'bannerUrlLandscape': bannerUrlLandscape!,
@@ -3702,7 +3701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (achievementState != null) 'achievementState': achievementState!,
         if (currentSteps != null) 'currentSteps': currentSteps!,
         if (experiencePoints != null) 'experiencePoints': experiencePoints!,
@@ -3745,7 +3744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3795,7 +3794,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (definitionId != null) 'definitionId': definitionId!,
         if (formattedNumEvents != null)
           'formattedNumEvents': formattedNumEvents!,
@@ -3835,7 +3834,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3889,7 +3888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentExperiencePoints != null)
           'currentExperiencePoints': currentExperiencePoints!,
         if (currentLevel != null) 'currentLevel': currentLevel!.toJson(),
@@ -3984,7 +3983,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (friendsRank != null) 'friendsRank': friendsRank!.toJson(),
         if (kind != null) 'kind': kind!,
         if (leaderboardId != null) 'leaderboard_id': leaderboardId!,
@@ -4037,7 +4036,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -4079,7 +4078,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (level != null) 'level': level!,
         if (maxExperiencePoints != null)
@@ -4119,7 +4118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -4174,7 +4173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedScore != null) 'formattedScore': formattedScore!,
         if (kind != null) 'kind': kind!,
         if (score != null) 'score': score!,
@@ -4207,7 +4206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (submittedScores != null)
           'submittedScores':
@@ -4273,7 +4272,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (beatenScoreTimeSpans != null)
           'beatenScoreTimeSpans': beatenScoreTimeSpans!,
         if (formattedScore != null) 'formattedScore': formattedScore!,
@@ -4310,7 +4309,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (scores != null)
           'scores': scores!.map((value) => value.toJson()).toList(),
@@ -4354,7 +4353,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (friendsListVisibility != null)
           'friendsListVisibility': friendsListVisibility!,
         if (kind != null) 'kind': kind!,
@@ -4404,7 +4403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxConflictsPerSnapshot != null)
           'maxConflictsPerSnapshot': maxConflictsPerSnapshot!,
         if (resolutionPolicy != null) 'resolutionPolicy': resolutionPolicy!,
@@ -4425,7 +4424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (snapshot != null) 'snapshot': snapshot!.toJson(),
       };
 }
@@ -4465,7 +4464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (kind != null) 'kind': kind!,
         if (revisionStatus != null) 'revisionStatus': revisionStatus!,
@@ -4515,7 +4514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (leaderboardId != null) 'leaderboardId': leaderboardId!,
         if (score != null) 'score': score!,
@@ -4610,7 +4609,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coverImage != null) 'coverImage': coverImage!.toJson(),
         if (description != null) 'description': description!,
         if (driveId != null) 'driveId': driveId!,
@@ -4694,7 +4693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentHash != null) 'contentHash': contentHash!,
         if (downloadUrl != null) 'downloadUrl': downloadUrl!,
         if (height != null) 'height': height!,
@@ -4760,7 +4759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentHash != null) 'contentHash': contentHash!,
         if (downloadUrl != null) 'downloadUrl': downloadUrl!,
         if (resourceId != null) 'resourceId': resourceId!,
@@ -4825,7 +4824,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conflictingRevisions != null)
           'conflictingRevisions':
               conflictingRevisions!.map((value) => value.toJson()).toList(),
@@ -4877,7 +4876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (kind != null) 'kind': kind!,
         if (mimeType != null) 'mime_type': mimeType!,
@@ -4918,7 +4917,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -4974,7 +4973,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (deviceName != null) 'deviceName': deviceName!,
         if (gameplayDuration != null) 'gameplayDuration': gameplayDuration!,
@@ -5021,7 +5020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blob != null) 'blob': blob!.toJson(),
         if (coverImage != null) 'coverImage': coverImage!.toJson(),
         if (id != null) 'id': id!,
@@ -5141,7 +5140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (avgSessionLengthMinutes != null)
           'avg_session_length_minutes': avgSessionLengthMinutes!,
         if (churnProbability != null) 'churn_probability': churnProbability!,
diff --git a/generated/googleapis/lib/gamesconfiguration/v1configuration.dart b/generated/googleapis/lib/gamesconfiguration/v1configuration.dart
index 99c67c8..8fce438 100644
--- a/generated/googleapis/lib/gamesconfiguration/v1configuration.dart
+++ b/generated/googleapis/lib/gamesconfiguration/v1configuration.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -621,7 +620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (achievementType != null) 'achievementType': achievementType!,
         if (draft != null) 'draft': draft!.toJson(),
         if (id != null) 'id': id!,
@@ -685,7 +684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!.toJson(),
         if (iconUrl != null) 'iconUrl': iconUrl!,
         if (kind != null) 'kind': kind!,
@@ -727,7 +726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -792,7 +791,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (few != null) 'few': few!.toJson(),
         if (many != null) 'many': many!.toJson(),
         if (one != null) 'one': one!.toJson(),
@@ -848,7 +847,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (numDecimalPlaces != null) 'numDecimalPlaces': numDecimalPlaces!,
         if (numberFormatType != null) 'numberFormatType': numberFormatType!,
@@ -893,7 +892,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageType != null) 'imageType': imageType!,
         if (kind != null) 'kind': kind!,
         if (resourceId != null) 'resourceId': resourceId!,
@@ -965,7 +964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (draft != null) 'draft': draft!.toJson(),
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -1023,7 +1022,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iconUrl != null) 'iconUrl': iconUrl!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!.toJson(),
@@ -1064,7 +1063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -1099,7 +1098,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (locale != null) 'locale': locale!,
         if (value != null) 'value': value!,
@@ -1131,7 +1130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (translations != null)
           'translations': translations!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/gameservices/v1.dart b/generated/googleapis/lib/gameservices/v1.dart
index d537dfd..f821832 100644
--- a/generated/googleapis/lib/gameservices/v1.dart
+++ b/generated/googleapis/lib/gameservices/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1925,7 +1924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1972,7 +1971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (ignoreChildExemptions != null)
           'ignoreChildExemptions': ignoreChildExemptions!,
@@ -1999,7 +1998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissionType != null) 'permissionType': permissionType!,
       };
 }
@@ -2075,7 +2074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindingId != null) 'bindingId': bindingId!,
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
@@ -2091,7 +2090,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Write a Cloud Audit log
@@ -2119,7 +2118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorizationLoggingOptions != null)
           'authorizationLoggingOptions': authorizationLoggingOptions!.toJson(),
         if (logName != null) 'logName': logName!,
@@ -2222,7 +2221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iam != null) 'iam': iam!,
         if (op != null) 'op': op!,
         if (svc != null) 'svc': svc!,
@@ -2273,7 +2272,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customFields != null)
           'customFields': customFields!.map((value) => value.toJson()).toList(),
         if (field != null) 'field': field!,
@@ -2306,7 +2305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -2338,7 +2337,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logMode != null) 'logMode': logMode!,
       };
 }
@@ -2366,7 +2365,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cluster != null) 'cluster': cluster!,
         if (fleetDetails != null)
           'fleetDetails': fleetDetails!.map((value) => value.toJson()).toList(),
@@ -2410,7 +2409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fleet != null) 'fleet': fleet!,
         if (fleetSpec != null) 'fleetSpec': fleetSpec!,
         if (specSource != null) 'specSource': specSource!.toJson(),
@@ -2446,7 +2445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscaler != null) 'autoscaler': autoscaler!,
         if (fleetAutoscalerSpec != null)
           'fleetAutoscalerSpec': fleetAutoscalerSpec!,
@@ -2475,7 +2474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployedAutoscaler != null)
           'deployedAutoscaler': deployedAutoscaler!.toJson(),
         if (deployedFleet != null) 'deployedFleet': deployedFleet!.toJson(),
@@ -2517,7 +2516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allocatedReplicas != null) 'allocatedReplicas': allocatedReplicas!,
         if (readyReplicas != null) 'readyReplicas': readyReplicas!,
         if (replicas != null) 'replicas': replicas!,
@@ -2539,7 +2538,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -2603,7 +2602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2619,7 +2618,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for GameServerDeploymentsService.FetchDeploymentState.
@@ -2646,7 +2645,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterState != null)
           'clusterState': clusterState!.map((value) => value.toJson()).toList(),
         if (unavailable != null) 'unavailable': unavailable!,
@@ -2674,7 +2673,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fleetSpec != null) 'fleetSpec': fleetSpec!,
         if (name != null) 'name': name!,
       };
@@ -2734,13 +2733,12 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2750,7 +2748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectionInfo != null) 'connectionInfo': connectionInfo!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
@@ -2784,7 +2782,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gkeClusterReference != null)
           'gkeClusterReference': gkeClusterReference!.toJson(),
         if (namespace != null) 'namespace': namespace!,
@@ -2842,13 +2840,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2864,7 +2861,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (fleetConfigs != null)
@@ -2898,7 +2895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configVersion != null) 'configVersion': configVersion!,
         if (realmsSelector != null) 'realmsSelector': realmsSelector!.toJson(),
       };
@@ -2947,13 +2944,12 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2963,7 +2959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (etag != null) 'etag': etag!,
@@ -3038,7 +3034,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (defaultGameServerConfig != null)
           'defaultGameServerConfig': defaultGameServerConfig!,
@@ -3070,7 +3066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cluster != null) 'cluster': cluster!,
       };
 }
@@ -3084,17 +3080,16 @@
 
   LabelSelector.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
       };
 }
@@ -3130,7 +3125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gameServerClusters != null)
           'gameServerClusters':
               gameServerClusters!.map((value) => value.toJson()).toList(),
@@ -3170,7 +3165,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gameServerConfigs != null)
           'gameServerConfigs':
               gameServerConfigs!.map((value) => value.toJson()).toList(),
@@ -3210,7 +3205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gameServerDeployments != null)
           'gameServerDeployments':
               gameServerDeployments!.map((value) => value.toJson()).toList(),
@@ -3241,7 +3236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3270,7 +3265,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -3308,7 +3303,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (realms != null)
           'realms': realms!.map((value) => value.toJson()).toList(),
@@ -3353,32 +3348,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -3415,7 +3408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudAudit != null) 'cloudAudit': cloudAudit!.toJson(),
         if (counter != null) 'counter': counter!.toJson(),
         if (dataAccess != null) 'dataAccess': dataAccess!.toJson(),
@@ -3476,29 +3469,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -3575,15 +3566,13 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('operationStatus')) {
-      operationStatus = (_json['operationStatus'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              OperationStatus.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      operationStatus =
+          (_json['operationStatus'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          OperationStatus.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('requestedCancellation')) {
       requestedCancellation = _json['requestedCancellation'] as core.bool;
@@ -3604,7 +3593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -3651,7 +3640,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (errorCode != null) 'errorCode': errorCode!,
         if (errorMessage != null) 'errorMessage': errorMessage!,
@@ -3783,7 +3772,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -3817,7 +3806,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (targetState != null) 'targetState': targetState!.toJson(),
       };
@@ -3844,7 +3833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (targetState != null) 'targetState': targetState!.toJson(),
       };
@@ -3880,7 +3869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (targetState != null) 'targetState': targetState!.toJson(),
         if (unavailable != null) 'unavailable': unavailable!,
@@ -3907,7 +3896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (targetState != null) 'targetState': targetState!.toJson(),
       };
@@ -3934,7 +3923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (targetState != null) 'targetState': targetState!.toJson(),
       };
@@ -3990,13 +3979,12 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4009,7 +3997,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (etag != null) 'etag': etag!,
@@ -4035,7 +4023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (realms != null) 'realms': realms!,
       };
 }
@@ -4121,7 +4109,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
@@ -4181,7 +4169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fleetAutoscalerSpec != null)
           'fleetAutoscalerSpec': fleetAutoscalerSpec!,
         if (name != null) 'name': name!,
@@ -4236,7 +4224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cronJobDuration != null) 'cronJobDuration': cronJobDuration!,
         if (cronSpec != null) 'cronSpec': cronSpec!,
         if (endTime != null) 'endTime': endTime!,
@@ -4271,7 +4259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -4300,7 +4288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gameServerConfigName != null)
           'gameServerConfigName': gameServerConfigName!,
         if (name != null) 'name': name!,
@@ -4340,8 +4328,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4354,7 +4342,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4396,7 +4384,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fleetDetails != null)
           'fleetDetails': fleetDetails!.map((value) => value.toJson()).toList(),
         if (gameServerClusterName != null)
@@ -4428,7 +4416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (specSource != null) 'specSource': specSource!.toJson(),
       };
@@ -4456,7 +4444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (specSource != null) 'specSource': specSource!.toJson(),
       };
@@ -4483,7 +4471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscaler != null) 'autoscaler': autoscaler!.toJson(),
         if (fleet != null) 'fleet': fleet!.toJson(),
       };
@@ -4505,7 +4493,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null)
           'details': details!.map((value) => value.toJson()).toList(),
       };
@@ -4530,7 +4518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4551,7 +4539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
diff --git a/generated/googleapis/lib/gamesmanagement/v1management.dart b/generated/googleapis/lib/gamesmanagement/v1management.dart
index a2d347e..cd860b5 100644
--- a/generated/googleapis/lib/gamesmanagement/v1management.dart
+++ b/generated/googleapis/lib/gamesmanagement/v1management.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -792,7 +791,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
@@ -822,7 +821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (achievementIds != null) 'achievement_ids': achievementIds!,
         if (kind != null) 'kind': kind!,
       };
@@ -866,7 +865,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentState != null) 'currentState': currentState!,
         if (definitionId != null) 'definitionId': definitionId!,
         if (kind != null) 'kind': kind!,
@@ -898,7 +897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventIds != null) 'event_ids': eventIds!,
         if (kind != null) 'kind': kind!,
       };
@@ -942,7 +941,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentExperiencePoints != null)
           'currentExperiencePoints': currentExperiencePoints!,
         if (currentLevel != null) 'currentLevel': currentLevel!.toJson(),
@@ -977,7 +976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (level != null) 'level': level!,
         if (maxExperiencePoints != null)
           'maxExperiencePoints': maxExperiencePoints!,
@@ -1020,7 +1019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hiddenTimeMillis != null) 'hiddenTimeMillis': hiddenTimeMillis!,
         if (kind != null) 'kind': kind!,
         if (player != null) 'player': player!.toJson(),
@@ -1057,7 +1056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -1090,7 +1089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (familyName != null) 'familyName': familyName!,
         if (givenName != null) 'givenName': givenName!,
       };
@@ -1184,7 +1183,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (avatarImageUrl != null) 'avatarImageUrl': avatarImageUrl!,
         if (bannerUrlLandscape != null)
           'bannerUrlLandscape': bannerUrlLandscape!,
@@ -1227,7 +1226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
@@ -1268,7 +1267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (definitionId != null) 'definitionId': definitionId!,
         if (kind != null) 'kind': kind!,
         if (resetScoreTimeSpans != null)
@@ -1295,7 +1294,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (profileVisible != null) 'profileVisible': profileVisible!,
       };
@@ -1324,7 +1323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (leaderboardIds != null) 'leaderboard_ids': leaderboardIds!,
       };
diff --git a/generated/googleapis/lib/genomics/v1.dart b/generated/googleapis/lib/genomics/v1.dart
index d3b144c..635538c 100644
--- a/generated/googleapis/lib/genomics/v1.dart
+++ b/generated/googleapis/lib/genomics/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -229,7 +228,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Describes a Compute Engine resource that is being managed by a running
@@ -266,7 +265,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (diskNames != null) 'diskNames': diskNames!,
         if (instanceName != null) 'instanceName': instanceName!,
         if (machineType != null) 'machineType': machineType!,
@@ -290,7 +289,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionId != null) 'actionId': actionId!,
       };
 }
@@ -324,16 +323,16 @@
     }
     if (_json.containsKey('portMappings')) {
       portMappings =
-          (_json['portMappings'] as core.Map).cast<core.String, core.int>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.int,
-                ),
-              );
+          (_json['portMappings'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.int,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionId != null) 'actionId': actionId!,
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (portMappings != null) 'portMappings': portMappings!,
@@ -372,7 +371,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionId != null) 'actionId': actionId!,
         if (exitStatus != null) 'exitStatus': exitStatus!,
         if (stderr != null) 'stderr': stderr!,
@@ -409,7 +408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cause != null) 'cause': cause!,
         if (metrics != null) 'metrics': metrics!,
       };
@@ -429,7 +428,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Carries information about events that occur during pipeline execution.
@@ -456,20 +455,19 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('details')) {
-      details =
-          (_json['details'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      details = (_json['details'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('timestamp')) {
       timestamp = _json['timestamp'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (details != null) 'details': details!,
         if (timestamp != null) 'timestamp': timestamp!,
@@ -577,7 +575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cause != null) 'cause': cause!,
         if (code != null) 'code': code!,
       };
@@ -605,7 +603,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -655,29 +653,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -714,7 +710,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
@@ -786,42 +782,39 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('request')) {
-      request =
-          (_json['request'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      request = (_json['request'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('runtimeMetadata')) {
-      runtimeMetadata = (_json['runtimeMetadata'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      runtimeMetadata =
+          (_json['runtimeMetadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientId != null) 'clientId': clientId!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -848,7 +841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageUri != null) 'imageUri': imageUri!,
       };
 }
@@ -866,7 +859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageUri != null) 'imageUri': imageUri!,
       };
 }
@@ -880,7 +873,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Runtime metadata that will be populated in the runtimeMetadata field of the
@@ -898,7 +891,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (computeEngine != null) 'computeEngine': computeEngine!.toJson(),
       };
 }
@@ -936,8 +929,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -950,7 +943,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -980,7 +973,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionId != null) 'actionId': actionId!,
         if (exitStatus != null) 'exitStatus': exitStatus!,
       };
@@ -1011,7 +1004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!,
         if (machineType != null) 'machineType': machineType!,
         if (zone != null) 'zone': zone!,
@@ -1038,7 +1031,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!,
         if (zone != null) 'zone': zone!,
       };
diff --git a/generated/googleapis/lib/gmail/v1.dart b/generated/googleapis/lib/gmail/v1.dart
index 6fd1944..d21bac5 100644
--- a/generated/googleapis/lib/gmail/v1.dart
+++ b/generated/googleapis/lib/gmail/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3504,7 +3503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disposition != null) 'disposition': disposition!,
         if (emailAddress != null) 'emailAddress': emailAddress!,
         if (enabled != null) 'enabled': enabled!,
@@ -3525,7 +3524,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ids != null) 'ids': ids!,
       };
 }
@@ -3562,7 +3561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addLabelIds != null) 'addLabelIds': addLabelIds!,
         if (ids != null) 'ids': ids!,
         if (removeLabelIds != null) 'removeLabelIds': removeLabelIds!,
@@ -3604,7 +3603,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delegateEmail != null) 'delegateEmail': delegateEmail!,
         if (verificationStatus != null)
           'verificationStatus': verificationStatus!,
@@ -3631,7 +3630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (message != null) 'message': message!.toJson(),
       };
@@ -3666,7 +3665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!.toJson(),
         if (criteria != null) 'criteria': criteria!.toJson(),
         if (id != null) 'id': id!,
@@ -3702,7 +3701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addLabelIds != null) 'addLabelIds': addLabelIds!,
         if (forward != null) 'forward': forward!,
         if (removeLabelIds != null) 'removeLabelIds': removeLabelIds!,
@@ -3788,7 +3787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludeChats != null) 'excludeChats': excludeChats!,
         if (from != null) 'from': from!,
         if (hasAttachment != null) 'hasAttachment': hasAttachment!,
@@ -3827,7 +3826,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (forwardingEmail != null) 'forwardingEmail': forwardingEmail!,
         if (verificationStatus != null)
           'verificationStatus': verificationStatus!,
@@ -3898,7 +3897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (labelsAdded != null)
           'labelsAdded': labelsAdded!.map((value) => value.toJson()).toList(),
@@ -3935,7 +3934,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelIds != null) 'labelIds': labelIds!,
         if (message != null) 'message': message!.toJson(),
       };
@@ -3960,7 +3959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelIds != null) 'labelIds': labelIds!,
         if (message != null) 'message': message!.toJson(),
       };
@@ -3978,7 +3977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (message != null) 'message': message!.toJson(),
       };
 }
@@ -3995,7 +3994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (message != null) 'message': message!.toJson(),
       };
 }
@@ -4046,7 +4045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoExpunge != null) 'autoExpunge': autoExpunge!,
         if (enabled != null) 'enabled': enabled!,
         if (expungeBehavior != null) 'expungeBehavior': expungeBehavior!,
@@ -4146,7 +4145,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (id != null) 'id': id!,
         if (labelListVisibility != null)
@@ -4212,7 +4211,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null) 'backgroundColor': backgroundColor!,
         if (textColor != null) 'textColor': textColor!,
       };
@@ -4245,7 +4244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayLanguage != null) 'displayLanguage': displayLanguage!,
       };
 }
@@ -4268,7 +4267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delegates != null)
           'delegates': delegates!.map((value) => value.toJson()).toList(),
       };
@@ -4305,7 +4304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (drafts != null)
           'drafts': drafts!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4330,7 +4329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null)
           'filter': filter!.map((value) => value.toJson()).toList(),
       };
@@ -4352,7 +4351,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (forwardingAddresses != null)
           'forwardingAddresses':
               forwardingAddresses!.map((value) => value.toJson()).toList(),
@@ -4389,7 +4388,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (history != null)
           'history': history!.map((value) => value.toJson()).toList(),
         if (historyId != null) 'historyId': historyId!,
@@ -4416,7 +4415,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null)
           'labels': labels!.map((value) => value.toJson()).toList(),
       };
@@ -4452,7 +4451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (messages != null)
           'messages': messages!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4477,7 +4476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sendAs != null)
           'sendAs': sendAs!.map((value) => value.toJson()).toList(),
       };
@@ -4498,7 +4497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (smimeInfo != null)
           'smimeInfo': smimeInfo!.map((value) => value.toJson()).toList(),
       };
@@ -4535,7 +4534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resultSizeEstimate != null)
           'resultSizeEstimate': resultSizeEstimate!,
@@ -4631,7 +4630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (historyId != null) 'historyId': historyId!,
         if (id != null) 'id': id!,
         if (internalDate != null) 'internalDate': internalDate!,
@@ -4705,7 +4704,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!.toJson(),
         if (filename != null) 'filename': filename!,
         if (headers != null)
@@ -4756,7 +4755,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachmentId != null) 'attachmentId': attachmentId!,
         if (data != null) 'data': data!,
         if (size != null) 'size': size!,
@@ -4785,7 +4784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -4813,7 +4812,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addLabelIds != null) 'addLabelIds': addLabelIds!,
         if (removeLabelIds != null) 'removeLabelIds': removeLabelIds!,
       };
@@ -4841,7 +4840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addLabelIds != null) 'addLabelIds': addLabelIds!,
         if (removeLabelIds != null) 'removeLabelIds': removeLabelIds!,
       };
@@ -4880,7 +4879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessWindow != null) 'accessWindow': accessWindow!,
         if (disposition != null) 'disposition': disposition!,
       };
@@ -4917,7 +4916,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emailAddress != null) 'emailAddress': emailAddress!,
         if (historyId != null) 'historyId': historyId!,
         if (messagesTotal != null) 'messagesTotal': messagesTotal!,
@@ -5029,7 +5028,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (isDefault != null) 'isDefault': isDefault!,
         if (isPrimary != null) 'isPrimary': isPrimary!,
@@ -5108,7 +5107,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encryptedKeyPassword != null)
           'encryptedKeyPassword': encryptedKeyPassword!,
         if (expiration != null) 'expiration': expiration!,
@@ -5177,7 +5176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (password != null) 'password': password!,
         if (port != null) 'port': port!,
@@ -5220,7 +5219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (historyId != null) 'historyId': historyId!,
         if (id != null) 'id': id!,
         if (messages != null)
@@ -5309,7 +5308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableAutoReply != null) 'enableAutoReply': enableAutoReply!,
         if (endTime != null) 'endTime': endTime!,
         if (responseBodyHtml != null) 'responseBodyHtml': responseBodyHtml!,
@@ -5367,7 +5366,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelFilterAction != null) 'labelFilterAction': labelFilterAction!,
         if (labelIds != null) 'labelIds': labelIds!,
         if (topicName != null) 'topicName': topicName!,
@@ -5396,7 +5395,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expiration != null) 'expiration': expiration!,
         if (historyId != null) 'historyId': historyId!,
       };
diff --git a/generated/googleapis/lib/gmailpostmastertools/v1.dart b/generated/googleapis/lib/gmailpostmastertools/v1.dart
index a61c4d6..161dfb5 100644
--- a/generated/googleapis/lib/gmailpostmastertools/v1.dart
+++ b/generated/googleapis/lib/gmailpostmastertools/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -344,7 +343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorClass != null) 'errorClass': errorClass!,
         if (errorRatio != null) 'errorRatio': errorRatio!,
         if (errorType != null) 'errorType': errorType!,
@@ -392,7 +391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (name != null) 'name': name!,
         if (permission != null) 'permission': permission!,
@@ -420,7 +419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (spamRatio != null) 'spamRatio': spamRatio!,
       };
@@ -473,7 +472,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCount != null) 'ipCount': ipCount!,
         if (reputation != null) 'reputation': reputation!,
         if (sampleIps != null) 'sampleIps': sampleIps!,
@@ -503,7 +502,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domains != null)
           'domains': domains!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -533,7 +532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (trafficStats != null)
           'trafficStats': trafficStats!.map((value) => value.toJson()).toList(),
@@ -676,7 +675,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deliveryErrors != null)
           'deliveryErrors':
               deliveryErrors!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/groupsmigration/v1.dart b/generated/googleapis/lib/groupsmigration/v1.dart
index 29c324f..4ce7163 100644
--- a/generated/googleapis/lib/groupsmigration/v1.dart
+++ b/generated/googleapis/lib/groupsmigration/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -136,7 +135,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (responseCode != null) 'responseCode': responseCode!,
       };
diff --git a/generated/googleapis/lib/groupssettings/v1.dart b/generated/googleapis/lib/groupssettings/v1.dart
index 9259107..e07d005 100644
--- a/generated/googleapis/lib/groupssettings/v1.dart
+++ b/generated/googleapis/lib/groupssettings/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1020,7 +1019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowExternalMembers != null)
           'allowExternalMembers': allowExternalMembers!,
         if (allowGoogleCommunication != null)
diff --git a/generated/googleapis/lib/healthcare/v1.dart b/generated/googleapis/lib/healthcare/v1.dart
index d629850..526450f 100644
--- a/generated/googleapis/lib/healthcare/v1.dart
+++ b/generated/googleapis/lib/healthcare/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -4957,7 +4956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -4999,7 +4998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -5071,7 +5070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -5086,7 +5085,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Mask a string by replacing its characters with a fixed character.
@@ -5104,7 +5103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maskingCharacter != null) 'maskingCharacter': maskingCharacter!,
       };
 }
@@ -5123,7 +5122,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (message != null) 'message': message!.toJson(),
       };
 }
@@ -5154,7 +5153,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cryptoKey != null) 'cryptoKey': cryptoKey!,
       };
 }
@@ -5187,7 +5186,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (timeZone != null) 'timeZone': timeZone!,
       };
@@ -5217,7 +5216,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cryptoKey != null) 'cryptoKey': cryptoKey!,
       };
 }
@@ -5263,7 +5262,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dicom != null) 'dicom': dicom!.toJson(),
         if (fhir != null) 'fhir': fhir!.toJson(),
         if (image != null) 'image': image!.toJson(),
@@ -5295,7 +5294,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (destinationDataset != null)
           'destinationDataset': destinationDataset!,
@@ -5337,7 +5336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (destinationStore != null) 'destinationStore': destinationStore!,
         if (filterConfig != null) 'filterConfig': filterConfig!.toJson(),
@@ -5381,7 +5380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (destinationStore != null) 'destinationStore': destinationStore!,
         if (resourceFilter != null) 'resourceFilter': resourceFilter!.toJson(),
@@ -5396,7 +5395,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Specifies the parameters needed for de-identification of DICOM stores.
@@ -5458,7 +5457,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filterProfile != null) 'filterProfile': filterProfile!,
         if (keepList != null) 'keepList': keepList!.toJson(),
         if (removeList != null) 'removeList': removeList!.toJson(),
@@ -5488,7 +5487,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourcePathsGcsUri != null)
           'resourcePathsGcsUri': resourcePathsGcsUri!,
       };
@@ -5520,13 +5519,12 @@
 
   DicomStore.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5537,7 +5535,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (name != null) 'name': name!,
         if (notificationConfig != null)
@@ -5559,7 +5557,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Exports data from the specified DICOM store.
@@ -5598,7 +5596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigqueryDestination != null)
           'bigqueryDestination': bigqueryDestination!.toJson(),
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
@@ -5613,7 +5611,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to export resources.
@@ -5649,7 +5647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigqueryDestination != null)
           'bigqueryDestination': bigqueryDestination!.toJson(),
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
@@ -5667,7 +5665,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -5731,7 +5729,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -5758,7 +5756,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldMetadataList != null)
           'fieldMetadataList':
               fieldMetadataList!.map((value) => value.toJson()).toList(),
@@ -5782,7 +5780,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resources != null) 'resources': resources!.toJson(),
       };
 }
@@ -5899,13 +5897,12 @@
       enableUpdateCreate = _json['enableUpdateCreate'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5925,7 +5922,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableReferentialIntegrity != null)
           'disableReferentialIntegrity': disableReferentialIntegrity!,
         if (disableResourceVersioning != null)
@@ -5979,7 +5976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (paths != null) 'paths': paths!,
       };
@@ -5993,7 +5990,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Contains a summary of the DeidentifyFhirStore operation.
@@ -6004,7 +6001,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The BigQuery table where the server writes the output.
@@ -6031,7 +6028,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (force != null) 'force': force!,
         if (tableUri != null) 'tableUri': tableUri!,
       };
@@ -6085,7 +6082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mimeType != null) 'mimeType': mimeType!,
         if (uriPrefix != null) 'uriPrefix': uriPrefix!,
       };
@@ -6116,7 +6113,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -6171,7 +6168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetUri != null) 'datasetUri': datasetUri!,
         if (force != null) 'force': force!,
         if (schemaConfig != null) 'schemaConfig': schemaConfig!.toJson(),
@@ -6197,7 +6194,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uriPrefix != null) 'uriPrefix': uriPrefix!,
       };
 }
@@ -6227,7 +6224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -6306,7 +6303,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
         if (pubsubTopic != null) 'pubsubTopic': pubsubTopic!,
       };
@@ -6358,13 +6355,12 @@
 
   Hl7V2Store.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -6385,7 +6381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (name != null) 'name': name!,
         if (notificationConfigs != null)
@@ -6448,8 +6444,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -6459,7 +6455,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (data != null) 'data': data!,
         if (extensions != null) 'extensions': extensions!,
@@ -6485,7 +6481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (textRedactionMode != null) 'textRedactionMode': textRedactionMode!,
       };
 }
@@ -6512,7 +6508,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
       };
 }
@@ -6525,7 +6521,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to import resources.
@@ -6567,7 +6563,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentStructure != null) 'contentStructure': contentStructure!,
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
       };
@@ -6584,7 +6580,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A transformation to apply to text that is identified as a specific
@@ -6641,7 +6637,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (characterMaskConfig != null)
           'characterMaskConfig': characterMaskConfig!.toJson(),
         if (cryptoHashConfig != null)
@@ -6669,7 +6665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (message != null) 'message': message!.toJson(),
       };
 }
@@ -6701,7 +6697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hl7Ack != null) 'hl7Ack': hl7Ack!,
         if (message != null) 'message': message!.toJson(),
       };
@@ -6730,7 +6726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasets != null)
           'datasets': datasets!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6762,7 +6758,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dicomStores != null)
           'dicomStores': dicomStores!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6794,7 +6790,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fhirStores != null)
           'fhirStores': fhirStores!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6826,7 +6822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hl7V2Stores != null)
           'hl7V2Stores': hl7V2Stores!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6855,7 +6851,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6888,7 +6884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hl7V2Messages != null)
           'hl7V2Messages':
               hl7V2Messages!.map((value) => value.toJson()).toList(),
@@ -6918,7 +6914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -6962,32 +6958,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -7069,13 +7063,12 @@
       data = _json['data'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('messageType')) {
       messageType = _json['messageType'] as core.String;
@@ -7101,7 +7094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (data != null) 'data': data!,
         if (labels != null) 'labels': labels!,
@@ -7145,7 +7138,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pubsubTopic != null) 'pubsubTopic': pubsubTopic!,
       };
 }
@@ -7204,29 +7197,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -7282,7 +7273,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiMethodName != null) 'apiMethodName': apiMethodName!,
         if (cancelRequested != null) 'cancelRequested': cancelRequested!,
         if (counter != null) 'counter': counter!.toJson(),
@@ -7307,7 +7298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
       };
@@ -7344,7 +7335,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowNullHeader != null) 'allowNullHeader': allowNullHeader!,
         if (segmentTerminator != null) 'segmentTerminator': segmentTerminator!,
       };
@@ -7371,7 +7362,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
       };
@@ -7481,7 +7472,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -7516,7 +7507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failure != null) 'failure': failure!,
         if (pending != null) 'pending': pending!,
         if (success != null) 'success': success!,
@@ -7534,7 +7525,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// When using the INSPECT_AND_TRANSFORM action, each match is replaced with the
@@ -7549,7 +7540,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A list of FHIR resources.
@@ -7569,7 +7560,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resources != null) 'resources': resources!,
       };
 }
@@ -7613,7 +7604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (recursiveStructureDepth != null)
           'recursiveStructureDepth': recursiveStructureDepth!,
         if (schemaType != null) 'schemaType': schemaType!,
@@ -7638,7 +7629,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceType != null) 'resourceType': resourceType!,
       };
 }
@@ -7672,13 +7663,12 @@
 
   Segment.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
-      fields =
-          (_json['fields'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      fields = (_json['fields'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('segmentId')) {
       segmentId = _json['segmentId'] as core.String;
@@ -7688,7 +7678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (segmentId != null) 'segmentId': segmentId!,
         if (setId != null) 'setId': setId!,
@@ -7722,7 +7712,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -7761,8 +7751,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -7775,7 +7765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -7839,7 +7829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigqueryDestination != null)
           'bigqueryDestination': bigqueryDestination!.toJson(),
         if (resourceTypes != null) 'resourceTypes': resourceTypes!,
@@ -7867,7 +7857,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tags != null) 'tags': tags!,
       };
 }
@@ -7891,7 +7881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -7912,7 +7902,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -7933,7 +7923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transformations != null)
           'transformations':
               transformations!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/homegraph/v1.dart b/generated/googleapis/lib/homegraph/v1.dart
index a66985f..a63d363 100644
--- a/generated/googleapis/lib/homegraph/v1.dart
+++ b/generated/googleapis/lib/homegraph/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -298,7 +297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
       };
 }
@@ -322,7 +321,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentId != null) 'agentId': agentId!,
         if (deviceId != null) 'deviceId': deviceId!,
       };
@@ -412,24 +411,22 @@
 
   Device.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = (_json['attributes'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      attributes =
+          (_json['attributes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('customData')) {
-      customData = (_json['customData'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      customData =
+          (_json['customData'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('deviceInfo')) {
       deviceInfo = DeviceInfo.fromJson(
@@ -477,7 +474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!,
         if (customData != null) 'customData': customData!,
         if (deviceInfo != null) 'deviceInfo': deviceInfo!.toJson(),
@@ -530,7 +527,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hwVersion != null) 'hwVersion': hwVersion!,
         if (manufacturer != null) 'manufacturer': manufacturer!,
         if (model != null) 'model': model!,
@@ -568,7 +565,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultNames != null) 'defaultNames': defaultNames!,
         if (name != null) 'name': name!,
         if (nicknames != null) 'nicknames': nicknames!,
@@ -589,7 +586,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// LINT.IfChange go/shed-per-trait-routing.
@@ -611,7 +608,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (trait != null) 'trait': trait!,
       };
 }
@@ -650,7 +647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentUserId != null) 'agentUserId': agentUserId!,
         if (inputs != null)
           'inputs': inputs!.map((value) => value.toJson()).toList(),
@@ -672,7 +669,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payload != null) 'payload': payload!.toJson(),
       };
 }
@@ -693,7 +690,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
       };
@@ -730,7 +727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payload != null) 'payload': payload!.toJson(),
         if (requestId != null) 'requestId': requestId!,
       };
@@ -750,23 +747,21 @@
 
   QueryResponsePayload.fromJson(core.Map _json) {
     if (_json.containsKey('devices')) {
-      devices = (_json['devices'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
+      devices = (_json['devices'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          (item as core.Map<core.String, core.dynamic>).map(
             (key, item) => core.MapEntry(
               key,
-              (item as core.Map).cast<core.String, core.Object>().map(
-                    (key, item) => core.MapEntry(
-                      key,
-                      item as core.Object,
-                    ),
-                  ),
+              item as core.Object,
             ),
-          );
+          ),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null) 'devices': devices!,
       };
 }
@@ -795,27 +790,25 @@
 
   ReportStateAndNotificationDevice.fromJson(core.Map _json) {
     if (_json.containsKey('notifications')) {
-      notifications = (_json['notifications'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      notifications =
+          (_json['notifications'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('states')) {
-      states =
-          (_json['states'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      states = (_json['states'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notifications != null) 'notifications': notifications!,
         if (states != null) 'states': states!,
       };
@@ -876,7 +869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentUserId != null) 'agentUserId': agentUserId!,
         if (eventId != null) 'eventId': eventId!,
         if (followUpToken != null) 'followUpToken': followUpToken!,
@@ -900,7 +893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestId != null) 'requestId': requestId!,
       };
 }
@@ -934,7 +927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentUserId != null) 'agentUserId': agentUserId!,
         if (async != null) 'async': async!,
       };
@@ -953,7 +946,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Payload containing the state and notification information for devices.
@@ -970,7 +963,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null) 'devices': devices!.toJson(),
       };
 }
@@ -997,7 +990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentUserId != null) 'agentUserId': agentUserId!,
         if (requestId != null) 'requestId': requestId!,
       };
@@ -1038,7 +1031,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payload != null) 'payload': payload!.toJson(),
         if (requestId != null) 'requestId': requestId!,
       };
@@ -1066,7 +1059,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agentUserId != null) 'agentUserId': agentUserId!,
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/iam/v1.dart b/generated/googleapis/lib/iam/v1.dart
index 7d8ab3f..53fe315 100644
--- a/generated/googleapis/lib/iam/v1.dart
+++ b/generated/googleapis/lib/iam/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2844,7 +2843,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissionDelta != null)
           'permissionDelta': permissionDelta!.toJson(),
       };
@@ -2891,7 +2890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -2916,7 +2915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policyDelta != null) 'policyDelta': policyDelta!.toJson(),
       };
 }
@@ -2955,7 +2954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -2976,7 +2975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -2996,7 +2995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
       };
 }
@@ -3067,7 +3066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -3119,7 +3118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (condition != null) 'condition': condition!.toJson(),
         if (member != null) 'member': member!,
@@ -3151,7 +3150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (role != null) 'role': role!.toJson(),
         if (roleId != null) 'roleId': roleId!,
       };
@@ -3193,7 +3192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyAlgorithm != null) 'keyAlgorithm': keyAlgorithm!,
         if (privateKeyType != null) 'privateKeyType': privateKeyType!,
       };
@@ -3228,7 +3227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (serviceAccount != null) 'serviceAccount': serviceAccount!.toJson(),
       };
@@ -3242,7 +3241,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -3259,7 +3258,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The service account enable request.
@@ -3270,7 +3269,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -3334,7 +3333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -3369,7 +3368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (fullResourceName != null) 'fullResourceName': fullResourceName!,
       };
@@ -3394,7 +3393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lintResults != null)
           'lintResults': lintResults!.map((value) => value.toJson()).toList(),
       };
@@ -3478,7 +3477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (debugMessage != null) 'debugMessage': debugMessage!,
         if (fieldName != null) 'fieldName': fieldName!,
         if (level != null) 'level': level!,
@@ -3512,7 +3511,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (roles != null)
           'roles': roles!.map((value) => value.toJson()).toList(),
@@ -3535,7 +3534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keys != null) 'keys': keys!.map((value) => value.toJson()).toList(),
       };
 }
@@ -3563,7 +3562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accounts != null)
           'accounts': accounts!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3596,7 +3595,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (workloadIdentityPoolProviders != null)
           'workloadIdentityPoolProviders': workloadIdentityPoolProviders!
@@ -3629,7 +3628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (workloadIdentityPools != null)
           'workloadIdentityPools':
@@ -3670,7 +3669,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedAudiences != null) 'allowedAudiences': allowedAudiences!,
         if (issuerUri != null) 'issuerUri': issuerUri!,
       };
@@ -3730,29 +3729,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -3783,7 +3780,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (serviceAccount != null) 'serviceAccount': serviceAccount!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -3857,7 +3854,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiDisabled != null) 'apiDisabled': apiDisabled!,
         if (customRolesSupportLevel != null)
           'customRolesSupportLevel': customRolesSupportLevel!,
@@ -3895,7 +3892,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addedPermissions != null) 'addedPermissions': addedPermissions!,
         if (removedPermissions != null)
           'removedPermissions': removedPermissions!,
@@ -4006,7 +4003,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -4032,7 +4029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindingDeltas != null)
           'bindingDeltas':
               bindingDeltas!.map((value) => value.toJson()).toList(),
@@ -4058,7 +4055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullResourceName != null) 'fullResourceName': fullResourceName!,
       };
 }
@@ -4079,7 +4076,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (services != null)
           'services': services!.map((value) => value.toJson()).toList(),
       };
@@ -4129,7 +4126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullResourceName != null) 'fullResourceName': fullResourceName!,
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
@@ -4160,7 +4157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (roles != null)
           'roles': roles!.map((value) => value.toJson()).toList(),
@@ -4201,7 +4198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullResourceName != null) 'fullResourceName': fullResourceName!,
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
@@ -4231,7 +4228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (permissions != null)
           'permissions': permissions!.map((value) => value.toJson()).toList(),
@@ -4322,7 +4319,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deleted != null) 'deleted': deleted!,
         if (description != null) 'description': description!,
         if (etag != null) 'etag': etag!,
@@ -4447,7 +4444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (disabled != null) 'disabled': disabled!,
         if (displayName != null) 'displayName': displayName!,
@@ -4589,7 +4586,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyAlgorithm != null) 'keyAlgorithm': keyAlgorithm!,
         if (keyOrigin != null) 'keyOrigin': keyOrigin!,
         if (keyType != null) 'keyType': keyType!,
@@ -4629,7 +4626,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -4663,7 +4660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bytesToSign != null) 'bytesToSign': bytesToSign!,
       };
 }
@@ -4705,7 +4702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyId != null) 'keyId': keyId!,
         if (signature != null) 'signature': signature!,
       };
@@ -4738,7 +4735,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payload != null) 'payload': payload!,
       };
 }
@@ -4774,7 +4771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyId != null) 'keyId': keyId!,
         if (signedJwt != null) 'signedJwt': signedJwt!,
       };
@@ -4813,8 +4810,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4827,7 +4824,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4853,7 +4850,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4874,7 +4871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4898,7 +4895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
       };
 }
@@ -4911,7 +4908,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 class UndeleteServiceAccountResponse {
@@ -4927,7 +4924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (restoredAccount != null)
           'restoredAccount': restoredAccount!.toJson(),
       };
@@ -4941,7 +4938,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for UndeleteWorkloadIdentityPool.
@@ -4952,7 +4949,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The service account key upload request.
@@ -4979,7 +4976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publicKeyData != null) 'publicKeyData': publicKeyData!,
       };
 }
@@ -5046,7 +5043,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (disabled != null) 'disabled': disabled!,
         if (displayName != null) 'displayName': displayName!,
@@ -5165,14 +5162,14 @@
       attributeCondition = _json['attributeCondition'] as core.String;
     }
     if (_json.containsKey('attributeMapping')) {
-      attributeMapping = (_json['attributeMapping'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      attributeMapping =
+          (_json['attributeMapping'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('aws')) {
       aws = Aws.fromJson(_json['aws'] as core.Map<core.String, core.dynamic>);
@@ -5198,7 +5195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeCondition != null)
           'attributeCondition': attributeCondition!,
         if (attributeMapping != null) 'attributeMapping': attributeMapping!,
diff --git a/generated/googleapis/lib/iamcredentials/v1.dart b/generated/googleapis/lib/iamcredentials/v1.dart
index 31c40d0..324886f 100644
--- a/generated/googleapis/lib/iamcredentials/v1.dart
+++ b/generated/googleapis/lib/iamcredentials/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -306,7 +305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delegates != null) 'delegates': delegates!,
         if (lifetime != null) 'lifetime': lifetime!,
         if (scope != null) 'scope': scope!,
@@ -333,7 +332,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessToken != null) 'accessToken': accessToken!,
         if (expireTime != null) 'expireTime': expireTime!,
       };
@@ -380,7 +379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audience != null) 'audience': audience!,
         if (delegates != null) 'delegates': delegates!,
         if (includeEmail != null) 'includeEmail': includeEmail!,
@@ -399,7 +398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (token != null) 'token': token!,
       };
 }
@@ -441,7 +440,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delegates != null) 'delegates': delegates!,
         if (payload != null) 'payload': payload!,
       };
@@ -487,7 +486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyId != null) 'keyId': keyId!,
         if (signedBlob != null) 'signedBlob': signedBlob!,
       };
@@ -529,7 +528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delegates != null) 'delegates': delegates!,
         if (payload != null) 'payload': payload!,
       };
@@ -570,7 +569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyId != null) 'keyId': keyId!,
         if (signedJwt != null) 'signedJwt': signedJwt!,
       };
diff --git a/generated/googleapis/lib/iap/v1.dart b/generated/googleapis/lib/iap/v1.dart
index 9bd93be..78a7395 100644
--- a/generated/googleapis/lib/iap/v1.dart
+++ b/generated/googleapis/lib/iap/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -696,7 +695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessDeniedPageUri != null)
           'accessDeniedPageUri': accessDeniedPageUri!,
       };
@@ -741,7 +740,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (corsSettings != null) 'corsSettings': corsSettings!.toJson(),
         if (gcipSettings != null) 'gcipSettings': gcipSettings!.toJson(),
         if (oauthSettings != null) 'oauthSettings': oauthSettings!.toJson(),
@@ -781,7 +780,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessDeniedPageSettings != null)
           'accessDeniedPageSettings': accessDeniedPageSettings!.toJson(),
         if (cookieDomain != null) 'cookieDomain': cookieDomain!,
@@ -855,7 +854,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -903,7 +902,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicationTitle != null) 'applicationTitle': applicationTitle!,
         if (name != null) 'name': name!,
         if (orgInternalOnly != null) 'orgInternalOnly': orgInternalOnly!,
@@ -927,7 +926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowHttpOptions != null) 'allowHttpOptions': allowHttpOptions!,
       };
 }
@@ -951,7 +950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rctokenAud != null) 'rctokenAud': rctokenAud!,
       };
 }
@@ -970,7 +969,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -1034,7 +1033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1072,7 +1071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (loginPageUri != null) 'loginPageUri': loginPageUri!,
         if (tenantIds != null) 'tenantIds': tenantIds!,
       };
@@ -1093,7 +1092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -1120,7 +1119,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -1155,7 +1154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessSettings != null) 'accessSettings': accessSettings!.toJson(),
         if (applicationSettings != null)
           'applicationSettings': applicationSettings!.toJson(),
@@ -1192,7 +1191,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (secret != null) 'secret': secret!,
@@ -1215,7 +1214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (brands != null)
           'brands': brands!.map((value) => value.toJson()).toList(),
       };
@@ -1247,7 +1246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identityAwareProxyClients != null)
           'identityAwareProxyClients': identityAwareProxyClients!
               .map((value) => value.toJson())
@@ -1275,7 +1274,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (loginHint != null) 'loginHint': loginHint!,
       };
 }
@@ -1375,7 +1374,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -1425,7 +1424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iamPermission != null) 'iamPermission': iamPermission!,
         if (iamServiceName != null) 'iamServiceName': iamServiceName!,
         if (policyName != null) 'policyName': policyName!.toJson(),
@@ -1461,7 +1460,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (region != null) 'region': region!,
         if (type != null) 'type': type!,
@@ -1476,7 +1475,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 class Resource {
@@ -1532,13 +1531,12 @@
 
   Resource.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1551,7 +1549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (name != null) 'name': name!,
         if (service != null) 'service': service!,
@@ -1577,7 +1575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -1601,7 +1599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1622,7 +1620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
diff --git a/generated/googleapis/lib/identitytoolkit/v3.dart b/generated/googleapis/lib/identitytoolkit/v3.dart
index 456b69d..b2531c8 100644
--- a/generated/googleapis/lib/identitytoolkit/v3.dart
+++ b/generated/googleapis/lib/identitytoolkit/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -870,7 +869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allProviders != null) 'allProviders': allProviders!,
         if (authUri != null) 'authUri': authUri!,
         if (captchaRequired != null) 'captchaRequired': captchaRequired!,
@@ -897,7 +896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
       };
 }
@@ -932,7 +931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (users != null)
@@ -989,7 +988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (expiresIn != null) 'expiresIn': expiresIn!,
         if (idToken != null) 'idToken': idToken!,
@@ -1043,7 +1042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!,
         if (format != null) 'format': format!,
         if (from != null) 'from': from!,
@@ -1075,7 +1074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (users != null)
           'users': users!.map((value) => value.toJson()).toList(),
@@ -1108,7 +1107,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (kind != null) 'kind': kind!,
         if (oobCode != null) 'oobCode': oobCode!,
@@ -1141,7 +1140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (recaptchaSiteKey != null) 'recaptchaSiteKey': recaptchaSiteKey!,
         if (recaptchaStoken != null) 'recaptchaStoken': recaptchaStoken!,
@@ -1237,14 +1236,13 @@
       continueUri = _json['continueUri'] as core.String;
     }
     if (_json.containsKey('customParameter')) {
-      customParameter = (_json['customParameter'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      customParameter =
+          (_json['customParameter'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('hostedDomain')) {
       hostedDomain = _json['hostedDomain'] as core.String;
@@ -1278,7 +1276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appId != null) 'appId': appId!,
         if (authFlowType != null) 'authFlowType': authFlowType!,
         if (clientId != null) 'clientId': clientId!,
@@ -1326,7 +1324,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delegatedProjectNumber != null)
           'delegatedProjectNumber': delegatedProjectNumber!,
         if (idToken != null) 'idToken': idToken!,
@@ -1371,7 +1369,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delegatedProjectNumber != null)
           'delegatedProjectNumber': delegatedProjectNumber!,
         if (maxResults != null) 'maxResults': maxResults!,
@@ -1405,7 +1403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (idToken != null) 'idToken': idToken!,
         if (oobCode != null) 'oobCode': oobCode!,
@@ -1457,7 +1455,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delegatedProjectNumber != null)
           'delegatedProjectNumber': delegatedProjectNumber!,
         if (email != null) 'email': email!,
@@ -1555,7 +1553,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPasswordUser != null) 'allowPasswordUser': allowPasswordUser!,
         if (apiKey != null) 'apiKey': apiKey!,
         if (authorizedDomains != null) 'authorizedDomains': authorizedDomains!,
@@ -1646,7 +1644,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (newPassword != null) 'newPassword': newPassword!,
         if (oldPassword != null) 'oldPassword': oldPassword!,
@@ -1686,7 +1684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iosReceipt != null) 'iosReceipt': iosReceipt!,
         if (iosSecret != null) 'iosSecret': iosSecret!,
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
@@ -1708,7 +1706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sessionInfo != null) 'sessionInfo': sessionInfo!,
       };
 }
@@ -1866,7 +1864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (captchaChallenge != null) 'captchaChallenge': captchaChallenge!,
         if (captchaResponse != null) 'captchaResponse': captchaResponse!,
         if (createdAt != null) 'createdAt': createdAt!,
@@ -1981,7 +1979,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowPasswordUser != null) 'allowPasswordUser': allowPasswordUser!,
         if (apiKey != null) 'apiKey': apiKey!,
         if (authorizedDomains != null) 'authorizedDomains': authorizedDomains!,
@@ -2016,7 +2014,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectId != null) 'projectId': projectId!,
       };
 }
@@ -2040,7 +2038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceId != null) 'instanceId': instanceId!,
         if (localId != null) 'localId': localId!,
       };
@@ -2059,7 +2057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (localId != null) 'localId': localId!,
       };
 }
@@ -2161,7 +2159,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (captchaChallenge != null) 'captchaChallenge': captchaChallenge!,
         if (captchaResponse != null) 'captchaResponse': captchaResponse!,
         if (disabled != null) 'disabled': disabled!,
@@ -2290,7 +2288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowOverwrite != null) 'allowOverwrite': allowOverwrite!,
         if (blockSize != null) 'blockSize': blockSize!,
         if (cpuMemCost != null) 'cpuMemCost': cpuMemCost!,
@@ -2407,7 +2405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoCreate != null) 'autoCreate': autoCreate!,
         if (delegatedProjectNumber != null)
           'delegatedProjectNumber': delegatedProjectNumber!,
@@ -2461,7 +2459,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delegatedProjectNumber != null)
           'delegatedProjectNumber': delegatedProjectNumber!,
         if (instanceId != null) 'instanceId': instanceId!,
@@ -2548,7 +2546,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (captchaChallenge != null) 'captchaChallenge': captchaChallenge!,
         if (captchaResponse != null) 'captchaResponse': captchaResponse!,
         if (delegatedProjectNumber != null)
@@ -2604,7 +2602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (idToken != null) 'idToken': idToken!,
         if (operation != null) 'operation': operation!,
@@ -2665,7 +2663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expiresIn != null) 'expiresIn': expiresIn!,
         if (idToken != null) 'idToken': idToken!,
         if (isNewUser != null) 'isNewUser': isNewUser!,
@@ -2727,7 +2725,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientId != null) 'clientId': clientId!,
         if (enabled != null) 'enabled': enabled!,
         if (experimentPercent != null) 'experimentPercent': experimentPercent!,
@@ -2840,7 +2838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidInstallApp != null) 'androidInstallApp': androidInstallApp!,
         if (androidMinimumVersion != null)
           'androidMinimumVersion': androidMinimumVersion!,
@@ -2895,7 +2893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (kind != null) 'kind': kind!,
         if (newEmail != null) 'newEmail': newEmail!,
@@ -2936,7 +2934,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (federatedId != null) 'federatedId': federatedId!,
         if (photoUrl != null) 'photoUrl': photoUrl!,
@@ -3035,7 +3033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (email != null) 'email': email!,
         if (emailVerified != null) 'emailVerified': emailVerified!,
@@ -3104,7 +3102,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (email != null) 'email': email!,
         if (expiresIn != null) 'expiresIn': expiresIn!,
@@ -3133,7 +3131,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (index != null) 'index': index!,
         if (message != null) 'message': message!,
       };
@@ -3162,7 +3160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null)
           'error': error!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3226,7 +3224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (email != null) 'email': email!,
         if (federatedId != null) 'federatedId': federatedId!,
@@ -3376,7 +3374,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createdAt != null) 'createdAt': createdAt!,
         if (customAttributes != null) 'customAttributes': customAttributes!,
         if (customAuth != null) 'customAuth': customAuth!,
@@ -3665,7 +3663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (appInstallationUrl != null)
           'appInstallationUrl': appInstallationUrl!,
@@ -3748,7 +3746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expiresIn != null) 'expiresIn': expiresIn!,
         if (idToken != null) 'idToken': idToken!,
         if (isNewUser != null) 'isNewUser': isNewUser!,
@@ -3840,7 +3838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (email != null) 'email': email!,
         if (expiresIn != null) 'expiresIn': expiresIn!,
diff --git a/generated/googleapis/lib/indexing/v3.dart b/generated/googleapis/lib/indexing/v3.dart
index 670fc51..a6151c2 100644
--- a/generated/googleapis/lib/indexing/v3.dart
+++ b/generated/googleapis/lib/indexing/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -152,7 +151,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (urlNotificationMetadata != null)
           'urlNotificationMetadata': urlNotificationMetadata!.toJson(),
       };
@@ -194,7 +193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notifyTime != null) 'notifyTime': notifyTime!,
         if (type != null) 'type': type!,
         if (url != null) 'url': url!,
@@ -229,7 +228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latestRemove != null) 'latestRemove': latestRemove!.toJson(),
         if (latestUpdate != null) 'latestUpdate': latestUpdate!.toJson(),
         if (url != null) 'url': url!,
diff --git a/generated/googleapis/lib/jobs/v3.dart b/generated/googleapis/lib/jobs/v3.dart
index d9d1570..6de0909 100644
--- a/generated/googleapis/lib/jobs/v3.dart
+++ b/generated/googleapis/lib/jobs/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -905,7 +904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emails != null) 'emails': emails!,
         if (instruction != null) 'instruction': instruction!,
         if (uris != null) 'uris': uris!,
@@ -934,7 +933,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
       };
 }
@@ -958,7 +957,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (from != null) 'from': from!,
         if (to != null) 'to': to!,
       };
@@ -985,7 +984,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (range != null) 'range': range!.toJson(),
       };
@@ -1053,12 +1052,12 @@
     }
     if (_json.containsKey('extraInfo')) {
       extraInfo =
-          (_json['extraInfo'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+          (_json['extraInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('jobEvent')) {
       jobEvent = JobEvent.fromJson(
@@ -1072,7 +1071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (eventId != null) 'eventId': eventId!,
         if (extraInfo != null) 'extraInfo': extraInfo!,
@@ -1167,7 +1166,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowImpreciseAddresses != null)
           'allowImpreciseAddresses': allowImpreciseAddresses!,
         if (commuteMethod != null) 'commuteMethod': commuteMethod!,
@@ -1205,7 +1204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobLocation != null) 'jobLocation': jobLocation!.toJson(),
         if (travelDuration != null) 'travelDuration': travelDuration!,
       };
@@ -1365,7 +1364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (careerSiteUri != null) 'careerSiteUri': careerSiteUri!,
         if (derivedInfo != null) 'derivedInfo': derivedInfo!.toJson(),
         if (displayName != null) 'displayName': displayName!,
@@ -1400,7 +1399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headquartersLocation != null)
           'headquartersLocation': headquartersLocation!.toJson(),
       };
@@ -1503,7 +1502,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (description != null) 'description': description!,
         if (expectedUnitsPerYear != null)
@@ -1581,7 +1580,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeJobsWithUnspecifiedCompensationRange != null)
           'includeJobsWithUnspecifiedCompensationRange':
               includeJobsWithUnspecifiedCompensationRange!,
@@ -1630,7 +1629,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketingOption != null)
           'bucketingOption': bucketingOption!.toJson(),
         if (type != null) 'type': type!,
@@ -1668,7 +1667,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
         if (type != null) 'type': type!,
       };
@@ -1723,7 +1722,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annualizedBaseCompensationRange != null)
           'annualizedBaseCompensationRange':
               annualizedBaseCompensationRange!.toJson(),
@@ -1766,7 +1765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxCompensation != null)
           'maxCompensation': maxCompensation!.toJson(),
         if (minCompensation != null)
@@ -1800,7 +1799,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completionResults != null)
           'completionResults':
               completionResults!.map((value) => value.toJson()).toList(),
@@ -1840,7 +1839,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageUri != null) 'imageUri': imageUri!,
         if (suggestion != null) 'suggestion': suggestion!,
         if (type != null) 'type': type!,
@@ -1864,7 +1863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientEvent != null) 'clientEvent': clientEvent!.toJson(),
       };
 }
@@ -1887,7 +1886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (company != null) 'company': company!.toJson(),
       };
 }
@@ -1909,7 +1908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (job != null) 'job': job!.toJson(),
       };
 }
@@ -1962,7 +1961,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filterable != null) 'filterable': filterable!,
         if (longValues != null) 'longValues': longValues!,
         if (stringValues != null) 'stringValues': stringValues!,
@@ -2011,7 +2010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (longValueHistogramBucketingOption != null)
           'longValueHistogramBucketingOption':
@@ -2048,19 +2047,18 @@
               as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stringValueHistogramResult')) {
-      stringValueHistogramResult =
-          (_json['stringValueHistogramResult'] as core.Map)
-              .cast<core.String, core.int>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.int,
-                ),
-              );
+      stringValueHistogramResult = (_json['stringValueHistogramResult']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.int,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (longValueHistogramResult != null)
           'longValueHistogramResult': longValueHistogramResult!.toJson(),
@@ -2110,7 +2108,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceType != null) 'deviceType': deviceType!,
         if (id != null) 'id': id!,
       };
@@ -2130,7 +2128,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Input only.
@@ -2183,7 +2181,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compensationHistogramFacets != null)
           'compensationHistogramFacets': compensationHistogramFacets!
               .map((value) => value.toJson())
@@ -2259,16 +2257,16 @@
       searchType = _json['searchType'] as core.String;
     }
     if (_json.containsKey('values')) {
-      values = (_json['values'] as core.Map).cast<core.String, core.int>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.int,
-            ),
-          );
+      values = (_json['values'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.int,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (searchType != null) 'searchType': searchType!,
         if (values != null) 'values': values!,
       };
@@ -2317,7 +2315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compensationHistogramResults != null)
           'compensationHistogramResults': compensationHistogramResults!
               .map((value) => value.toJson())
@@ -2659,15 +2657,14 @@
           _json['compensationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customAttributes')) {
-      customAttributes = (_json['customAttributes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              CustomAttribute.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      customAttributes =
+          (_json['customAttributes'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          CustomAttribute.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('degreeTypes')) {
       degreeTypes = (_json['degreeTypes'] as core.List)
@@ -2751,7 +2748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addresses != null) 'addresses': addresses!,
         if (applicationInfo != null)
           'applicationInfo': applicationInfo!.toJson(),
@@ -2820,7 +2817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobCategories != null) 'jobCategories': jobCategories!,
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
@@ -2922,7 +2919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!,
         if (type != null) 'type': type!,
       };
@@ -3129,7 +3126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commuteFilter != null) 'commuteFilter': commuteFilter!.toJson(),
         if (companyDisplayNames != null)
           'companyDisplayNames': companyDisplayNames!,
@@ -3179,7 +3176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
@@ -3217,7 +3214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (companies != null)
           'companies': companies!.map((value) => value.toJson()).toList(),
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -3260,7 +3257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3333,7 +3330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latLng != null) 'latLng': latLng!.toJson(),
         if (locationType != null) 'locationType': locationType!,
         if (postalAddress != null) 'postalAddress': postalAddress!.toJson(),
@@ -3423,7 +3420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (distanceInMiles != null) 'distanceInMiles': distanceInMiles!,
         if (latLng != null) 'latLng': latLng!.toJson(),
@@ -3481,7 +3478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commuteInfo != null) 'commuteInfo': commuteInfo!.toJson(),
         if (job != null) 'job': job!.toJson(),
         if (jobSummary != null) 'jobSummary': jobSummary!,
@@ -3509,19 +3506,19 @@
 
   MendelDebugInput.fromJson(core.Map _json) {
     if (_json.containsKey('namespacedDebugInput')) {
-      namespacedDebugInput = (_json['namespacedDebugInput'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              NamespacedDebugInput.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      namespacedDebugInput =
+          (_json['namespacedDebugInput'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          NamespacedDebugInput.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namespacedDebugInput != null)
           'namespacedDebugInput': namespacedDebugInput!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -3561,7 +3558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -3728,28 +3725,26 @@
       disableOrganicSelection = _json['disableOrganicSelection'] as core.bool;
     }
     if (_json.containsKey('forcedFlags')) {
-      forcedFlags = (_json['forcedFlags'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      forcedFlags =
+          (_json['forcedFlags'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('forcedRollouts')) {
-      forcedRollouts = (_json['forcedRollouts'] as core.Map)
-          .cast<core.String, core.bool>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.bool,
-            ),
-          );
+      forcedRollouts =
+          (_json['forcedRollouts'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.bool,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (absolutelyForcedExpNames != null)
           'absolutelyForcedExpNames': absolutelyForcedExpNames!,
         if (absolutelyForcedExpTags != null)
@@ -3810,7 +3805,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketBounds != null) 'bucketBounds': bucketBounds!,
         if (requiresMinMax != null) 'requiresMinMax': requiresMinMax!,
       };
@@ -3854,7 +3849,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (counts != null)
           'counts': counts!.map((value) => value.toJson()).toList(),
         if (maxValue != null) 'maxValue': maxValue!,
@@ -4025,7 +4020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressLines != null) 'addressLines': addressLines!,
         if (administrativeArea != null)
           'administrativeArea': administrativeArea!,
@@ -4078,7 +4073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableStreetAddressResolution != null)
           'disableStreetAddressResolution': disableStreetAddressResolution!,
         if (htmlSanitization != null) 'htmlSanitization': htmlSanitization!,
@@ -4153,7 +4148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceInfo != null) 'deviceInfo': deviceInfo!.toJson(),
         if (domain != null) 'domain': domain!,
         if (sessionId != null) 'sessionId': sessionId!,
@@ -4178,7 +4173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestId != null) 'requestId': requestId!,
       };
 }
@@ -4399,7 +4394,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableKeywordMatch != null)
           'disableKeywordMatch': disableKeywordMatch!,
         if (diversificationLevel != null)
@@ -4512,7 +4507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (broadenedQueryJobsCount != null)
           'broadenedQueryJobsCount': broadenedQueryJobsCount!,
         if (estimatedTotalSize != null)
@@ -4553,7 +4548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (corrected != null) 'corrected': corrected!,
         if (correctedText != null) 'correctedText': correctedText!,
       };
@@ -4604,7 +4599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
@@ -4631,7 +4626,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -4666,7 +4661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (company != null) 'company': company!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -4700,7 +4695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (job != null) 'job': job!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
diff --git a/generated/googleapis/lib/jobs/v4.dart b/generated/googleapis/lib/jobs/v4.dart
index 9b9ca2c..1e6c633 100644
--- a/generated/googleapis/lib/jobs/v4.dart
+++ b/generated/googleapis/lib/jobs/v4.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1223,7 +1222,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emails != null) 'emails': emails!,
         if (instruction != null) 'instruction': instruction!,
         if (uris != null) 'uris': uris!,
@@ -1250,7 +1249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
       };
 }
@@ -1276,7 +1275,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobResults != null)
           'jobResults': jobResults!.map((value) => value.toJson()).toList(),
       };
@@ -1301,7 +1300,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -1327,7 +1326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobResults != null)
           'jobResults': jobResults!.map((value) => value.toJson()).toList(),
       };
@@ -1407,7 +1406,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
         if (failureCount != null) 'failureCount': failureCount!,
@@ -1453,7 +1452,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -1480,7 +1479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobResults != null)
           'jobResults': jobResults!.map((value) => value.toJson()).toList(),
       };
@@ -1539,7 +1538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (eventId != null) 'eventId': eventId!,
         if (eventNotes != null) 'eventNotes': eventNotes!,
@@ -1621,7 +1620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowImpreciseAddresses != null)
           'allowImpreciseAddresses': allowImpreciseAddresses!,
         if (commuteMethod != null) 'commuteMethod': commuteMethod!,
@@ -1657,7 +1656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobLocation != null) 'jobLocation': jobLocation!.toJson(),
         if (travelDuration != null) 'travelDuration': travelDuration!,
       };
@@ -1801,7 +1800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (careerSiteUri != null) 'careerSiteUri': careerSiteUri!,
         if (derivedInfo != null) 'derivedInfo': derivedInfo!.toJson(),
         if (displayName != null) 'displayName': displayName!,
@@ -1836,7 +1835,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headquartersLocation != null)
           'headquartersLocation': headquartersLocation!.toJson(),
       };
@@ -1927,7 +1926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (description != null) 'description': description!,
         if (expectedUnitsPerYear != null)
@@ -1999,7 +1998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeJobsWithUnspecifiedCompensationRange != null)
           'includeJobsWithUnspecifiedCompensationRange':
               includeJobsWithUnspecifiedCompensationRange!,
@@ -2056,7 +2055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annualizedBaseCompensationRange != null)
           'annualizedBaseCompensationRange':
               annualizedBaseCompensationRange!.toJson(),
@@ -2095,7 +2094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxCompensation != null)
           'maxCompensation': maxCompensation!.toJson(),
         if (minCompensation != null)
@@ -2127,7 +2126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completionResults != null)
           'completionResults':
               completionResults!.map((value) => value.toJson()).toList(),
@@ -2172,7 +2171,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageUri != null) 'imageUri': imageUri!,
         if (suggestion != null) 'suggestion': suggestion!,
         if (type != null) 'type': type!,
@@ -2233,7 +2232,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filterable != null) 'filterable': filterable!,
         if (keywordSearchable != null) 'keywordSearchable': keywordSearchable!,
         if (longValues != null) 'longValues': longValues!,
@@ -2303,7 +2302,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (importanceLevel != null) 'importanceLevel': importanceLevel!,
         if (rankingExpression != null) 'rankingExpression': rankingExpression!,
       };
@@ -2346,7 +2345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceType != null) 'deviceType': deviceType!,
         if (id != null) 'id': id!,
       };
@@ -2366,7 +2365,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The histogram request.
@@ -2385,7 +2384,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (histogramQuery != null) 'histogramQuery': histogramQuery!,
       };
 }
@@ -2410,19 +2409,19 @@
   HistogramQueryResult.fromJson(core.Map _json) {
     if (_json.containsKey('histogram')) {
       histogram =
-          (_json['histogram'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+          (_json['histogram'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('histogramQuery')) {
       histogramQuery = _json['histogramQuery'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (histogram != null) 'histogram': histogram!,
         if (histogramQuery != null) 'histogramQuery': histogramQuery!,
       };
@@ -2729,15 +2728,14 @@
           _json['compensationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customAttributes')) {
-      customAttributes = (_json['customAttributes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              CustomAttribute.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      customAttributes =
+          (_json['customAttributes'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          CustomAttribute.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('degreeTypes')) {
       degreeTypes = (_json['degreeTypes'] as core.List)
@@ -2821,7 +2819,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addresses != null) 'addresses': addresses!,
         if (applicationInfo != null)
           'applicationInfo': applicationInfo!.toJson(),
@@ -2888,7 +2886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobCategories != null) 'jobCategories': jobCategories!,
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
@@ -2990,7 +2988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!,
         if (type != null) 'type': type!,
       };
@@ -3182,7 +3180,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commuteFilter != null) 'commuteFilter': commuteFilter!.toJson(),
         if (companies != null) 'companies': companies!,
         if (companyDisplayNames != null)
@@ -3230,7 +3228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (job != null) 'job': job!.toJson(),
         if (status != null) 'status': status!.toJson(),
       };
@@ -3263,7 +3261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
@@ -3299,7 +3297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (companies != null)
           'companies': companies!.map((value) => value.toJson()).toList(),
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -3340,7 +3338,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3377,7 +3375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tenants != null)
@@ -3448,7 +3446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latLng != null) 'latLng': latLng!.toJson(),
         if (locationType != null) 'locationType': locationType!,
         if (postalAddress != null) 'postalAddress': postalAddress!.toJson(),
@@ -3527,7 +3525,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (distanceInMiles != null) 'distanceInMiles': distanceInMiles!,
         if (latLng != null) 'latLng': latLng!.toJson(),
@@ -3583,7 +3581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commuteInfo != null) 'commuteInfo': commuteInfo!.toJson(),
         if (job != null) 'job': job!.toJson(),
         if (jobSummary != null) 'jobSummary': jobSummary!,
@@ -3611,19 +3609,19 @@
 
   MendelDebugInput.fromJson(core.Map _json) {
     if (_json.containsKey('namespacedDebugInput')) {
-      namespacedDebugInput = (_json['namespacedDebugInput'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              NamespacedDebugInput.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      namespacedDebugInput =
+          (_json['namespacedDebugInput'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          NamespacedDebugInput.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namespacedDebugInput != null)
           'namespacedDebugInput': namespacedDebugInput!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -3663,7 +3661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -3830,28 +3828,26 @@
       disableOrganicSelection = _json['disableOrganicSelection'] as core.bool;
     }
     if (_json.containsKey('forcedFlags')) {
-      forcedFlags = (_json['forcedFlags'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      forcedFlags =
+          (_json['forcedFlags'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('forcedRollouts')) {
-      forcedRollouts = (_json['forcedRollouts'] as core.Map)
-          .cast<core.String, core.bool>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.bool,
-            ),
-          );
+      forcedRollouts =
+          (_json['forcedRollouts'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.bool,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (absolutelyForcedExpNames != null)
           'absolutelyForcedExpNames': absolutelyForcedExpNames!,
         if (absolutelyForcedExpTags != null)
@@ -3933,29 +3929,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4127,7 +4121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressLines != null) 'addressLines': addressLines!,
         if (administrativeArea != null)
           'administrativeArea': administrativeArea!,
@@ -4174,7 +4168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disableStreetAddressResolution != null)
           'disableStreetAddressResolution': disableStreetAddressResolution!,
         if (htmlSanitization != null) 'htmlSanitization': htmlSanitization!,
@@ -4250,7 +4244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowMissingIds != null) 'allowMissingIds': allowMissingIds!,
         if (deviceInfo != null) 'deviceInfo': deviceInfo!.toJson(),
         if (domain != null) 'domain': domain!,
@@ -4274,7 +4268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestId != null) 'requestId': requestId!,
       };
 }
@@ -4550,7 +4544,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customRankingInfo != null)
           'customRankingInfo': customRankingInfo!.toJson(),
         if (disableKeywordMatch != null)
@@ -4657,7 +4651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (broadenedQueryJobsCount != null)
           'broadenedQueryJobsCount': broadenedQueryJobsCount!,
         if (histogramQueryResults != null)
@@ -4706,7 +4700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (corrected != null) 'corrected': corrected!,
         if (correctedHtml != null) 'correctedHtml': correctedHtml!,
         if (correctedText != null) 'correctedText': correctedText!,
@@ -4746,8 +4740,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4760,7 +4754,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4799,7 +4793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (externalId != null) 'externalId': externalId!,
         if (name != null) 'name': name!,
       };
@@ -4850,7 +4844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
@@ -4877,7 +4871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
diff --git a/generated/googleapis/lib/kgsearch/v1.dart b/generated/googleapis/lib/kgsearch/v1.dart
index 0da2d89..cc23a20 100644
--- a/generated/googleapis/lib/kgsearch/v1.dart
+++ b/generated/googleapis/lib/kgsearch/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -161,7 +160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (P_context != null) '@context': P_context!,
         if (P_type != null) '@type': P_type!,
         if (itemListElement != null) 'itemListElement': itemListElement!,
diff --git a/generated/googleapis/lib/language/v1.dart b/generated/googleapis/lib/language/v1.dart
index 1a375c8..6df4fec 100644
--- a/generated/googleapis/lib/language/v1.dart
+++ b/generated/googleapis/lib/language/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -329,7 +328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
         if (encodingType != null) 'encodingType': encodingType!,
       };
@@ -360,7 +359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
         if (language != null) 'language': language!,
@@ -401,7 +400,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
         if (encodingType != null) 'encodingType': encodingType!,
       };
@@ -432,7 +431,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
         if (language != null) 'language': language!,
@@ -473,7 +472,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
         if (encodingType != null) 'encodingType': encodingType!,
       };
@@ -511,7 +510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentSentiment != null)
           'documentSentiment': documentSentiment!.toJson(),
         if (language != null) 'language': language!,
@@ -554,7 +553,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
         if (encodingType != null) 'encodingType': encodingType!,
       };
@@ -594,7 +593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (language != null) 'language': language!,
         if (sentences != null)
           'sentences': sentences!.map((value) => value.toJson()).toList(),
@@ -647,7 +646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
         if (encodingType != null) 'encodingType': encodingType!,
         if (features != null) 'features': features!.toJson(),
@@ -724,7 +723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categories != null)
           'categories': categories!.map((value) => value.toJson()).toList(),
         if (documentSentiment != null)
@@ -762,7 +761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
       };
@@ -784,7 +783,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
       };
 }
@@ -806,7 +805,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categories != null)
           'categories': categories!.map((value) => value.toJson()).toList(),
       };
@@ -924,7 +923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headTokenIndex != null) 'headTokenIndex': headTokenIndex!,
         if (label != null) 'label': label!,
       };
@@ -983,7 +982,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsContentUri != null) 'gcsContentUri': gcsContentUri!,
         if (language != null) 'language': language!,
@@ -1066,13 +1065,12 @@
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1089,7 +1087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mentions != null)
           'mentions': mentions!.map((value) => value.toJson()).toList(),
         if (metadata != null) 'metadata': metadata!,
@@ -1136,7 +1134,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sentiment != null) 'sentiment': sentiment!.toJson(),
         if (text != null) 'text': text!.toJson(),
         if (type != null) 'type': type!,
@@ -1182,7 +1180,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (classifyText != null) 'classifyText': classifyText!,
         if (extractDocumentSentiment != null)
           'extractDocumentSentiment': extractDocumentSentiment!,
@@ -1380,7 +1378,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aspect != null) 'aspect': aspect!,
         if (case_ != null) 'case': case_!,
         if (form != null) 'form': form!,
@@ -1419,7 +1417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sentiment != null) 'sentiment': sentiment!.toJson(),
         if (text != null) 'text': text!.toJson(),
       };
@@ -1448,7 +1446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (score != null) 'score': score!,
       };
@@ -1487,8 +1485,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1501,7 +1499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1528,7 +1526,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (beginOffset != null) 'beginOffset': beginOffset!,
         if (content != null) 'content': content!,
       };
@@ -1569,7 +1567,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dependencyEdge != null) 'dependencyEdge': dependencyEdge!.toJson(),
         if (lemma != null) 'lemma': lemma!,
         if (partOfSpeech != null) 'partOfSpeech': partOfSpeech!.toJson(),
diff --git a/generated/googleapis/lib/libraryagent/v1.dart b/generated/googleapis/lib/libraryagent/v1.dart
index 234a26d..821aa2d 100644
--- a/generated/googleapis/lib/libraryagent/v1.dart
+++ b/generated/googleapis/lib/libraryagent/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -358,7 +357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (author != null) 'author': author!,
         if (name != null) 'name': name!,
         if (read != null) 'read': read!,
@@ -392,7 +391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (books != null)
           'books': books!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -426,7 +425,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (shelves != null)
           'shelves': shelves!.map((value) => value.toJson()).toList(),
@@ -457,7 +456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (theme != null) 'theme': theme!,
       };
diff --git a/generated/googleapis/lib/licensing/v1.dart b/generated/googleapis/lib/licensing/v1.dart
index c074ab9..93a0217 100644
--- a/generated/googleapis/lib/licensing/v1.dart
+++ b/generated/googleapis/lib/licensing/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -467,7 +466,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Representation of a license assignment.
@@ -538,7 +537,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etags != null) 'etags': etags!,
         if (kind != null) 'kind': kind!,
         if (productId != null) 'productId': productId!,
@@ -563,7 +562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userId != null) 'userId': userId!,
       };
 }
@@ -605,7 +604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/localservices/v1.dart b/generated/googleapis/lib/localservices/v1.dart
index a585d8d..203fceb 100644
--- a/generated/googleapis/lib/localservices/v1.dart
+++ b/generated/googleapis/lib/localservices/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -376,7 +375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (aggregatorInfo != null) 'aggregatorInfo': aggregatorInfo!.toJson(),
         if (averageFiveStarRating != null)
@@ -423,7 +422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregatorProviderId != null)
           'aggregatorProviderId': aggregatorProviderId!,
       };
@@ -541,7 +540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (aggregatorInfo != null) 'aggregatorInfo': aggregatorInfo!.toJson(),
         if (businessName != null) 'businessName': businessName!,
@@ -592,7 +591,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerPhoneNumber != null)
           'consumerPhoneNumber': consumerPhoneNumber!,
         if (customerName != null) 'customerName': customerName!,
@@ -627,7 +626,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chargedCallTimestamp != null)
           'chargedCallTimestamp': chargedCallTimestamp!,
         if (chargedConnectedCallDurationSeconds != null)
@@ -669,7 +668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountReports != null)
           'accountReports':
               accountReports!.map((value) => value.toJson()).toList(),
@@ -709,7 +708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detailedLeadReports != null)
           'detailedLeadReports':
               detailedLeadReports!.map((value) => value.toJson()).toList(),
@@ -739,7 +738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (version != null) 'version': version!,
       };
diff --git a/generated/googleapis/lib/logging/v2.dart b/generated/googleapis/lib/logging/v2.dart
index 4c29a5f..241b479 100644
--- a/generated/googleapis/lib/logging/v2.dart
+++ b/generated/googleapis/lib/logging/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -7664,7 +7663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (usePartitionedTables != null)
           'usePartitionedTables': usePartitionedTables!,
         if (usesTimestampColumnPartitioning != null)
@@ -7714,7 +7713,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (explicitBuckets != null)
           'explicitBuckets': explicitBuckets!.toJson(),
         if (exponentialBuckets != null)
@@ -7784,7 +7783,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
         if (name != null) 'name': name!,
         if (serviceAccountId != null) 'serviceAccountId': serviceAccountId!,
@@ -7805,7 +7804,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Specifies a set of buckets with arbitrary widths.There are size(bounds) + 1
@@ -7830,7 +7829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bounds != null) 'bounds': bounds!,
       };
 }
@@ -7866,7 +7865,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (growthFactor != null) 'growthFactor': growthFactor!,
         if (numFiniteBuckets != null) 'numFiniteBuckets': numFiniteBuckets!,
         if (scale != null) 'scale': scale!,
@@ -8003,7 +8002,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheFillBytes != null) 'cacheFillBytes': cacheFillBytes!,
         if (cacheHit != null) 'cacheHit': cacheHit!,
         if (cacheLookup != null) 'cacheLookup': cacheLookup!,
@@ -8052,7 +8051,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (key != null) 'key': key!,
         if (valueType != null) 'valueType': valueType!,
@@ -8090,7 +8089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numFiniteBuckets != null) 'numFiniteBuckets': numFiniteBuckets!,
         if (offset != null) 'offset': offset!,
         if (width != null) 'width': width!,
@@ -8123,7 +8122,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buckets != null)
           'buckets': buckets!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8156,7 +8155,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclusions != null)
           'exclusions': exclusions!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8185,7 +8184,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8285,7 +8284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
         if (orderBy != null) 'orderBy': orderBy!,
         if (pageSize != null) 'pageSize': pageSize!,
@@ -8330,7 +8329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8363,7 +8362,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null)
           'metrics': metrics!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8398,7 +8397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logNames != null) 'logNames': logNames!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -8431,7 +8430,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resourceDescriptors != null)
           'resourceDescriptors':
@@ -8465,7 +8464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sinks != null)
           'sinks': sinks!.map((value) => value.toJson()).toList(),
@@ -8498,7 +8497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (views != null)
           'views': views!.map((value) => value.toJson()).toList(),
@@ -8542,32 +8541,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -8655,7 +8652,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (lifecycleState != null) 'lifecycleState': lifecycleState!,
@@ -8851,23 +8848,21 @@
       insertId = _json['insertId'] as core.String;
     }
     if (_json.containsKey('jsonPayload')) {
-      jsonPayload = (_json['jsonPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      jsonPayload =
+          (_json['jsonPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('logName')) {
       logName = _json['logName'] as core.String;
@@ -8881,14 +8876,13 @@
           _json['operation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('protoPayload')) {
-      protoPayload = (_json['protoPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      protoPayload =
+          (_json['protoPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('receiveTimestamp')) {
       receiveTimestamp = _json['receiveTimestamp'] as core.String;
@@ -8921,7 +8915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpRequest != null) 'httpRequest': httpRequest!.toJson(),
         if (insertId != null) 'insertId': insertId!,
         if (jsonPayload != null) 'jsonPayload': jsonPayload!,
@@ -8989,7 +8983,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (first != null) 'first': first!,
         if (id != null) 'id': id!,
         if (last != null) 'last': last!,
@@ -9040,7 +9034,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (file != null) 'file': file!,
         if (function != null) 'function': function!,
         if (line != null) 'line': line!,
@@ -9126,7 +9120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (disabled != null) 'disabled': disabled!,
@@ -9181,7 +9175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logMessage != null) 'logMessage': logMessage!,
         if (severity != null) 'severity': severity!,
         if (sourceLocation != null) 'sourceLocation': sourceLocation!.toJson(),
@@ -9330,14 +9324,13 @@
       filter = _json['filter'] as core.String;
     }
     if (_json.containsKey('labelExtractors')) {
-      labelExtractors = (_json['labelExtractors'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      labelExtractors =
+          (_json['labelExtractors'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('metricDescriptor')) {
       metricDescriptor = MetricDescriptor.fromJson(
@@ -9357,7 +9350,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketOptions != null) 'bucketOptions': bucketOptions!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
@@ -9535,7 +9528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigqueryOptions != null)
           'bigqueryOptions': bigqueryOptions!.toJson(),
         if (createTime != null) 'createTime': createTime!,
@@ -9604,7 +9597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (filter != null) 'filter': filter!,
@@ -9822,7 +9815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -9905,7 +9898,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingestDelay != null) 'ingestDelay': ingestDelay!,
         if (launchStage != null) 'launchStage': launchStage!,
         if (samplePeriod != null) 'samplePeriod': samplePeriod!,
@@ -9947,20 +9940,19 @@
 
   MonitoredResource.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (type != null) 'type': type!,
       };
@@ -10081,7 +10073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -10123,28 +10115,26 @@
 
   MonitoredResourceMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('systemLabels')) {
-      systemLabels = (_json['systemLabels'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      systemLabels =
+          (_json['systemLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('userLabels')) {
-      userLabels = (_json['userLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      userLabels =
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (systemLabels != null) 'systemLabels': systemLabels!,
         if (userLabels != null) 'userLabels': userLabels!,
       };
@@ -10392,7 +10382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appEngineRelease != null) 'appEngineRelease': appEngineRelease!,
         if (appId != null) 'appId': appId!,
         if (cost != null) 'cost': cost!,
@@ -10465,7 +10455,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (file != null) 'file': file!,
         if (functionName != null) 'functionName': functionName!,
         if (line != null) 'line': line!,
@@ -10498,7 +10488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (repository != null) 'repository': repository!,
         if (revisionId != null) 'revisionId': revisionId!,
       };
@@ -10531,7 +10521,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reason != null) 'reason': reason!,
         if (suppressedCount != null) 'suppressedCount': suppressedCount!,
       };
@@ -10588,7 +10578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bufferWindow != null) 'bufferWindow': bufferWindow!,
         if (filter != null) 'filter': filter!,
         if (resourceNames != null) 'resourceNames': resourceNames!,
@@ -10629,7 +10619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (suppressionInfo != null)
@@ -10646,7 +10636,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The parameters to WriteLogEntries.
@@ -10743,13 +10733,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('logName')) {
       logName = _json['logName'] as core.String;
@@ -10763,7 +10752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dryRun != null) 'dryRun': dryRun!,
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
@@ -10782,5 +10771,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis/lib/managedidentities/v1.dart b/generated/googleapis/lib/managedidentities/v1.dart
index f2de03f..5b0ccd9 100644
--- a/generated/googleapis/lib/managedidentities/v1.dart
+++ b/generated/googleapis/lib/managedidentities/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1008,7 +1007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (trust != null) 'trust': trust!.toJson(),
       };
 }
@@ -1079,7 +1078,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1094,7 +1093,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Time window specified for daily operations.
@@ -1119,7 +1118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (startTime != null) 'startTime': startTime!.toJson(),
       };
@@ -1165,7 +1164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -1215,7 +1214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!.toJson(),
         if (startDate != null) 'startDate': startDate!.toJson(),
         if (time != null) 'time': time!.toJson(),
@@ -1238,7 +1237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (trust != null) 'trust': trust!.toJson(),
       };
 }
@@ -1359,13 +1358,12 @@
       fqdn = _json['fqdn'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
@@ -1395,7 +1393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (admin != null) 'admin': admin!,
         if (authorizedNetworks != null)
           'authorizedNetworks': authorizedNetworks!,
@@ -1427,7 +1425,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -1491,7 +1489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1558,7 +1556,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -1628,7 +1626,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -1698,7 +1696,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -1834,34 +1832,33 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('maintenancePolicyNames')) {
-      maintenancePolicyNames = (_json['maintenancePolicyNames'] as core.Map)
-          .cast<core.String, core.String>()
+      maintenancePolicyNames = (_json['maintenancePolicyNames']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('maintenanceSchedules')) {
-      maintenanceSchedules = (_json['maintenanceSchedules'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      maintenanceSchedules =
+          (_json['maintenanceSchedules'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('maintenanceSettings')) {
       maintenanceSettings =
@@ -1873,14 +1870,14 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('producerMetadata')) {
-      producerMetadata = (_json['producerMetadata'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      producerMetadata =
+          (_json['producerMetadata'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('provisionedResources')) {
       provisionedResources = (_json['provisionedResources'] as core.List)
@@ -1899,14 +1896,14 @@
               _json['sloMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('softwareVersions')) {
-      softwareVersions = (_json['softwareVersions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      softwareVersions =
+          (_json['softwareVersions'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -1919,7 +1916,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDefinedName != null)
           'consumerDefinedName': consumerDefinedName!,
         if (createTime != null) 'createTime': createTime!,
@@ -1996,7 +1993,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canReschedule != null) 'canReschedule': canReschedule!,
         if (endTime != null) 'endTime': endTime!,
         if (rolloutManagementPolicy != null)
@@ -2049,19 +2046,19 @@
       isRollback = _json['isRollback'] as core.bool;
     }
     if (_json.containsKey('maintenancePolicies')) {
-      maintenancePolicies = (_json['maintenancePolicies'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              MaintenancePolicy.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      maintenancePolicies =
+          (_json['maintenancePolicies'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          MaintenancePolicy.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclude != null) 'exclude': exclude!,
         if (isRollback != null) 'isRollback': isRollback!,
         if (maintenancePolicies != null)
@@ -2113,7 +2110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclusions != null)
           'exclusions': exclusions!.map((value) => value.toJson()).toList(),
         if (location != null) 'location': location!,
@@ -2146,19 +2143,18 @@
   GoogleCloudSaasacceleratorManagementProvidersV1PerSliSloEligibility.fromJson(
       core.Map _json) {
     if (_json.containsKey('eligibilities')) {
-      eligibilities = (_json['eligibilities'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      eligibilities =
+          (_json['eligibilities'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eligibilities != null)
           'eligibilities': eligibilities!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -2193,7 +2189,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceType != null) 'resourceType': resourceType!,
         if (resourceUrl != null) 'resourceUrl': resourceUrl!,
       };
@@ -2224,7 +2220,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eligible != null) 'eligible': eligible!,
         if (reason != null) 'reason': reason!,
       };
@@ -2279,7 +2275,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (reason != null) 'reason': reason!,
         if (sliName != null) 'sliName': sliName!,
@@ -2376,7 +2372,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eligibility != null) 'eligibility': eligibility!.toJson(),
         if (exclusions != null)
           'exclusions': exclusions!.map((value) => value.toJson()).toList(),
@@ -2419,7 +2415,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domains != null)
           'domains': domains!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2449,7 +2445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2478,7 +2474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -2522,32 +2518,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -2617,13 +2611,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2640,7 +2633,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (labels != null) 'labels': labels!,
@@ -2672,7 +2665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dailyCycle != null) 'dailyCycle': dailyCycle!.toJson(),
         if (weeklyCycle != null) 'weeklyCycle': weeklyCycle!.toJson(),
       };
@@ -2732,29 +2725,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2830,7 +2821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (cancelRequested != null) 'cancelRequested': cancelRequested!,
         if (createTime != null) 'createTime': createTime!,
@@ -2936,7 +2927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -2971,7 +2962,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetDnsIpAddresses != null)
           'targetDnsIpAddresses': targetDnsIpAddresses!,
         if (targetDomainName != null) 'targetDomainName': targetDomainName!,
@@ -2986,7 +2977,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for ResetAdminPassword
@@ -3004,7 +2995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (password != null) 'password': password!,
       };
 }
@@ -3046,7 +3037,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (duration != null) 'duration': duration!,
         if (startTime != null) 'startTime': startTime!.toJson(),
@@ -3071,7 +3062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -3109,8 +3100,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3123,7 +3114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -3149,7 +3140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3170,7 +3161,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3220,7 +3211,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
@@ -3354,7 +3345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (lastTrustHeartbeatTime != null)
           'lastTrustHeartbeatTime': lastTrustHeartbeatTime!,
@@ -3414,7 +3405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channel != null) 'channel': channel!,
         if (denyMaintenancePeriods != null)
           'denyMaintenancePeriods':
@@ -3439,7 +3430,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (trust != null) 'trust': trust!.toJson(),
       };
 }
@@ -3462,7 +3453,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (schedule != null)
           'schedule': schedule!.map((value) => value.toJson()).toList(),
       };
diff --git a/generated/googleapis/lib/manufacturers/v1.dart b/generated/googleapis/lib/manufacturers/v1.dart
index a9b712a..a923e06 100644
--- a/generated/googleapis/lib/manufacturers/v1.dart
+++ b/generated/googleapis/lib/manufacturers/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -659,7 +658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalImageLink != null)
           'additionalImageLink':
               additionalImageLink!.map((value) => value.toJson()).toList(),
@@ -732,7 +731,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unit != null) 'unit': unit!,
         if (value != null) 'value': value!,
       };
@@ -760,7 +759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unit != null) 'unit': unit!,
         if (value != null) 'value': value!,
       };
@@ -790,7 +789,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!,
         if (status != null) 'status': status!,
       };
@@ -810,7 +809,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A feature description of the product.
@@ -842,7 +841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headline != null) 'headline': headline!,
         if (image != null) 'image': image!.toJson(),
         if (text != null) 'text': text!,
@@ -904,7 +903,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageUrl != null) 'imageUrl': imageUrl!,
         if (status != null) 'status': status!,
         if (type != null) 'type': type!,
@@ -987,7 +986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attribute != null) 'attribute': attribute!,
         if (description != null) 'description': description!,
         if (destination != null) 'destination': destination!,
@@ -1020,7 +1019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (products != null)
           'products': products!.map((value) => value.toJson()).toList(),
@@ -1046,7 +1045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!,
         if (currency != null) 'currency': currency!,
       };
@@ -1129,7 +1128,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!.toJson(),
         if (contentLanguage != null) 'contentLanguage': contentLanguage!,
         if (destinationStatuses != null)
@@ -1172,7 +1171,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeName != null) 'attributeName': attributeName!,
         if (attributeValue != null) 'attributeValue': attributeValue!,
         if (sectionName != null) 'sectionName': sectionName!,
diff --git a/generated/googleapis/lib/memcache/v1.dart b/generated/googleapis/lib/memcache/v1.dart
index 8e531da..3970e08 100644
--- a/generated/googleapis/lib/memcache/v1.dart
+++ b/generated/googleapis/lib/memcache/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -723,7 +722,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applyAll != null) 'applyAll': applyAll!,
         if (nodeIds != null) 'nodeIds': nodeIds!,
       };
@@ -737,7 +736,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Time window specified for daily operations.
@@ -762,7 +761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (startTime != null) 'startTime': startTime!.toJson(),
       };
@@ -808,7 +807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -858,7 +857,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!.toJson(),
         if (startDate != null) 'startDate': startDate!.toJson(),
         if (time != null) 'time': time!.toJson(),
@@ -879,7 +878,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents the metadata of a long-running operation.
@@ -949,7 +948,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (cancelRequested != null) 'cancelRequested': cancelRequested!,
         if (createTime != null) 'createTime': createTime!,
@@ -1085,34 +1084,33 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('maintenancePolicyNames')) {
-      maintenancePolicyNames = (_json['maintenancePolicyNames'] as core.Map)
-          .cast<core.String, core.String>()
+      maintenancePolicyNames = (_json['maintenancePolicyNames']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('maintenanceSchedules')) {
-      maintenanceSchedules = (_json['maintenanceSchedules'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      maintenanceSchedules =
+          (_json['maintenanceSchedules'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('maintenanceSettings')) {
       maintenanceSettings =
@@ -1124,14 +1122,14 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('producerMetadata')) {
-      producerMetadata = (_json['producerMetadata'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      producerMetadata =
+          (_json['producerMetadata'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('provisionedResources')) {
       provisionedResources = (_json['provisionedResources'] as core.List)
@@ -1150,14 +1148,14 @@
               _json['sloMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('softwareVersions')) {
-      softwareVersions = (_json['softwareVersions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      softwareVersions =
+          (_json['softwareVersions'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -1170,7 +1168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDefinedName != null)
           'consumerDefinedName': consumerDefinedName!,
         if (createTime != null) 'createTime': createTime!,
@@ -1248,7 +1246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canReschedule != null) 'canReschedule': canReschedule!,
         if (endTime != null) 'endTime': endTime!,
         if (rolloutManagementPolicy != null)
@@ -1301,19 +1299,19 @@
       isRollback = _json['isRollback'] as core.bool;
     }
     if (_json.containsKey('maintenancePolicies')) {
-      maintenancePolicies = (_json['maintenancePolicies'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              MaintenancePolicy.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      maintenancePolicies =
+          (_json['maintenancePolicies'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          MaintenancePolicy.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclude != null) 'exclude': exclude!,
         if (isRollback != null) 'isRollback': isRollback!,
         if (maintenancePolicies != null)
@@ -1365,7 +1363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclusions != null)
           'exclusions': exclusions!.map((value) => value.toJson()).toList(),
         if (location != null) 'location': location!,
@@ -1401,7 +1399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceType != null) 'resourceType': resourceType!,
         if (resourceUrl != null) 'resourceUrl': resourceUrl!,
       };
@@ -1432,7 +1430,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eligible != null) 'eligible': eligible!,
         if (reason != null) 'reason': reason!,
       };
@@ -1487,7 +1485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (reason != null) 'reason': reason!,
         if (sliName != null) 'sliName': sliName!,
@@ -1566,7 +1564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eligibility != null) 'eligibility': eligibility!.toJson(),
         if (exclusions != null)
           'exclusions': exclusions!.map((value) => value.toJson()).toList(),
@@ -1707,13 +1705,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('memcacheFullVersion')) {
       memcacheFullVersion = _json['memcacheFullVersion'] as core.String;
@@ -1754,7 +1751,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorizedNetwork != null) 'authorizedNetwork': authorizedNetwork!,
         if (createTime != null) 'createTime': createTime!,
         if (discoveryEndpoint != null) 'discoveryEndpoint': discoveryEndpoint!,
@@ -1801,7 +1798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (message != null) 'message': message!,
       };
@@ -1842,7 +1839,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1872,7 +1869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1901,7 +1898,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1945,32 +1942,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1994,19 +1989,17 @@
 
   LocationMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('availableZones')) {
-      availableZones = (_json['availableZones'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ZoneMetadata.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      availableZones =
+          (_json['availableZones'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ZoneMetadata.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableZones != null)
           'availableZones': availableZones!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -2074,13 +2067,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2097,7 +2089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (labels != null) 'labels': labels!,
@@ -2129,7 +2121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dailyCycle != null) 'dailyCycle': dailyCycle!.toJson(),
         if (weeklyCycle != null) 'weeklyCycle': weeklyCycle!.toJson(),
       };
@@ -2155,17 +2147,16 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (params != null) 'params': params!,
       };
@@ -2234,7 +2225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (nodeId != null) 'nodeId': nodeId!,
         if (parameters != null) 'parameters': parameters!.toJson(),
@@ -2267,7 +2258,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpuCount != null) 'cpuCount': cpuCount!,
         if (memorySizeMb != null) 'memorySizeMb': memorySizeMb!,
       };
@@ -2327,29 +2318,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2425,7 +2414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (cancelRequested != null) 'cancelRequested': cancelRequested!,
         if (createTime != null) 'createTime': createTime!,
@@ -2473,7 +2462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (duration != null) 'duration': duration!,
         if (startTime != null) 'startTime': startTime!.toJson(),
@@ -2513,8 +2502,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2527,7 +2516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2579,7 +2568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
@@ -2609,7 +2598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null) 'parameters': parameters!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -2656,7 +2645,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channel != null) 'channel': channel!,
         if (denyMaintenancePeriods != null)
           'denyMaintenancePeriods':
@@ -2683,7 +2672,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (schedule != null)
           'schedule': schedule!.map((value) => value.toJson()).toList(),
       };
@@ -2696,5 +2685,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis/lib/ml/v1.dart b/generated/googleapis/lib/ml/v1.dart
index 962db26..2d6a37b 100644
--- a/generated/googleapis/lib/ml/v1.dart
+++ b/generated/googleapis/lib/ml/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2316,8 +2315,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2327,7 +2326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (data != null) 'data': data!,
         if (extensions != null) 'extensions': extensions!,
@@ -2350,7 +2349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (useElapsedTime != null) 'useElapsedTime': useElapsedTime!,
       };
 }
@@ -2377,7 +2376,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (useElapsedTime != null) 'useElapsedTime': useElapsedTime!,
       };
 }
@@ -2402,7 +2401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectiveValue != null) 'objectiveValue': objectiveValue!,
         if (trainingStep != null) 'trainingStep': trainingStep!,
       };
@@ -2431,7 +2430,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metric != null) 'metric': metric!,
         if (value != null) 'value': value!,
       };
@@ -2454,7 +2453,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -2478,7 +2477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -2506,7 +2505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxValue != null) 'maxValue': maxValue!,
         if (minValue != null) 'minValue': minValue!,
       };
@@ -2535,7 +2534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxValue != null) 'maxValue': maxValue!,
         if (minValue != null) 'minValue': minValue!,
       };
@@ -2559,7 +2558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -2582,7 +2581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -2605,7 +2604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null) 'values': values!,
       };
 }
@@ -2637,7 +2636,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (goal != null) 'goal': goal!,
         if (metric != null) 'metric': metric!,
       };
@@ -2766,7 +2765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoricalValueSpec != null)
           'categoricalValueSpec': categoricalValueSpec!.toJson(),
         if (childParameterSpecs != null)
@@ -2824,7 +2823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (floatValue != null) 'floatValue': floatValue!,
         if (intValue != null) 'intValue': intValue!,
         if (parameter != null) 'parameter': parameter!,
@@ -2867,7 +2866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (type != null) 'type': type!,
       };
@@ -2889,7 +2888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (measurement != null) 'measurement': measurement!.toJson(),
       };
 }
@@ -2952,7 +2951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxNodes != null) 'maxNodes': maxNodes!,
         if (metrics != null)
           'metrics': metrics!.map((value) => value.toJson()).toList(),
@@ -2987,7 +2986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (decayCurveStoppingConfig != null)
           'decayCurveStoppingConfig': decayCurveStoppingConfig!.toJson(),
         if (medianAutomatedStoppingConfig != null)
@@ -3030,7 +3029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (framework != null) 'framework': framework!,
         if (modelPath != null) 'modelPath': modelPath!,
         if (pythonVersion != null) 'pythonVersion': pythonVersion!,
@@ -3046,7 +3045,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 class GoogleCloudMlV1Capability {
@@ -3074,7 +3073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableAccelerators != null)
           'availableAccelerators': availableAccelerators!,
         if (type != null) 'type': type!,
@@ -3109,7 +3108,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (study != null) 'study': study!,
         if (trial != null) 'trial': trial!,
@@ -3124,7 +3123,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The message will be placed in the response field of a completed
@@ -3154,7 +3153,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (shouldStop != null) 'shouldStop': shouldStop!,
         if (startTime != null) 'startTime': startTime!,
@@ -3198,7 +3197,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (finalMeasurement != null)
           'finalMeasurement': finalMeasurement!.toJson(),
         if (infeasibleReason != null) 'infeasibleReason': infeasibleReason!,
@@ -3218,7 +3217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tpuServiceAccount != null) 'tpuServiceAccount': tpuServiceAccount!,
       };
 }
@@ -3241,7 +3240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerPort != null) 'containerPort': containerPort!,
       };
 }
@@ -3408,7 +3407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (args != null) 'args': args!,
         if (command != null) 'command': command!,
         if (env != null) 'env': env!.map((value) => value.toJson()).toList(),
@@ -3440,7 +3439,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bootDiskSizeGb != null) 'bootDiskSizeGb': bootDiskSizeGb!,
         if (bootDiskType != null) 'bootDiskType': bootDiskType!,
       };
@@ -3464,7 +3463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
       };
 }
@@ -3507,7 +3506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -3529,7 +3528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpBody != null) 'httpBody': httpBody!.toJson(),
       };
 }
@@ -3581,7 +3580,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (integratedGradientsAttribution != null)
           'integratedGradientsAttribution':
               integratedGradientsAttribution!.toJson(),
@@ -3617,7 +3616,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (serviceAccount != null) 'serviceAccount': serviceAccount!,
         if (serviceAccountProject != null)
@@ -3707,14 +3706,13 @@
               _json['finalMetric'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hyperparameters')) {
-      hyperparameters = (_json['hyperparameters'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      hyperparameters =
+          (_json['hyperparameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('isTrialStoppedEarly')) {
       isTrialStoppedEarly = _json['isTrialStoppedEarly'] as core.bool;
@@ -3730,7 +3728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allMetrics != null)
           'allMetrics': allMetrics!.map((value) => value.toJson()).toList(),
         if (builtInAlgorithmOutput != null)
@@ -3869,7 +3867,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (enableTrialEarlyStopping != null)
           'enableTrialEarlyStopping': enableTrialEarlyStopping!,
@@ -3905,7 +3903,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numIntegralSteps != null) 'numIntegralSteps': numIntegralSteps!,
       };
 }
@@ -4011,13 +4009,12 @@
       jobId = _json['jobId'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('predictionInput')) {
       predictionInput = GoogleCloudMlV1PredictionInput.fromJson(
@@ -4043,7 +4040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
         if (errorMessage != null) 'errorMessage': errorMessage!,
@@ -4086,7 +4083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -4117,7 +4114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4149,7 +4146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (models != null)
           'models': models!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4164,7 +4161,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for the ListOptimalTrials method.
@@ -4187,7 +4184,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (trials != null)
           'trials': trials!.map((value) => value.toJson()).toList(),
       };
@@ -4208,7 +4205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (studies != null)
           'studies': studies!.map((value) => value.toJson()).toList(),
       };
@@ -4230,7 +4227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (trials != null)
           'trials': trials!.map((value) => value.toJson()).toList(),
       };
@@ -4262,7 +4259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (versions != null)
           'versions': versions!.map((value) => value.toJson()).toList(),
@@ -4289,7 +4286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (capabilities != null)
           'capabilities': capabilities!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -4314,7 +4311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodes != null) 'nodes': nodes!,
       };
 }
@@ -4352,7 +4349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (elapsedTime != null) 'elapsedTime': elapsedTime!,
         if (metrics != null)
           'metrics': metrics!.map((value) => value.toJson()).toList(),
@@ -4386,7 +4383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (target != null) 'target': target!,
       };
@@ -4494,13 +4491,12 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4519,7 +4515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultVersion != null) 'defaultVersion': defaultVersion!.toJson(),
         if (description != null) 'description': description!,
         if (etag != null) 'etag': etag!,
@@ -4584,13 +4580,12 @@
       isCancellationRequested = _json['isCancellationRequested'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('modelName')) {
       modelName = _json['modelName'] as core.String;
@@ -4610,7 +4605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
         if (isCancellationRequested != null)
@@ -4720,7 +4715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoricalValues != null) 'categoricalValues': categoricalValues!,
         if (discreteValues != null) 'discreteValues': discreteValues!,
         if (maxValue != null) 'maxValue': maxValue!,
@@ -4749,7 +4744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpBody != null) 'httpBody': httpBody!.toJson(),
       };
 }
@@ -4905,7 +4900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchSize != null) 'batchSize': batchSize!,
         if (dataFormat != null) 'dataFormat': dataFormat!,
         if (inputPaths != null) 'inputPaths': inputPaths!,
@@ -4953,7 +4948,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorCount != null) 'errorCount': errorCount!,
         if (nodeHours != null) 'nodeHours': nodeHours!,
         if (outputPath != null) 'outputPath': outputPath!,
@@ -5048,7 +5043,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorConfig != null)
           'acceleratorConfig': acceleratorConfig!.toJson(),
         if (containerArgs != null) 'containerArgs': containerArgs!,
@@ -5101,7 +5096,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigqueryTableName != null) 'bigqueryTableName': bigqueryTableName!,
         if (samplingPercentage != null)
           'samplingPercentage': samplingPercentage!,
@@ -5167,7 +5162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (health != null) 'health': health!,
         if (predict != null) 'predict': predict!,
       };
@@ -5191,7 +5186,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numPaths != null) 'numPaths': numPaths!,
       };
 }
@@ -5252,7 +5247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxRunningTime != null) 'maxRunningTime': maxRunningTime!,
         if (maxWaitTime != null) 'maxWaitTime': maxWaitTime!,
       };
@@ -5266,7 +5261,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 class GoogleCloudMlV1StopTrialRequest {
@@ -5276,7 +5271,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A message representing a Study.
@@ -5335,7 +5330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (inactiveReason != null) 'inactiveReason': inactiveReason!,
         if (name != null) 'name': name!,
@@ -5395,7 +5390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (automatedStoppingConfig != null)
           'automatedStoppingConfig': automatedStoppingConfig!.toJson(),
@@ -5438,7 +5433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientId != null) 'clientId': clientId!,
         if (createTime != null) 'createTime': createTime!,
         if (study != null) 'study': study!,
@@ -5473,7 +5468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientId != null) 'clientId': clientId!,
         if (suggestionCount != null) 'suggestionCount': suggestionCount!,
       };
@@ -5520,7 +5515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
         if (studyState != null) 'studyState': studyState!,
@@ -5930,7 +5925,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (args != null) 'args': args!,
         if (encryptionConfig != null)
           'encryptionConfig': encryptionConfig!.toJson(),
@@ -6035,7 +6030,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (builtInAlgorithmOutput != null)
           'builtInAlgorithmOutput': builtInAlgorithmOutput!.toJson(),
         if (completedTrialCount != null)
@@ -6154,7 +6149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientId != null) 'clientId': clientId!,
         if (endTime != null) 'endTime': endTime!,
         if (finalMeasurement != null)
@@ -6506,13 +6501,12 @@
       isDefault = _json['isDefault'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lastMigrationModelId')) {
       lastMigrationModelId = _json['lastMigrationModelId'] as core.String;
@@ -6563,7 +6557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorConfig != null)
           'acceleratorConfig': acceleratorConfig!.toJson(),
         if (autoScaling != null) 'autoScaling': autoScaling!.toJson(),
@@ -6617,7 +6611,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numIntegralSteps != null) 'numIntegralSteps': numIntegralSteps!,
       };
 }
@@ -6664,7 +6658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -6706,7 +6700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -6778,7 +6772,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -6890,7 +6884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -6927,7 +6921,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -6952,7 +6946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -6973,7 +6967,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -7001,7 +6995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -7062,29 +7056,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -7107,7 +7099,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -7143,8 +7135,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -7157,7 +7149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -7225,7 +7217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
diff --git a/generated/googleapis/lib/monitoring/v3.dart b/generated/googleapis/lib/monitoring/v3.dart
index bfe0d2e..2777180 100644
--- a/generated/googleapis/lib/monitoring/v3.dart
+++ b/generated/googleapis/lib/monitoring/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -4394,7 +4393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alignmentPeriod != null) 'alignmentPeriod': alignmentPeriod!,
         if (crossSeriesReducer != null)
           'crossSeriesReducer': crossSeriesReducer!,
@@ -4544,14 +4543,13 @@
           .toList();
     }
     if (_json.containsKey('userLabels')) {
-      userLabels = (_json['userLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      userLabels =
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('validity')) {
       validity = Status.fromJson(
@@ -4559,7 +4557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (combiner != null) 'combiner': combiner!,
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
@@ -4594,7 +4592,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (moduleId != null) 'moduleId': moduleId!,
       };
 }
@@ -4607,7 +4605,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The authentication parameters to provide to the specified resource or URL
@@ -4633,7 +4631,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (password != null) 'password': password!,
         if (username != null) 'username': username!,
       };
@@ -4706,7 +4704,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availability != null) 'availability': availability!.toJson(),
         if (latency != null) 'latency': latency!.toJson(),
         if (location != null) 'location': location!,
@@ -4757,7 +4755,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (explicitBuckets != null)
           'explicitBuckets': explicitBuckets!.toJson(),
         if (exponentialBuckets != null)
@@ -4784,7 +4782,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!,
       };
 }
@@ -4833,7 +4831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterName != null) 'clusterName': clusterName!,
         if (location != null) 'location': location!,
         if (serviceName != null) 'serviceName': serviceName!,
@@ -4886,14 +4884,12 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = (_json['metadata'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              TypedValue.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          TypedValue.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('plugin')) {
       plugin = _json['plugin'] as core.String;
@@ -4918,7 +4914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (metadata != null)
           'metadata':
@@ -4967,7 +4963,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (index != null) 'index': index!,
         if (valueErrors != null)
@@ -5015,7 +5011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceName != null) 'dataSourceName': dataSourceName!,
         if (dataSourceType != null) 'dataSourceType': dataSourceType!,
         if (value != null) 'value': value!.toJson(),
@@ -5043,7 +5039,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (index != null) 'index': index!,
       };
@@ -5114,7 +5110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conditionAbsent != null)
           'conditionAbsent': conditionAbsent!.toJson(),
         if (conditionMonitoringQueryLanguage != null)
@@ -5173,7 +5169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (matcher != null) 'matcher': matcher!,
       };
@@ -5214,7 +5210,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collectdPayloads != null)
           'collectdPayloads':
               collectdPayloads!.map((value) => value.toJson()).toList(),
@@ -5255,7 +5251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payloadErrors != null)
           'payloadErrors':
               payloadErrors!.map((value) => value.toJson()).toList(),
@@ -5287,7 +5283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (timeSeries != null)
           'timeSeries': timeSeries!.map((value) => value.toJson()).toList(),
       };
@@ -5323,7 +5319,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
         if (successPointCount != null) 'successPointCount': successPointCount!,
@@ -5341,7 +5337,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Distribution contains summary statistics for a population of values.
@@ -5437,7 +5433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketCounts != null) 'bucketCounts': bucketCounts!,
         if (bucketOptions != null) 'bucketOptions': bucketOptions!.toJson(),
         if (count != null) 'count': count!,
@@ -5480,7 +5476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (distributionFilter != null)
           'distributionFilter': distributionFilter!,
         if (range != null) 'range': range!.toJson(),
@@ -5512,7 +5508,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -5540,16 +5536,16 @@
 
   DroppedLabels.fromJson(core.Map _json) {
     if (_json.containsKey('label')) {
-      label = (_json['label'] as core.Map).cast<core.String, core.String>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      label = (_json['label'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
       };
 }
@@ -5568,7 +5564,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Detailed information about an error category.
@@ -5591,7 +5587,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pointCount != null) 'pointCount': pointCount!,
         if (status != null) 'status': status!.toJson(),
       };
@@ -5631,8 +5627,8 @@
   Exemplar.fromJson(core.Map _json) {
     if (_json.containsKey('attachments')) {
       attachments = (_json['attachments'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -5648,7 +5644,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachments != null) 'attachments': attachments!,
         if (timestamp != null) 'timestamp': timestamp!,
         if (value != null) 'value': value!,
@@ -5677,7 +5673,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bounds != null) 'bounds': bounds!,
       };
 }
@@ -5713,7 +5709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (growthFactor != null) 'growthFactor': growthFactor!,
         if (numFiniteBuckets != null) 'numFiniteBuckets': numFiniteBuckets!,
         if (scale != null) 'scale': scale!,
@@ -5822,7 +5818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cardinality != null) 'cardinality': cardinality!,
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (jsonName != null) 'jsonName': jsonName!,
@@ -5860,7 +5856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expireTime != null) 'expireTime': expireTime!,
       };
 }
@@ -5890,7 +5886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (expireTime != null) 'expireTime': expireTime!,
       };
@@ -5918,7 +5914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (max != null) 'max': max!,
         if (min != null) 'min': min!,
       };
@@ -5995,7 +5991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (filter != null) 'filter': filter!,
         if (isCluster != null) 'isCluster': isCluster!,
@@ -6111,13 +6107,12 @@
       contentType = _json['contentType'] as core.String;
     }
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('maskHeaders')) {
       maskHeaders = _json['maskHeaders'] as core.bool;
@@ -6139,7 +6134,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authInfo != null) 'authInfo': authInfo!.toJson(),
         if (body != null) 'body': body!,
         if (contentType != null) 'contentType': contentType!,
@@ -6225,7 +6220,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (gcpZone != null) 'gcpZone': gcpZone!,
         if (name != null) 'name': name!,
@@ -6274,7 +6269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalService != null) 'canonicalService': canonicalService!,
         if (canonicalServiceNamespace != null)
           'canonicalServiceNamespace': canonicalServiceNamespace!,
@@ -6317,7 +6312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (key != null) 'key': key!,
         if (valueType != null) 'valueType': valueType!,
@@ -6349,7 +6344,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (int64Value != null) 'int64Value': int64Value!,
         if (stringValue != null) 'stringValue': stringValue!,
@@ -6370,7 +6365,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (threshold != null) 'threshold': threshold!,
       };
 }
@@ -6406,7 +6401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numFiniteBuckets != null) 'numFiniteBuckets': numFiniteBuckets!,
         if (offset != null) 'offset': offset!,
         if (width != null) 'width': width!,
@@ -6448,7 +6443,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alertPolicies != null)
           'alertPolicies':
               alertPolicies!.map((value) => value.toJson()).toList(),
@@ -6489,7 +6484,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (members != null)
           'members': members!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6523,7 +6518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (group != null)
           'group': group!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6557,7 +6552,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricDescriptors != null)
           'metricDescriptors':
               metricDescriptors!.map((value) => value.toJson()).toList(),
@@ -6593,7 +6588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resourceDescriptors != null)
           'resourceDescriptors':
@@ -6629,7 +6624,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelDescriptors != null)
           'channelDescriptors':
               channelDescriptors!.map((value) => value.toJson()).toList(),
@@ -6672,7 +6667,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (notificationChannels != null)
           'notificationChannels':
@@ -6707,7 +6702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (serviceLevelObjectives != null)
           'serviceLevelObjectives':
@@ -6741,7 +6736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (services != null)
           'services': services!.map((value) => value.toJson()).toList(),
@@ -6795,7 +6790,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionErrors != null)
           'executionErrors':
               executionErrors!.map((value) => value.toJson()).toList(),
@@ -6841,7 +6836,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (totalSize != null) 'totalSize': totalSize!,
         if (uptimeCheckConfigs != null)
@@ -6879,7 +6874,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (uptimeCheckIps != null)
           'uptimeCheckIps':
@@ -6922,7 +6917,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (meshUid != null) 'meshUid': meshUid!,
         if (serviceName != null) 'serviceName': serviceName!,
         if (serviceNamespace != null) 'serviceNamespace': serviceNamespace!,
@@ -6946,20 +6941,19 @@
 
   Metric.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (type != null) 'type': type!,
       };
@@ -7036,7 +7030,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregations != null)
           'aggregations': aggregations!.map((value) => value.toJson()).toList(),
         if (duration != null) 'duration': duration!,
@@ -7254,7 +7248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -7337,7 +7331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingestDelay != null) 'ingestDelay': ingestDelay!,
         if (launchStage != null) 'launchStage': launchStage!,
         if (samplePeriod != null) 'samplePeriod': samplePeriod!,
@@ -7370,7 +7364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
         if (timeSeries != null) 'timeSeries': timeSeries!,
       };
@@ -7508,7 +7502,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregations != null)
           'aggregations': aggregations!.map((value) => value.toJson()).toList(),
         if (comparison != null) 'comparison': comparison!,
@@ -7559,20 +7553,19 @@
 
   MonitoredResource.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (type != null) 'type': type!,
       };
@@ -7693,7 +7686,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -7735,28 +7728,26 @@
 
   MonitoredResourceMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('systemLabels')) {
-      systemLabels = (_json['systemLabels'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      systemLabels =
+          (_json['systemLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('userLabels')) {
-      userLabels = (_json['userLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      userLabels =
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (systemLabels != null) 'systemLabels': systemLabels!,
         if (userLabels != null) 'userLabels': userLabels!,
       };
@@ -7806,7 +7797,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (query != null) 'query': query!,
         if (trigger != null) 'trigger': trigger!.toJson(),
@@ -7832,7 +7823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mutateTime != null) 'mutateTime': mutateTime!,
         if (mutatedBy != null) 'mutatedBy': mutatedBy!,
       };
@@ -7949,13 +7940,12 @@
       enabled = _json['enabled'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('mutationRecords')) {
       mutationRecords = (_json['mutationRecords'] as core.List)
@@ -7970,21 +7960,20 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('userLabels')) {
-      userLabels = (_json['userLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      userLabels =
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('verificationStatus')) {
       verificationStatus = _json['verificationStatus'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationRecord != null) 'creationRecord': creationRecord!.toJson(),
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -8098,7 +8087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -8137,16 +8126,16 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = (_json['value'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      value = (_json['value'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -8180,7 +8169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicSliPerformance != null)
           'basicSliPerformance': basicSliPerformance!.toJson(),
         if (performance != null) 'performance': performance!.toJson(),
@@ -8218,7 +8207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (interval != null) 'interval': interval!.toJson(),
         if (value != null) 'value': value!.toJson(),
       };
@@ -8251,7 +8240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (timeInterval != null) 'timeInterval': timeInterval!.toJson(),
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
@@ -8293,7 +8282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
         if (query != null) 'query': query!,
@@ -8345,7 +8334,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (partialErrors != null)
           'partialErrors':
@@ -8377,7 +8366,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (max != null) 'max': max!,
         if (min != null) 'min': min!,
       };
@@ -8410,7 +8399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (distributionCut != null)
           'distributionCut': distributionCut!.toJson(),
         if (goodTotalRatio != null) 'goodTotalRatio': goodTotalRatio!.toJson(),
@@ -8447,7 +8436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupId != null) 'groupId': groupId!,
         if (resourceType != null) 'resourceType': resourceType!,
       };
@@ -8461,7 +8450,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A Service is a discrete, autonomous, and network-accessible unit, designed
@@ -8543,7 +8532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appEngine != null) 'appEngine': appEngine!.toJson(),
         if (cloudEndpoints != null) 'cloudEndpoints': cloudEndpoints!.toJson(),
         if (clusterIstio != null) 'clusterIstio': clusterIstio!.toJson(),
@@ -8598,7 +8587,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicSli != null) 'basicSli': basicSli!.toJson(),
         if (requestBased != null) 'requestBased': requestBased!.toJson(),
         if (windowsBased != null) 'windowsBased': windowsBased!.toJson(),
@@ -8682,7 +8671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calendarPeriod != null) 'calendarPeriod': calendarPeriod!,
         if (displayName != null) 'displayName': displayName!,
         if (goal != null) 'goal': goal!,
@@ -8710,7 +8699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileName != null) 'fileName': fileName!,
       };
 }
@@ -8737,7 +8726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (spanName != null) 'spanName': spanName!,
       };
 }
@@ -8775,8 +8764,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -8789,7 +8778,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -8812,7 +8801,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (port != null) 'port': port!,
       };
 }
@@ -8833,7 +8822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceName != null) 'resourceName': resourceName!,
       };
 }
@@ -8890,7 +8879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -9009,7 +8998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (metric != null) 'metric': metric!.toJson(),
         if (metricKind != null) 'metricKind': metricKind!,
@@ -9052,7 +9041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelValues != null)
           'labelValues': labelValues!.map((value) => value.toJson()).toList(),
         if (pointData != null)
@@ -9085,7 +9074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labelDescriptors != null)
           'labelDescriptors':
               labelDescriptors!.map((value) => value.toJson()).toList(),
@@ -9139,7 +9128,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (badServiceFilter != null) 'badServiceFilter': badServiceFilter!,
         if (goodServiceFilter != null) 'goodServiceFilter': goodServiceFilter!,
         if (totalServiceFilter != null)
@@ -9170,7 +9159,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (percent != null) 'percent': percent!,
       };
@@ -9231,7 +9220,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -9286,7 +9275,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (distributionValue != null)
           'distributionValue': distributionValue!.toJson(),
@@ -9428,7 +9417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentMatchers != null)
           'contentMatchers':
               contentMatchers!.map((value) => value.toJson()).toList(),
@@ -9493,7 +9482,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (location != null) 'location': location!,
         if (region != null) 'region': region!,
@@ -9553,7 +9542,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (metricKind != null) 'metricKind': metricKind!,
         if (unit != null) 'unit': unit!,
@@ -9583,7 +9572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
       };
 }
@@ -9640,7 +9629,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (goodBadMetricFilter != null)
           'goodBadMetricFilter': goodBadMetricFilter!,
         if (goodTotalRatioThreshold != null)
diff --git a/generated/googleapis/lib/mybusinessaccountmanagement/v1.dart b/generated/googleapis/lib/mybusinessaccountmanagement/v1.dart
index a5a55f8..0f3f153 100644
--- a/generated/googleapis/lib/mybusinessaccountmanagement/v1.dart
+++ b/generated/googleapis/lib/mybusinessaccountmanagement/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -767,7 +766,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An account is a container for your location.
@@ -916,7 +915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountName != null) 'accountName': accountName!,
         if (accountNumber != null) 'accountNumber': accountNumber!,
         if (name != null) 'name': name!,
@@ -991,7 +990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (admin != null) 'admin': admin!,
         if (name != null) 'name': name!,
         if (pendingInvitation != null) 'pendingInvitation': pendingInvitation!,
@@ -1007,7 +1006,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -1024,7 +1023,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a pending invitation.
@@ -1087,7 +1086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (role != null) 'role': role!,
         if (targetAccount != null) 'targetAccount': targetAccount!.toJson(),
@@ -1112,7 +1111,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountAdmins != null)
           'accountAdmins':
               accountAdmins!.map((value) => value.toJson()).toList(),
@@ -1148,7 +1147,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accounts != null)
           'accounts': accounts!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1173,7 +1172,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (invitations != null)
           'invitations': invitations!.map((value) => value.toJson()).toList(),
       };
@@ -1195,7 +1194,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (admins != null)
           'admins': admins!.map((value) => value.toJson()).toList(),
       };
@@ -1233,7 +1232,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!.toJson(),
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
         if (registeredDomain != null) 'registeredDomain': registeredDomain!,
@@ -1403,7 +1402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressLines != null) 'addressLines': addressLines!,
         if (administrativeArea != null)
           'administrativeArea': administrativeArea!,
@@ -1438,7 +1437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (locationName != null) 'locationName': locationName!,
       };
diff --git a/generated/googleapis/lib/networkmanagement/v1.dart b/generated/googleapis/lib/networkmanagement/v1.dart
index 48bc47c..79700ab 100644
--- a/generated/googleapis/lib/networkmanagement/v1.dart
+++ b/generated/googleapis/lib/networkmanagement/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -884,7 +883,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cause != null) 'cause': cause!,
         if (resourceUri != null) 'resourceUri': resourceUri!,
       };
@@ -931,7 +930,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -973,7 +972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1050,7 +1049,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindingId != null) 'bindingId': bindingId!,
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
@@ -1066,7 +1065,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A Connectivity Test for a network reachability analysis.
@@ -1170,13 +1169,12 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1202,7 +1200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (destination != null) 'destination': destination!.toJson(),
@@ -1242,7 +1240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceUri != null) 'resourceUri': resourceUri!,
         if (target != null) 'target': target!,
       };
@@ -1312,7 +1310,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cause != null) 'cause': cause!,
         if (resourceUri != null) 'resourceUri': resourceUri!,
       };
@@ -1332,7 +1330,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Source or destination of the Connectivity Test.
@@ -1401,7 +1399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!,
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (network != null) 'network': network!,
@@ -1468,7 +1466,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationIp != null) 'destinationIp': destinationIp!,
         if (destinationNetworkUri != null)
           'destinationNetworkUri': destinationNetworkUri!,
@@ -1541,7 +1539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1612,7 +1610,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (direction != null) 'direction': direction!,
         if (displayName != null) 'displayName': displayName!,
@@ -1653,7 +1651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceUri != null) 'resourceUri': resourceUri!,
         if (target != null) 'target': target!,
       };
@@ -1712,7 +1710,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (matchedPortRange != null) 'matchedPortRange': matchedPortRange!,
         if (matchedProtocol != null) 'matchedProtocol': matchedProtocol!,
@@ -1782,7 +1780,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (externalIp != null) 'externalIp': externalIp!,
         if (interface != null) 'interface': interface!,
@@ -1825,7 +1823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (resources != null)
           'resources': resources!.map((value) => value.toJson()).toList(),
@@ -1855,7 +1853,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1884,7 +1882,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1947,7 +1945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (healthCheckAllowingFirewallRules != null)
           'healthCheckAllowingFirewallRules': healthCheckAllowingFirewallRules!,
@@ -2012,7 +2010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backendType != null) 'backendType': backendType!,
         if (backendUri != null) 'backendUri': backendUri!,
         if (backends != null)
@@ -2059,32 +2057,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -2120,7 +2116,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (matchedIpRange != null) 'matchedIpRange': matchedIpRange!,
         if (uri != null) 'uri': uri!,
@@ -2181,29 +2177,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2262,7 +2256,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (cancelRequested != null) 'cancelRequested': cancelRequested!,
         if (createTime != null) 'createTime': createTime!,
@@ -2377,7 +2371,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -2441,7 +2435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (result != null) 'result': result!,
         if (traces != null)
@@ -2458,7 +2452,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// For display only.
@@ -2556,7 +2550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destIpRange != null) 'destIpRange': destIpRange!,
         if (displayName != null) 'displayName': displayName!,
         if (instanceTags != null) 'instanceTags': instanceTags!,
@@ -2596,7 +2590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -2635,8 +2629,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2649,7 +2643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2824,7 +2818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (abort != null) 'abort': abort!.toJson(),
         if (causesDrop != null) 'causesDrop': causesDrop!,
         if (deliver != null) 'deliver': deliver!.toJson(),
@@ -2864,7 +2858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2885,7 +2879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2929,7 +2923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endpointInfo != null) 'endpointInfo': endpointInfo!.toJson(),
         if (steps != null)
           'steps': steps!.map((value) => value.toJson()).toList(),
@@ -2984,7 +2978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (networkUri != null) 'networkUri': networkUri!,
@@ -3062,7 +3056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (networkUri != null) 'networkUri': networkUri!,
         if (region != null) 'region': region!,
diff --git a/generated/googleapis/lib/notebooks/v1.dart b/generated/googleapis/lib/notebooks/v1.dart
index 2c75848..d1b34f3 100644
--- a/generated/googleapis/lib/notebooks/v1.dart
+++ b/generated/googleapis/lib/notebooks/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1844,7 +1843,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coreCount != null) 'coreCount': coreCount!,
         if (type != null) 'type': type!,
       };
@@ -1916,7 +1915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1931,7 +1930,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Definition of a container image for starting a notebook instance with the
@@ -1960,7 +1959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (repository != null) 'repository': repository!,
         if (tag != null) 'tag': tag!,
       };
@@ -2086,7 +2085,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoDelete != null) 'autoDelete': autoDelete!,
         if (boot != null) 'boot': boot!,
         if (deviceName != null) 'deviceName': deviceName!,
@@ -2118,7 +2117,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Definition of a software environment that is used to start a notebook
@@ -2184,7 +2183,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerImage != null) 'containerImage': containerImage!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
@@ -2279,7 +2278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -2397,13 +2396,12 @@
       inputNotebookFile = _json['inputNotebookFile'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('masterType')) {
       masterType = _json['masterType'] as core.String;
@@ -2419,7 +2417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorConfig != null)
           'acceleratorConfig': acceleratorConfig!.toJson(),
         if (containerImageUri != null) 'containerImageUri': containerImageUri!,
@@ -2494,7 +2492,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2532,21 +2530,20 @@
 
   GetInstanceHealthResponse.fromJson(core.Map _json) {
     if (_json.containsKey('healthInfo')) {
-      healthInfo = (_json['healthInfo'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      healthInfo =
+          (_json['healthInfo'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('healthState')) {
       healthState = _json['healthState'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healthInfo != null) 'healthInfo': healthInfo!,
         if (healthState != null) 'healthState': healthState!,
       };
@@ -2569,7 +2566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -2838,25 +2835,23 @@
       kmsKey = _json['kmsKey'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('machineType')) {
       machineType = _json['machineType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2918,7 +2913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorConfig != null)
           'acceleratorConfig': acceleratorConfig!.toJson(),
         if (bootDiskSizeGb != null) 'bootDiskSizeGb': bootDiskSizeGb!,
@@ -2989,7 +2984,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (upgradeInfo != null) 'upgradeInfo': upgradeInfo!,
         if (upgradeVersion != null) 'upgradeVersion': upgradeVersion!,
         if (upgradeable != null) 'upgradeable': upgradeable!,
@@ -3027,7 +3022,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environments != null)
           'environments': environments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3070,7 +3065,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executions != null)
           'executions': executions!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3112,7 +3107,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3142,7 +3137,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3171,7 +3166,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -3213,7 +3208,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (schedules != null)
           'schedules': schedules!.map((value) => value.toJson()).toList(),
@@ -3258,32 +3253,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -3346,29 +3339,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -3436,7 +3427,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -3544,7 +3535,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -3571,7 +3562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceId != null) 'instanceId': instanceId!,
       };
 }
@@ -3594,20 +3585,19 @@
 
   ReportInstanceInfoRequest.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('vmId')) {
       vmId = _json['vmId'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!,
         if (vmId != null) 'vmId': vmId!,
       };
@@ -3621,7 +3611,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The definition of a schedule.
@@ -3719,7 +3709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (cronSchedule != null) 'cronSchedule': cronSchedule!,
         if (description != null) 'description': description!,
@@ -3765,7 +3755,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coreCount != null) 'coreCount': coreCount!,
         if (type != null) 'type': type!,
       };
@@ -3789,7 +3779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -3837,7 +3827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coreCount != null) 'coreCount': coreCount!,
         if (type != null) 'type': type!,
       };
@@ -3854,17 +3844,16 @@
 
   SetInstanceLabelsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
       };
 }
@@ -3885,7 +3874,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (machineType != null) 'machineType': machineType!,
       };
 }
@@ -3930,7 +3919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableIntegrityMonitoring != null)
           'enableIntegrityMonitoring': enableIntegrityMonitoring!,
         if (enableSecureBoot != null) 'enableSecureBoot': enableSecureBoot!,
@@ -3946,7 +3935,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -3982,8 +3971,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3996,7 +3985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4011,7 +4000,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for `TestIamPermissions` method.
@@ -4033,7 +4022,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4054,7 +4043,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4067,7 +4056,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The entry of VM image upgrade history.
@@ -4144,7 +4133,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (containerImage != null) 'containerImage': containerImage!,
         if (createTime != null) 'createTime': createTime!,
@@ -4174,7 +4163,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vmId != null) 'vmId': vmId!,
       };
 }
@@ -4187,7 +4176,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Definition of a custom Compute Engine virtual machine image for starting a
@@ -4221,7 +4210,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageFamily != null) 'imageFamily': imageFamily!,
         if (imageName != null) 'imageName': imageName!,
         if (project != null) 'project': project!,
diff --git a/generated/googleapis/lib/oauth2/v2.dart b/generated/googleapis/lib/oauth2/v2.dart
index 76da8ed..6ef6d5f 100644
--- a/generated/googleapis/lib/oauth2/v2.dart
+++ b/generated/googleapis/lib/oauth2/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -236,7 +235,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audience != null) 'audience': audience!,
         if (email != null) 'email': email!,
         if (expiresIn != null) 'expires_in': expiresIn!,
@@ -321,7 +320,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (familyName != null) 'family_name': familyName!,
         if (gender != null) 'gender': gender!,
diff --git a/generated/googleapis/lib/osconfig/v1.dart b/generated/googleapis/lib/osconfig/v1.dart
index 43d23e5..f0d591a 100644
--- a/generated/googleapis/lib/osconfig/v1.dart
+++ b/generated/googleapis/lib/osconfig/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -542,7 +541,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludes != null) 'excludes': excludes!,
         if (exclusivePackages != null) 'exclusivePackages': exclusivePackages!,
         if (type != null) 'type': type!,
@@ -557,7 +556,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -574,7 +573,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A step that runs an executable for a PatchJob.
@@ -599,7 +598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (linuxExecStepConfig != null)
           'linuxExecStepConfig': linuxExecStepConfig!.toJson(),
         if (windowsExecStepConfig != null)
@@ -656,7 +655,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedSuccessCodes != null)
           'allowedSuccessCodes': allowedSuccessCodes!,
         if (gcsObject != null) 'gcsObject': gcsObject!.toJson(),
@@ -729,7 +728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (dryRun != null) 'dryRun': dryRun!,
@@ -761,7 +760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixed != null) 'fixed': fixed!,
         if (percent != null) 'percent': percent!,
       };
@@ -801,7 +800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucket != null) 'bucket': bucket!,
         if (generationNumber != null) 'generationNumber': generationNumber!,
         if (object != null) 'object': object!,
@@ -816,7 +815,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The inventory details of a VM.
@@ -835,15 +834,12 @@
 
   Inventory.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
-      items = (_json['items'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              InventoryItem.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      items = (_json['items'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          InventoryItem.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('osInfo')) {
       osInfo = InventoryOsInfo.fromJson(
@@ -851,7 +847,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((key, item) => core.MapEntry(key, item.toJson())),
         if (osInfo != null) 'osInfo': osInfo!.toJson(),
@@ -919,7 +915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availablePackage != null)
           'availablePackage': availablePackage!.toJson(),
         if (createTime != null) 'createTime': createTime!,
@@ -992,7 +988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (architecture != null) 'architecture': architecture!,
         if (hostname != null) 'hostname': hostname!,
         if (kernelRelease != null) 'kernelRelease': kernelRelease!,
@@ -1090,7 +1086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aptPackage != null) 'aptPackage': aptPackage!.toJson(),
         if (cosPackage != null) 'cosPackage': cosPackage!.toJson(),
         if (googetPackage != null) 'googetPackage': googetPackage!.toJson(),
@@ -1130,7 +1126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (architecture != null) 'architecture': architecture!,
         if (packageName != null) 'packageName': packageName!,
         if (version != null) 'version': version!,
@@ -1174,7 +1170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caption != null) 'caption': caption!,
         if (description != null) 'description': description!,
         if (hotFixId != null) 'hotFixId': hotFixId!,
@@ -1261,7 +1257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categories != null)
           'categories': categories!.map((value) => value.toJson()).toList(),
         if (description != null) 'description': description!,
@@ -1295,7 +1291,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
       };
@@ -1332,7 +1328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (patchName != null) 'patchName': patchName!,
         if (severity != null) 'severity': severity!,
@@ -1363,7 +1359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (patchDeployments != null)
           'patchDeployments':
@@ -1394,7 +1390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (patchJobInstanceDetails != null)
           'patchJobInstanceDetails':
@@ -1424,7 +1420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (patchJobs != null)
           'patchJobs': patchJobs!.map((value) => value.toJson()).toList(),
@@ -1463,7 +1459,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (monthDay != null) 'monthDay': monthDay!,
         if (weekDayOfMonth != null) 'weekDayOfMonth': weekDayOfMonth!.toJson(),
       };
@@ -1486,7 +1482,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executeTime != null) 'executeTime': executeTime!,
       };
 }
@@ -1573,7 +1569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apt != null) 'apt': apt!.toJson(),
         if (goo != null) 'goo': goo!.toJson(),
         if (postStep != null) 'postStep': postStep!.toJson(),
@@ -1706,7 +1702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (duration != null) 'duration': duration!,
@@ -1788,7 +1784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (all != null) 'all': all!,
         if (groupLabels != null)
           'groupLabels': groupLabels!.map((value) => value.toJson()).toList(),
@@ -1816,17 +1812,16 @@
 
   PatchInstanceFilterGroupLabel.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
       };
 }
@@ -1961,7 +1956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -2044,7 +2039,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attemptCount != null) 'attemptCount': attemptCount!,
         if (failureReason != null) 'failureReason': failureReason!,
         if (instanceSystemId != null) 'instanceSystemId': instanceSystemId!,
@@ -2164,7 +2159,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ackedInstanceCount != null)
           'ackedInstanceCount': ackedInstanceCount!,
         if (applyingPatchesInstanceCount != null)
@@ -2251,7 +2246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disruptionBudget != null)
           'disruptionBudget': disruptionBudget!.toJson(),
         if (mode != null) 'mode': mode!,
@@ -2352,7 +2347,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (frequency != null) 'frequency': frequency!,
         if (lastExecuteTime != null) 'lastExecuteTime': lastExecuteTime!,
@@ -2410,7 +2405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
@@ -2440,7 +2435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (version != null) 'version': version!,
       };
@@ -2483,7 +2478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dayOfWeek != null) 'dayOfWeek': dayOfWeek!,
         if (weekOrdinal != null) 'weekOrdinal': weekOrdinal!,
       };
@@ -2513,7 +2508,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dayOfWeek != null) 'dayOfWeek': dayOfWeek!,
       };
 }
@@ -2554,7 +2549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (classifications != null) 'classifications': classifications!,
         if (excludes != null) 'excludes': excludes!,
         if (exclusivePatches != null) 'exclusivePatches': exclusivePatches!,
@@ -2607,7 +2602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludes != null) 'excludes': excludes!,
         if (exclusivePackages != null) 'exclusivePackages': exclusivePackages!,
         if (minimal != null) 'minimal': minimal!,
@@ -2676,7 +2671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categories != null) 'categories': categories!,
         if (excludes != null) 'excludes': excludes!,
         if (exclusivePatches != null) 'exclusivePatches': exclusivePatches!,
diff --git a/generated/googleapis/lib/oslogin/v1.dart b/generated/googleapis/lib/oslogin/v1.dart
index 7a10e6d..0ecb1cd 100644
--- a/generated/googleapis/lib/oslogin/v1.dart
+++ b/generated/googleapis/lib/oslogin/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -354,7 +353,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A response message for importing an SSH public key.
@@ -377,7 +376,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!,
         if (loginProfile != null) 'loginProfile': loginProfile!.toJson(),
       };
@@ -410,19 +409,17 @@
           .toList();
     }
     if (_json.containsKey('sshPublicKeys')) {
-      sshPublicKeys = (_json['sshPublicKeys'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              SshPublicKey.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      sshPublicKeys =
+          (_json['sshPublicKeys'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          SshPublicKey.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (posixAccounts != null)
           'posixAccounts':
@@ -517,7 +514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (gecos != null) 'gecos': gecos!,
         if (gid != null) 'gid': gid!,
@@ -568,7 +565,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expirationTimeUsec != null)
           'expirationTimeUsec': expirationTimeUsec!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
diff --git a/generated/googleapis/lib/pagespeedonline/v5.dart b/generated/googleapis/lib/pagespeedonline/v5.dart
index d5ea1b0..9a61ac4 100644
--- a/generated/googleapis/lib/pagespeedonline/v5.dart
+++ b/generated/googleapis/lib/pagespeedonline/v5.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -162,7 +161,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (group != null) 'group': group!,
         if (id != null) 'id': id!,
         if (weight != null) 'weight': weight!,
@@ -197,7 +196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (max != null) 'max': max!,
         if (min != null) 'min': min!,
         if (proportion != null) 'proportion': proportion!,
@@ -247,7 +246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessibility != null) 'accessibility': accessibility!.toJson(),
         if (bestPractices != null) 'best-practices': bestPractices!.toJson(),
         if (performance != null) 'performance': performance!.toJson(),
@@ -275,7 +274,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (title != null) 'title': title!,
       };
@@ -325,7 +324,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channel != null) 'channel': channel!,
         if (emulatedFormFactor != null)
           'emulatedFormFactor': emulatedFormFactor!,
@@ -360,7 +359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (benchmarkIndex != null) 'benchmarkIndex': benchmarkIndex!,
         if (hostUserAgent != null) 'hostUserAgent': hostUserAgent!,
         if (networkUserAgent != null) 'networkUserAgent': networkUserAgent!,
@@ -383,7 +382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rendererFormattedStrings != null)
           'rendererFormattedStrings': rendererFormattedStrings!.toJson(),
       };
@@ -443,13 +442,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('details')) {
-      details =
-          (_json['details'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      details = (_json['details'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('displayValue')) {
       displayValue = _json['displayValue'] as core.String;
@@ -480,7 +478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (details != null) 'details': details!,
         if (displayValue != null) 'displayValue': displayValue!,
@@ -546,7 +544,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditRefs != null)
           'auditRefs': auditRefs!.map((value) => value.toJson()).toList(),
         if (description != null) 'description': description!,
@@ -614,30 +612,26 @@
 
   LighthouseResultV5.fromJson(core.Map _json) {
     if (_json.containsKey('audits')) {
-      audits = (_json['audits'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              LighthouseAuditResultV5.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      audits = (_json['audits'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          LighthouseAuditResultV5.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('categories')) {
       categories = Categories.fromJson(
           _json['categories'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('categoryGroups')) {
-      categoryGroups = (_json['categoryGroups'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              CategoryGroupV5.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      categoryGroups =
+          (_json['categoryGroups'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          CategoryGroupV5.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('configSettings')) {
       configSettings = ConfigSettings.fromJson(
@@ -687,7 +681,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audits != null)
           'audits':
               audits!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -738,15 +732,13 @@
       initialUrl = _json['initial_url'] as core.String;
     }
     if (_json.containsKey('metrics')) {
-      metrics = (_json['metrics'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              UserPageLoadMetricV5.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      metrics = (_json['metrics'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          UserPageLoadMetricV5.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('origin_fallback')) {
       originFallback = _json['origin_fallback'] as core.bool;
@@ -756,7 +748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (initialUrl != null) 'initial_url': initialUrl!,
         if (metrics != null)
@@ -828,7 +820,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analysisUTCTimestamp != null)
           'analysisUTCTimestamp': analysisUTCTimestamp!,
         if (captchaResult != null) 'captchaResult': captchaResult!,
@@ -863,7 +855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (major != null) 'major': major!,
         if (minor != null) 'minor': minor!,
       };
@@ -979,7 +971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditGroupExpandTooltip != null)
           'auditGroupExpandTooltip': auditGroupExpandTooltip!,
         if (crcInitialNavigation != null)
@@ -1030,7 +1022,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (message != null) 'message': message!,
       };
@@ -1054,14 +1046,13 @@
 
   StackPack.fromJson(core.Map _json) {
     if (_json.containsKey('descriptions')) {
-      descriptions = (_json['descriptions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      descriptions =
+          (_json['descriptions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('iconDataURL')) {
       iconDataURL = _json['iconDataURL'] as core.String;
@@ -1074,7 +1065,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (descriptions != null) 'descriptions': descriptions!,
         if (iconDataURL != null) 'iconDataURL': iconDataURL!,
         if (id != null) 'id': id!,
@@ -1095,7 +1086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (total != null) 'total': total!,
       };
 }
@@ -1150,7 +1141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (distributions != null)
           'distributions':
diff --git a/generated/googleapis/lib/people/v1.dart b/generated/googleapis/lib/people/v1.dart
index 3b4ba53..31ad222 100644
--- a/generated/googleapis/lib/people/v1.dart
+++ b/generated/googleapis/lib/people/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1466,7 +1465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (city != null) 'city': city!,
         if (country != null) 'country': country!,
         if (countryCode != null) 'countryCode': countryCode!,
@@ -1507,7 +1506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ageRange != null) 'ageRange': ageRange!,
         if (metadata != null) 'metadata': metadata!.toJson(),
       };
@@ -1529,7 +1528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -1565,7 +1564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
@@ -1602,7 +1601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (text != null) 'text': text!,
@@ -1629,7 +1628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
       };
@@ -1673,7 +1672,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedType != null) 'formattedType': formattedType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (type != null) 'type': type!,
@@ -1709,7 +1708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
@@ -1811,7 +1810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientData != null)
           'clientData': clientData!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -1854,7 +1853,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactGroupId != null) 'contactGroupId': contactGroupId!,
         if (contactGroupResourceName != null)
           'contactGroupResourceName': contactGroupResourceName!,
@@ -1888,7 +1887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deleted != null) 'deleted': deleted!,
         if (updateTime != null) 'updateTime': updateTime!,
       };
@@ -1921,7 +1920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactGroup != null) 'contactGroup': contactGroup!.toJson(),
         if (requestedResourceName != null)
           'requestedResourceName': requestedResourceName!,
@@ -1976,7 +1975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (copyMask != null) 'copyMask': copyMask!,
         if (readMask != null) 'readMask': readMask!,
         if (sources != null) 'sources': sources!,
@@ -2013,7 +2012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (default_ != null) 'default': default_!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (url != null) 'url': url!,
@@ -2047,7 +2046,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactGroup != null) 'contactGroup': contactGroup!.toJson(),
         if (readGroupFields != null) 'readGroupFields': readGroupFields!,
       };
@@ -2093,7 +2092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -2115,7 +2114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (person != null) 'person': person!.toJson(),
       };
 }
@@ -2133,7 +2132,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inViewerDomain != null) 'inViewerDomain': inViewerDomain!,
       };
 }
@@ -2182,7 +2181,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (formattedType != null) 'formattedType': formattedType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -2205,7 +2204,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An event related to the person.
@@ -2247,7 +2246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (date != null) 'date': date!.toJson(),
         if (formattedType != null) 'formattedType': formattedType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -2293,7 +2292,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedType != null) 'formattedType': formattedType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (type != null) 'type': type!,
@@ -2333,7 +2332,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (primary != null) 'primary': primary!,
         if (source != null) 'source': source!.toJson(),
         if (verified != null) 'verified': verified!,
@@ -2360,7 +2359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
       };
@@ -2409,7 +2408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressMeAs != null) 'addressMeAs': addressMeAs!,
         if (formattedValue != null) 'formattedValue': formattedValue!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -2433,7 +2432,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -2460,7 +2459,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -2523,7 +2522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedProtocol != null) 'formattedProtocol': formattedProtocol!,
         if (formattedType != null) 'formattedType': formattedType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -2553,7 +2552,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
       };
@@ -2606,7 +2605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connections != null)
           'connections': connections!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2652,7 +2651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactGroups != null)
           'contactGroups':
               contactGroups!.map((value) => value.toJson()).toList(),
@@ -2695,7 +2694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (nextSyncToken != null) 'nextSyncToken': nextSyncToken!,
         if (people != null)
@@ -2739,7 +2738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (nextSyncToken != null) 'nextSyncToken': nextSyncToken!,
         if (otherContacts != null)
@@ -2769,7 +2768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
       };
@@ -2834,7 +2833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buildingId != null) 'buildingId': buildingId!,
         if (current != null) 'current': current!,
         if (deskCode != null) 'deskCode': deskCode!,
@@ -2879,7 +2878,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactGroupMembership != null)
           'contactGroupMembership': contactGroupMembership!.toJson(),
         if (domainMembership != null)
@@ -2936,7 +2935,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedType != null) 'formattedType': formattedType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (type != null) 'type': type!,
@@ -2982,7 +2981,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceNamesToAdd != null)
           'resourceNamesToAdd': resourceNamesToAdd!,
         if (resourceNamesToRemove != null)
@@ -3015,7 +3014,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canNotRemoveLastContactGroupResourceNames != null)
           'canNotRemoveLastContactGroupResourceNames':
               canNotRemoveLastContactGroupResourceNames!,
@@ -3131,7 +3130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (displayNameLastFirst != null)
           'displayNameLastFirst': displayNameLastFirst!,
@@ -3191,7 +3190,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
@@ -3218,7 +3217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
       };
@@ -3329,7 +3328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (current != null) 'current': current!,
         if (department != null) 'department': department!,
         if (domain != null) 'domain': domain!,
@@ -3729,7 +3728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addresses != null)
           'addresses': addresses!.map((value) => value.toJson()).toList(),
         if (ageRange != null) 'ageRange': ageRange!,
@@ -3878,7 +3877,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deleted != null) 'deleted': deleted!,
         if (linkedPeopleResourceNames != null)
           'linkedPeopleResourceNames': linkedPeopleResourceNames!,
@@ -3929,7 +3928,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpStatusCode != null) 'httpStatusCode': httpStatusCode!,
         if (person != null) 'person': person!.toJson(),
         if (requestedResourceName != null)
@@ -3987,7 +3986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalForm != null) 'canonicalForm': canonicalForm!,
         if (formattedType != null) 'formattedType': formattedType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -4030,7 +4029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (default_ != null) 'default': default_!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (url != null) 'url': url!,
@@ -4066,7 +4065,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectType != null) 'objectType': objectType!,
         if (userTypes != null) 'userTypes': userTypes!,
       };
@@ -4112,7 +4111,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedType != null) 'formattedType': formattedType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (person != null) 'person': person!,
@@ -4153,7 +4152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedValue != null) 'formattedValue': formattedValue!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
@@ -4193,7 +4192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedValue != null) 'formattedValue': formattedValue!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
@@ -4229,7 +4228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (current != null) 'current': current!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
@@ -4267,7 +4266,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (people != null)
           'people': people!.map((value) => value.toJson()).toList(),
@@ -4291,7 +4290,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
       };
@@ -4311,7 +4310,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (person != null) 'person': person!.toJson(),
       };
 }
@@ -4359,7 +4358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedType != null) 'formattedType': formattedType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (type != null) 'type': type!,
@@ -4387,7 +4386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
       };
@@ -4457,7 +4456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (profileMetadata != null)
@@ -4500,8 +4499,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4514,7 +4513,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4542,7 +4541,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
       };
@@ -4590,7 +4589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactGroup != null) 'contactGroup': contactGroup!.toJson(),
         if (readGroupFields != null) 'readGroupFields': readGroupFields!,
         if (updateGroupFields != null) 'updateGroupFields': updateGroupFields!,
@@ -4651,7 +4650,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (personFields != null) 'personFields': personFields!,
         if (photoBytes != null) 'photoBytes': photoBytes!,
         if (sources != null) 'sources': sources!,
@@ -4673,7 +4672,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (person != null) 'person': person!.toJson(),
       };
 }
@@ -4717,7 +4716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formattedType != null) 'formattedType': formattedType!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (type != null) 'type': type!,
@@ -4751,7 +4750,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (value != null) 'value': value!,
diff --git a/generated/googleapis/lib/playablelocations/v3.dart b/generated/googleapis/lib/playablelocations/v3.dart
index c0e2f22..873e77a 100644
--- a/generated/googleapis/lib/playablelocations/v3.dart
+++ b/generated/googleapis/lib/playablelocations/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -220,7 +219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gameObjectType != null) 'gameObjectType': gameObjectType!,
         if (impressionType != null) 'impressionType': impressionType!,
         if (locationName != null) 'locationName': locationName!,
@@ -272,7 +271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientInfo != null) 'clientInfo': clientInfo!.toJson(),
         if (impressions != null)
           'impressions': impressions!.map((value) => value.toJson()).toList(),
@@ -290,7 +289,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A request for logging your player's bad location reports.
@@ -339,7 +338,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientInfo != null) 'clientInfo': clientInfo!.toJson(),
         if (playerReports != null)
           'playerReports':
@@ -358,7 +357,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A report submitted by a player about a playable location that is considered
@@ -406,7 +405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (locationName != null) 'locationName': locationName!,
         if (reasonDetails != null) 'reasonDetails': reasonDetails!,
@@ -438,7 +437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (s2CellId != null) 's2CellId': s2CellId!,
       };
 }
@@ -486,7 +485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldsToReturn != null) 'fieldsToReturn': fieldsToReturn!,
         if (filter != null) 'filter': filter!.toJson(),
         if (gameObjectType != null) 'gameObjectType': gameObjectType!,
@@ -527,7 +526,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includedTypes != null) 'includedTypes': includedTypes!,
         if (maxLocationCount != null) 'maxLocationCount': maxLocationCount!,
         if (spacing != null) 'spacing': spacing!.toJson(),
@@ -595,7 +594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (centerPoint != null) 'centerPoint': centerPoint!.toJson(),
         if (name != null) 'name': name!,
         if (placeId != null) 'placeId': placeId!,
@@ -623,7 +622,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
       };
@@ -673,7 +672,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (areaFilter != null) 'areaFilter': areaFilter!.toJson(),
         if (criteria != null)
           'criteria': criteria!.map((value) => value.toJson()).toList(),
@@ -705,22 +704,21 @@
       core.Map _json) {
     if (_json.containsKey('locationsPerGameObjectType')) {
       locationsPerGameObjectType = (_json['locationsPerGameObjectType']
-              as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleMapsPlayablelocationsV3SamplePlayableLocationList.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          GoogleMapsPlayablelocationsV3SamplePlayableLocationList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('ttl')) {
       ttl = _json['ttl'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locationsPerGameObjectType != null)
           'locationsPerGameObjectType': locationsPerGameObjectType!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -778,7 +776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minSpacingMeters != null) 'minSpacingMeters': minSpacingMeters!,
         if (pointType != null) 'pointType': pointType!,
       };
@@ -864,7 +862,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiClient != null) 'apiClient': apiClient!,
         if (applicationId != null) 'applicationId': applicationId!,
         if (applicationVersion != null)
@@ -905,7 +903,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
diff --git a/generated/googleapis/lib/playcustomapp/v1.dart b/generated/googleapis/lib/playcustomapp/v1.dart
index a7b7b4f..fc5a0cd 100644
--- a/generated/googleapis/lib/playcustomapp/v1.dart
+++ b/generated/googleapis/lib/playcustomapp/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -169,7 +168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (packageName != null) 'packageName': packageName!,
         if (title != null) 'title': title!,
diff --git a/generated/googleapis/lib/policytroubleshooter/v1.dart b/generated/googleapis/lib/policytroubleshooter/v1.dart
index 0247659..c9bc209 100644
--- a/generated/googleapis/lib/policytroubleshooter/v1.dart
+++ b/generated/googleapis/lib/policytroubleshooter/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -143,7 +142,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullResourceName != null) 'fullResourceName': fullResourceName!,
         if (permission != null) 'permission': permission!,
         if (principal != null) 'principal': principal!,
@@ -245,15 +244,14 @@
           _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('memberships')) {
-      memberships = (_json['memberships'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      memberships =
+          (_json['memberships'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('relevance')) {
       relevance = _json['relevance'] as core.String;
@@ -269,7 +267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (access != null) 'access': access!,
         if (condition != null) 'condition': condition!.toJson(),
         if (memberships != null)
@@ -322,7 +320,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (membership != null) 'membership': membership!,
         if (relevance != null) 'relevance': relevance!,
       };
@@ -409,7 +407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (access != null) 'access': access!,
         if (bindingExplanations != null)
           'bindingExplanations':
@@ -436,7 +434,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessTuple != null) 'accessTuple': accessTuple!.toJson(),
       };
 }
@@ -484,7 +482,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (access != null) 'access': access!,
         if (explainedPolicies != null)
           'explainedPolicies':
@@ -534,7 +532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -576,7 +574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -648,7 +646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -760,7 +758,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -831,7 +829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
diff --git a/generated/googleapis/lib/poly/v1.dart b/generated/googleapis/lib/poly/v1.dart
index f0736df..7cf8c50 100644
--- a/generated/googleapis/lib/poly/v1.dart
+++ b/generated/googleapis/lib/poly/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -479,7 +478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorName != null) 'authorName': authorName!,
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
@@ -563,7 +562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (filePath != null) 'filePath': filePath!,
         if (imageError != null) 'imageError': imageError!.toJson(),
@@ -601,7 +600,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (relativePath != null) 'relativePath': relativePath!,
         if (url != null) 'url': url!,
@@ -660,7 +659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formatComplexity != null)
           'formatComplexity': formatComplexity!.toJson(),
         if (formatType != null) 'formatType': formatType!,
@@ -694,7 +693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lodHint != null) 'lodHint': lodHint!,
         if (triangleCount != null) 'triangleCount': triangleCount!,
       };
@@ -727,7 +726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (filePath != null) 'filePath': filePath!,
       };
@@ -764,7 +763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assets != null)
           'assets': assets!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -803,7 +802,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assets != null)
           'assets': assets!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -842,7 +841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (totalSize != null) 'totalSize': totalSize!,
         if (userAssets != null)
@@ -937,7 +936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (endIndex != null) 'endIndex': endIndex!,
         if (filePath != null) 'filePath': filePath!,
@@ -999,7 +998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null) 'backgroundColor': backgroundColor!,
         if (colorSpace != null) 'colorSpace': colorSpace!,
         if (orientingRotation != null)
@@ -1041,7 +1040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (w != null) 'w': w!,
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
@@ -1066,7 +1065,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sourceAsset != null) 'sourceAsset': sourceAsset!,
       };
 }
@@ -1114,7 +1113,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assetId != null) 'assetId': assetId!,
         if (assetImportId != null) 'assetImportId': assetImportId!,
         if (assetImportMessages != null)
@@ -1138,7 +1137,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (asset != null) 'asset': asset!.toJson(),
       };
 }
diff --git a/generated/googleapis/lib/pubsub/v1.dart b/generated/googleapis/lib/pubsub/v1.dart
index 07f016a..2fccf27 100644
--- a/generated/googleapis/lib/pubsub/v1.dart
+++ b/generated/googleapis/lib/pubsub/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2006,7 +2005,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ackIds != null) 'ackIds': ackIds!,
       };
 }
@@ -2077,7 +2076,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -2106,20 +2105,19 @@
 
   CreateSnapshotRequest.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('subscription')) {
       subscription = _json['subscription'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (subscription != null) 'subscription': subscription!,
       };
@@ -2163,7 +2161,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deadLetterTopic != null) 'deadLetterTopic': deadLetterTopic!,
         if (maxDeliveryAttempts != null)
           'maxDeliveryAttempts': maxDeliveryAttempts!,
@@ -2180,7 +2178,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -2197,7 +2195,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A policy that specifies the conditions for resource expiration (i.e.,
@@ -2220,7 +2218,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ttl != null) 'ttl': ttl!,
       };
 }
@@ -2286,7 +2284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2317,7 +2315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (schemas != null)
           'schemas': schemas!.map((value) => value.toJson()).toList(),
@@ -2347,7 +2345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (snapshots != null)
           'snapshots': snapshots!.map((value) => value.toJson()).toList(),
@@ -2378,7 +2376,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (subscriptions != null)
           'subscriptions':
@@ -2409,7 +2407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (snapshots != null) 'snapshots': snapshots!,
       };
@@ -2438,7 +2436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (subscriptions != null) 'subscriptions': subscriptions!,
       };
@@ -2467,7 +2465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (topics != null)
           'topics': topics!.map((value) => value.toJson()).toList(),
@@ -2496,7 +2494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedPersistenceRegions != null)
           'allowedPersistenceRegions': allowedPersistenceRegions!,
       };
@@ -2536,7 +2534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ackDeadlineSeconds != null)
           'ackDeadlineSeconds': ackDeadlineSeconds!,
         if (ackIds != null) 'ackIds': ackIds!,
@@ -2564,7 +2562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pushConfig != null) 'pushConfig': pushConfig!.toJson(),
       };
 }
@@ -2601,7 +2599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audience != null) 'audience': audience!,
         if (serviceAccountEmail != null)
           'serviceAccountEmail': serviceAccountEmail!,
@@ -2703,7 +2701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -2729,7 +2727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (messages != null)
           'messages': messages!.map((value) => value.toJson()).toList(),
       };
@@ -2753,7 +2751,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (messageIds != null) 'messageIds': messageIds!,
       };
 }
@@ -2812,14 +2810,13 @@
 
   PubsubMessage.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = (_json['attributes'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      attributes =
+          (_json['attributes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('data')) {
       data = _json['data'] as core.String;
@@ -2835,7 +2832,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!,
         if (data != null) 'data': data!,
         if (messageId != null) 'messageId': messageId!,
@@ -2877,7 +2874,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxMessages != null) 'maxMessages': maxMessages!,
         if (returnImmediately != null) 'returnImmediately': returnImmediately!,
       };
@@ -2904,7 +2901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (receivedMessages != null)
           'receivedMessages':
               receivedMessages!.map((value) => value.toJson()).toList(),
@@ -2944,14 +2941,13 @@
 
   PushConfig.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = (_json['attributes'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      attributes =
+          (_json['attributes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('oidcToken')) {
       oidcToken = OidcToken.fromJson(
@@ -2962,7 +2958,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!,
         if (oidcToken != null) 'oidcToken': oidcToken!.toJson(),
         if (pushEndpoint != null) 'pushEndpoint': pushEndpoint!,
@@ -3006,7 +3002,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ackId != null) 'ackId': ackId!,
         if (deliveryAttempt != null) 'deliveryAttempt': deliveryAttempt!,
         if (message != null) 'message': message!.toJson(),
@@ -3043,7 +3039,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maximumBackoff != null) 'maximumBackoff': maximumBackoff!,
         if (minimumBackoff != null) 'minimumBackoff': minimumBackoff!,
       };
@@ -3085,7 +3081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (definition != null) 'definition': definition!,
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
@@ -3122,7 +3118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encoding != null) 'encoding': encoding!,
         if (schema != null) 'schema': schema!,
       };
@@ -3161,7 +3157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (snapshot != null) 'snapshot': snapshot!,
         if (time != null) 'time': time!,
       };
@@ -3175,7 +3171,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for `SetIamPolicy` method.
@@ -3196,7 +3192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -3239,13 +3235,12 @@
       expireTime = _json['expireTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3255,7 +3250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expireTime != null) 'expireTime': expireTime!,
         if (labels != null) 'labels': labels!,
         if (name != null) 'name': name!,
@@ -3406,13 +3401,12 @@
       filter = _json['filter'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('messageRetentionDuration')) {
       messageRetentionDuration =
@@ -3437,7 +3431,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ackDeadlineSeconds != null)
           'ackDeadlineSeconds': ackDeadlineSeconds!,
         if (deadLetterPolicy != null)
@@ -3479,7 +3473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3500,7 +3494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3551,13 +3545,12 @@
       kmsKeyName = _json['kmsKeyName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('messageStoragePolicy')) {
       messageStoragePolicy = MessageStoragePolicy.fromJson(
@@ -3575,7 +3568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
         if (labels != null) 'labels': labels!,
         if (messageStoragePolicy != null)
@@ -3612,7 +3605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (snapshot != null) 'snapshot': snapshot!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -3644,7 +3637,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (subscription != null) 'subscription': subscription!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -3679,7 +3672,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topic != null) 'topic': topic!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -3730,7 +3723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encoding != null) 'encoding': encoding!,
         if (message != null) 'message': message!,
         if (name != null) 'name': name!,
@@ -3748,7 +3741,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request for the `ValidateSchema` method.
@@ -3767,7 +3760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (schema != null) 'schema': schema!.toJson(),
       };
 }
@@ -3782,5 +3775,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis/lib/pubsublite/v1.dart b/generated/googleapis/lib/pubsublite/v1.dart
index c924fa6..e1a97b7 100644
--- a/generated/googleapis/lib/pubsublite/v1.dart
+++ b/generated/googleapis/lib/pubsublite/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -905,7 +904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publishMibPerSec != null) 'publishMibPerSec': publishMibPerSec!,
         if (subscribeMibPerSec != null)
           'subscribeMibPerSec': subscribeMibPerSec!,
@@ -927,7 +926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (partition != null) 'partition': partition!,
       };
 }
@@ -946,7 +945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headCursor != null) 'headCursor': headCursor!.toJson(),
       };
 }
@@ -984,7 +983,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endCursor != null) 'endCursor': endCursor!.toJson(),
         if (partition != null) 'partition': partition!,
         if (startCursor != null) 'startCursor': startCursor!.toJson(),
@@ -1029,7 +1028,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (messageBytes != null) 'messageBytes': messageBytes!,
         if (messageCount != null) 'messageCount': messageCount!,
         if (minimumEventTime != null) 'minimumEventTime': minimumEventTime!,
@@ -1053,7 +1052,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (offset != null) 'offset': offset!,
       };
 }
@@ -1079,7 +1078,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deliveryRequirement != null)
           'deliveryRequirement': deliveryRequirement!,
       };
@@ -1099,7 +1098,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response for ListPartitionCursors
@@ -1126,7 +1125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (partitionCursors != null)
           'partitionCursors':
@@ -1161,7 +1160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (subscriptions != null)
           'subscriptions':
@@ -1195,7 +1194,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (subscriptions != null) 'subscriptions': subscriptions!,
       };
@@ -1228,7 +1227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (topics != null)
           'topics': topics!.map((value) => value.toJson()).toList(),
@@ -1269,7 +1268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (capacity != null) 'capacity': capacity!.toJson(),
         if (count != null) 'count': count!,
         if (scale != null) 'scale': scale!,
@@ -1296,7 +1295,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cursor != null) 'cursor': cursor!.toJson(),
         if (partition != null) 'partition': partition!,
       };
@@ -1328,7 +1327,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (perPartitionBytes != null) 'perPartitionBytes': perPartitionBytes!,
         if (period != null) 'period': period!,
       };
@@ -1366,7 +1365,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deliveryConfig != null) 'deliveryConfig': deliveryConfig!.toJson(),
         if (name != null) 'name': name!,
         if (topic != null) 'topic': topic!,
@@ -1403,7 +1402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (partitionConfig != null)
           'partitionConfig': partitionConfig!.toJson(),
@@ -1425,7 +1424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (partitionCount != null) 'partitionCount': partitionCount!,
       };
 }
diff --git a/generated/googleapis/lib/realtimebidding/v1.dart b/generated/googleapis/lib/realtimebidding/v1.dart
index 0d04085..39e87ac 100644
--- a/generated/googleapis/lib/realtimebidding/v1.dart
+++ b/generated/googleapis/lib/realtimebidding/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1421,7 +1420,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A request to start targeting the provided app IDs in a specific pretargeting
@@ -1464,7 +1463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appIds != null) 'appIds': appIds!,
         if (targetingMode != null) 'targetingMode': targetingMode!,
       };
@@ -1513,7 +1512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publisherIds != null) 'publisherIds': publisherIds!,
         if (targetingMode != null) 'targetingMode': targetingMode!,
       };
@@ -1559,7 +1558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sites != null) 'sites': sites!,
         if (targetingMode != null) 'targetingMode': targetingMode!,
       };
@@ -1607,7 +1606,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserId != null) 'advertiserId': advertiserId!,
         if (advertiserName != null) 'advertiserName': advertiserName!,
         if (brandId != null) 'brandId': brandId!,
@@ -1644,7 +1643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mobileAppCategoryTargeting != null)
           'mobileAppCategoryTargeting': mobileAppCategoryTargeting!.toJson(),
         if (mobileAppTargeting != null)
@@ -1660,7 +1659,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A creative and its classification data.
@@ -1873,7 +1872,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (adChoicesDestinationUrl != null)
           'adChoicesDestinationUrl': adChoicesDestinationUrl!,
@@ -1925,7 +1924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (width != null) 'width': width!,
       };
@@ -2099,7 +2098,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chinaPolicyCompliance != null)
           'chinaPolicyCompliance': chinaPolicyCompliance!.toJson(),
         if (dealsPolicyCompliance != null)
@@ -2168,7 +2167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -2209,7 +2208,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (crawlTime != null) 'crawlTime': crawlTime!,
         if (crawledUrl != null) 'crawledUrl': crawledUrl!,
         if (reason != null) 'reason': reason!,
@@ -2299,7 +2298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dnsError != null) 'dnsError': dnsError!,
         if (expandedUrl != null) 'expandedUrl': expandedUrl!,
         if (httpError != null) 'httpError': httpError!,
@@ -2324,7 +2323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationUrl != null) 'destinationUrl': destinationUrl!,
       };
 }
@@ -2352,7 +2351,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topHttpCallDomains != null)
           'topHttpCallDomains':
               topHttpCallDomains!.map((value) => value.toJson()).toList(),
@@ -2380,7 +2379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domain != null) 'domain': domain!,
         if (httpCallCount != null) 'httpCallCount': httpCallCount!,
       };
@@ -2410,7 +2409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topUrlDownloadSizeBreakdowns != null)
           'topUrlDownloadSizeBreakdowns': topUrlDownloadSizeBreakdowns!
               .map((value) => value.toJson())
@@ -2434,7 +2433,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response for a request to get remarketing tag.
@@ -2455,7 +2454,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (snippet != null) 'snippet': snippet!,
       };
 }
@@ -2489,7 +2488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (snippet != null) 'snippet': snippet!,
         if (width != null) 'width': width!,
@@ -2511,7 +2510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (urls != null) 'urls': urls!,
       };
 }
@@ -2545,7 +2544,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cookieNames != null) 'cookieNames': cookieNames!,
         if (maxCookieCount != null) 'maxCookieCount': maxCookieCount!,
       };
@@ -2579,7 +2578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (url != null) 'url': url!,
         if (width != null) 'width': width!,
@@ -2612,7 +2611,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creatives != null)
           'creatives': creatives!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2643,7 +2642,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (pretargetingConfigs != null)
           'pretargetingConfigs':
@@ -2678,7 +2677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (userLists != null)
           'userLists': userLists!.map((value) => value.toJson()).toList(),
@@ -2728,7 +2727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bitrate != null) 'bitrate': bitrate!,
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -2818,7 +2817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserName != null) 'advertiserName': advertiserName!,
         if (appIcon != null) 'appIcon': appIcon!.toJson(),
         if (body != null) 'body': body!,
@@ -2859,7 +2858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedIds != null) 'excludedIds': excludedIds!,
         if (includedIds != null) 'includedIds': includedIds!,
       };
@@ -2873,7 +2872,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Policy compliance of the creative for a transaction type or a region.
@@ -2909,7 +2908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null) 'status': status!,
         if (topics != null)
           'topics': topics!.map((value) => value.toJson()).toList(),
@@ -2951,7 +2950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (evidences != null)
           'evidences': evidences!.map((value) => value.toJson()).toList(),
         if (helpCenterUrl != null) 'helpCenterUrl': helpCenterUrl!,
@@ -3019,7 +3018,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationNotCrawlable != null)
           'destinationNotCrawlable': destinationNotCrawlable!.toJson(),
         if (destinationNotWorking != null)
@@ -3318,7 +3317,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedUserTargetingModes != null)
           'allowedUserTargetingModes': allowedUserTargetingModes!,
         if (appTargeting != null) 'appTargeting': appTargeting!.toJson(),
@@ -3380,7 +3379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appIds != null) 'appIds': appIds!,
       };
 }
@@ -3410,7 +3409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publisherIds != null) 'publisherIds': publisherIds!,
       };
 }
@@ -3436,7 +3435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sites != null) 'sites': sites!,
       };
 }
@@ -3469,7 +3468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetingMode != null) 'targetingMode': targetingMode!,
         if (values != null) 'values': values!,
       };
@@ -3485,7 +3484,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The URL-level breakdown for the download size.
@@ -3507,7 +3506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (downloadSizeKb != null) 'downloadSizeKb': downloadSizeKb!,
         if (normalizedUrl != null) 'normalizedUrl': normalizedUrl!,
       };
@@ -3571,7 +3570,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!.toJson(),
         if (restrictionType != null) 'restrictionType': restrictionType!,
         if (startDate != null) 'startDate': startDate!.toJson(),
@@ -3655,7 +3654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (membershipDurationDays != null)
@@ -3696,7 +3695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (videoMetadata != null) 'videoMetadata': videoMetadata!.toJson(),
         if (videoUrl != null) 'videoUrl': videoUrl!,
         if (videoVastXml != null) 'videoVastXml': videoVastXml!,
@@ -3769,7 +3768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (isValidVast != null) 'isValidVast': isValidVast!,
         if (isVpaid != null) 'isVpaid': isVpaid!,
@@ -3789,7 +3788,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A response for the request to receive push notification when a bidder's
@@ -3823,7 +3822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (subscription != null) 'subscription': subscription!,
         if (topic != null) 'topic': topic!,
       };
diff --git a/generated/googleapis/lib/recommender/v1.dart b/generated/googleapis/lib/recommender/v1.dart
index 85dcb74..d1fd2d9 100644
--- a/generated/googleapis/lib/recommender/v1.dart
+++ b/generated/googleapis/lib/recommender/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1991,7 +1990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cost != null) 'cost': cost!.toJson(),
         if (duration != null) 'duration': duration!,
       };
@@ -2026,7 +2025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (costProjection != null) 'costProjection': costProjection!.toJson(),
       };
@@ -2105,13 +2104,12 @@
       category = _json['category'] as core.String;
     }
     if (_json.containsKey('content')) {
-      content =
-          (_json['content'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      content = (_json['content'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -2142,7 +2140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (associatedRecommendations != null)
           'associatedRecommendations': associatedRecommendations!
               .map((value) => value.toJson())
@@ -2175,7 +2173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (recommendation != null) 'recommendation': recommendation!,
       };
 }
@@ -2206,18 +2204,17 @@
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('stateMetadata')) {
-      stateMetadata = (_json['stateMetadata'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      stateMetadata =
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
         if (stateMetadata != null) 'stateMetadata': stateMetadata!,
       };
@@ -2248,7 +2245,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (insights != null)
           'insights': insights!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2280,7 +2277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (recommendations != null)
           'recommendations':
@@ -2311,18 +2308,17 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('stateMetadata')) {
-      stateMetadata = (_json['stateMetadata'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      stateMetadata =
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (stateMetadata != null) 'stateMetadata': stateMetadata!,
       };
@@ -2352,18 +2348,17 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('stateMetadata')) {
-      stateMetadata = (_json['stateMetadata'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      stateMetadata =
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (stateMetadata != null) 'stateMetadata': stateMetadata!,
       };
@@ -2393,18 +2388,17 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('stateMetadata')) {
-      stateMetadata = (_json['stateMetadata'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      stateMetadata =
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (stateMetadata != null) 'stateMetadata': stateMetadata!,
       };
@@ -2434,18 +2428,17 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('stateMetadata')) {
-      stateMetadata = (_json['stateMetadata'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      stateMetadata =
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (stateMetadata != null) 'stateMetadata': stateMetadata!,
       };
@@ -2548,25 +2541,24 @@
       path = _json['path'] as core.String;
     }
     if (_json.containsKey('pathFilters')) {
-      pathFilters = (_json['pathFilters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      pathFilters =
+          (_json['pathFilters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('pathValueMatchers')) {
-      pathValueMatchers = (_json['pathValueMatchers'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudRecommenderV1ValueMatcher.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      pathValueMatchers =
+          (_json['pathValueMatchers'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudRecommenderV1ValueMatcher.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('resource')) {
       resource = _json['resource'] as core.String;
@@ -2589,7 +2581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (path != null) 'path': path!,
         if (pathFilters != null) 'pathFilters': pathFilters!,
@@ -2624,7 +2616,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
       };
@@ -2731,7 +2723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalImpact != null)
           'additionalImpact':
               additionalImpact!.map((value) => value.toJson()).toList(),
@@ -2769,7 +2761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationGroups != null)
           'operationGroups':
               operationGroups!.map((value) => value.toJson()).toList(),
@@ -2791,7 +2783,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (insight != null) 'insight': insight!,
       };
 }
@@ -2830,18 +2822,17 @@
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('stateMetadata')) {
-      stateMetadata = (_json['stateMetadata'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      stateMetadata =
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
         if (stateMetadata != null) 'stateMetadata': stateMetadata!,
       };
@@ -2864,7 +2855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matchesPattern != null) 'matchesPattern': matchesPattern!,
       };
 }
@@ -2902,7 +2893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
diff --git a/generated/googleapis/lib/redis/v1.dart b/generated/googleapis/lib/redis/v1.dart
index 1334ab3..49f00fc 100644
--- a/generated/googleapis/lib/redis/v1.dart
+++ b/generated/googleapis/lib/redis/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -856,7 +855,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request for Export.
@@ -875,7 +874,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
 }
@@ -907,7 +906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataProtectionMode != null)
           'dataProtectionMode': dataProtectionMode!,
       };
@@ -930,7 +929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -952,7 +951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -976,19 +975,18 @@
 
   GoogleCloudRedisV1LocationMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('availableZones')) {
-      availableZones = (_json['availableZones'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudRedisV1ZoneMetadata.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      availableZones =
+          (_json['availableZones'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudRedisV1ZoneMetadata.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableZones != null)
           'availableZones': availableZones!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -1044,7 +1042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (cancelRequested != null) 'cancelRequested': cancelRequested!,
         if (createTime != null) 'createTime': createTime!,
@@ -1065,7 +1063,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request for Import.
@@ -1084,7 +1082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
       };
 }
@@ -1103,7 +1101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
       };
 }
@@ -1329,13 +1327,12 @@
       host = _json['host'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
@@ -1353,14 +1350,13 @@
       port = _json['port'] as core.int;
     }
     if (_json.containsKey('redisConfigs')) {
-      redisConfigs = (_json['redisConfigs'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      redisConfigs =
+          (_json['redisConfigs'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('redisVersion')) {
       redisVersion = _json['redisVersion'] as core.String;
@@ -1388,7 +1384,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternativeLocationId != null)
           'alternativeLocationId': alternativeLocationId!,
         if (authEnabled != null) 'authEnabled': authEnabled!,
@@ -1432,7 +1428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authString != null) 'authString': authString!,
       };
 }
@@ -1478,7 +1474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1508,7 +1504,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1537,7 +1533,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1585,32 +1581,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1677,29 +1671,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1722,7 +1714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
       };
 }
@@ -1760,8 +1752,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1774,7 +1766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1826,7 +1818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cert != null) 'cert': cert!,
         if (createTime != null) 'createTime': createTime!,
         if (expireTime != null) 'expireTime': expireTime!,
@@ -1850,7 +1842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (redisVersion != null) 'redisVersion': redisVersion!,
       };
 }
diff --git a/generated/googleapis/lib/remotebuildexecution/v2.dart b/generated/googleapis/lib/remotebuildexecution/v2.dart
index c32ba95..8712a68 100644
--- a/generated/googleapis/lib/remotebuildexecution/v2.dart
+++ b/generated/googleapis/lib/remotebuildexecution/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -762,7 +761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commandDigest != null) 'commandDigest': commandDigest!.toJson(),
         if (doNotCache != null) 'doNotCache': doNotCache!,
         if (inputRootDigest != null)
@@ -786,7 +785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (updateEnabled != null) 'updateEnabled': updateEnabled!,
       };
 }
@@ -987,7 +986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionMetadata != null)
           'executionMetadata': executionMetadata!.toJson(),
         if (exitCode != null) 'exitCode': exitCode!,
@@ -1029,7 +1028,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digests != null)
           'digests': digests!.map((value) => value.toJson()).toList(),
       };
@@ -1054,7 +1053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -1094,7 +1093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
         if (digest != null) 'digest': digest!.toJson(),
         if (status != null) 'status': status!.toJson(),
@@ -1120,7 +1119,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
       };
@@ -1155,7 +1154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
         if (digest != null) 'digest': digest!.toJson(),
       };
@@ -1180,7 +1179,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -1208,7 +1207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digest != null) 'digest': digest!.toJson(),
         if (status != null) 'status': status!.toJson(),
       };
@@ -1273,7 +1272,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionCacheUpdateCapabilities != null)
           'actionCacheUpdateCapabilities':
               actionCacheUpdateCapabilities!.toJson(),
@@ -1435,7 +1434,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arguments != null) 'arguments': arguments!,
         if (environmentVariables != null)
           'environmentVariables':
@@ -1469,7 +1468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -1522,7 +1521,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hash != null) 'hash': hash!,
         if (sizeBytes != null) 'sizeBytes': sizeBytes!,
       };
@@ -1603,7 +1602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directories != null)
           'directories': directories!.map((value) => value.toJson()).toList(),
         if (files != null)
@@ -1640,7 +1639,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digest != null) 'digest': digest!.toJson(),
         if (name != null) 'name': name!,
       };
@@ -1687,7 +1686,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionDigest != null) 'actionDigest': actionDigest!.toJson(),
         if (stage != null) 'stage': stage!,
         if (stderrStreamName != null) 'stderrStreamName': stderrStreamName!,
@@ -1749,7 +1748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionDigest != null) 'actionDigest': actionDigest!.toJson(),
         if (executionPolicy != null)
           'executionPolicy': executionPolicy!.toJson(),
@@ -1809,15 +1808,14 @@
           _json['result'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serverLogs')) {
-      serverLogs = (_json['serverLogs'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              BuildBazelRemoteExecutionV2LogFile.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      serverLogs =
+          (_json['serverLogs'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          BuildBazelRemoteExecutionV2LogFile.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('status')) {
       status = GoogleRpcStatus.fromJson(
@@ -1825,7 +1823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cachedResult != null) 'cachedResult': cachedResult!,
         if (message != null) 'message': message!,
         if (result != null) 'result': result!.toJson(),
@@ -1909,7 +1907,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionCompletedTimestamp != null)
           'executionCompletedTimestamp': executionCompletedTimestamp!,
         if (executionStartTimestamp != null)
@@ -1978,7 +1976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digestFunction != null) 'digestFunction': digestFunction!,
         if (execEnabled != null) 'execEnabled': execEnabled!,
         if (executionPriorityCapabilities != null)
@@ -2011,7 +2009,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (priority != null) 'priority': priority!,
       };
 }
@@ -2052,7 +2050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digest != null) 'digest': digest!.toJson(),
         if (isExecutable != null) 'isExecutable': isExecutable!,
         if (name != null) 'name': name!,
@@ -2079,7 +2077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blobDigests != null)
           'blobDigests': blobDigests!.map((value) => value.toJson()).toList(),
       };
@@ -2102,7 +2100,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (missingBlobDigests != null)
           'missingBlobDigests':
               missingBlobDigests!.map((value) => value.toJson()).toList(),
@@ -2135,7 +2133,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directories != null)
           'directories': directories!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2168,7 +2166,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digest != null) 'digest': digest!.toJson(),
         if (humanReadable != null) 'humanReadable': humanReadable!,
       };
@@ -2197,7 +2195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -2228,7 +2226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (path != null) 'path': path!,
         if (treeDigest != null) 'treeDigest': treeDigest!.toJson(),
       };
@@ -2295,7 +2293,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contents != null) 'contents': contents!,
         if (digest != null) 'digest': digest!.toJson(),
         if (isExecutable != null) 'isExecutable': isExecutable!,
@@ -2350,7 +2348,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodeProperties != null)
           'nodeProperties':
               nodeProperties!.map((value) => value.toJson()).toList(),
@@ -2385,7 +2383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (properties != null)
           'properties': properties!.map((value) => value.toJson()).toList(),
       };
@@ -2422,7 +2420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -2447,7 +2445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (priorities != null)
           'priorities': priorities!.map((value) => value.toJson()).toList(),
       };
@@ -2470,7 +2468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxPriority != null) 'maxPriority': maxPriority!,
         if (minPriority != null) 'minPriority': minPriority!,
       };
@@ -2527,7 +2525,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionId != null) 'actionId': actionId!,
         if (correlatedInvocationsId != null)
           'correlatedInvocationsId': correlatedInvocationsId!,
@@ -2557,7 +2555,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (priority != null) 'priority': priority!,
       };
 }
@@ -2606,7 +2604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheCapabilities != null)
           'cacheCapabilities': cacheCapabilities!.toJson(),
         if (deprecatedApiVersion != null)
@@ -2654,7 +2652,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (nodeProperties != null)
           'nodeProperties':
@@ -2682,7 +2680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (toolName != null) 'toolName': toolName!,
         if (toolVersion != null) 'toolVersion': toolVersion!,
       };
@@ -2718,7 +2716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (children != null)
           'children': children!.map((value) => value.toJson()).toList(),
         if (root != null) 'root': root!.toJson(),
@@ -2733,7 +2731,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The full version of a given tool.
@@ -2771,7 +2769,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (major != null) 'major': major!,
         if (minor != null) 'minor': minor!,
         if (patch != null) 'patch': patch!,
@@ -2862,7 +2860,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cmWaitForAssignment != null)
           'cmWaitForAssignment': cmWaitForAssignment!,
         if (dockerPrep != null) 'dockerPrep': dockerPrep!,
@@ -2938,7 +2936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cmUsage != null) 'cmUsage': cmUsage!,
         if (dockerCacheHit != null) 'dockerCacheHit': dockerCacheHit!,
         if (dockerImageName != null) 'dockerImageName': dockerImageName!,
@@ -3033,7 +3031,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (message != null) 'message': message!,
       };
@@ -3061,7 +3059,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpuUsedPercent != null) 'cpuUsedPercent': cpuUsedPercent!,
         if (diskUsage != null) 'diskUsage': diskUsage!.toJson(),
         if (memoryUsage != null) 'memoryUsage': memoryUsage!.toJson(),
@@ -3083,7 +3081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (total != null) 'total': total!,
         if (used != null) 'used': used!,
       };
@@ -3110,7 +3108,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorCount != null) 'acceleratorCount': acceleratorCount!,
         if (acceleratorType != null) 'acceleratorType': acceleratorType!,
       };
@@ -3140,7 +3138,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxSize != null) 'maxSize': maxSize!,
         if (minSize != null) 'minSize': minSize!,
       };
@@ -3182,7 +3180,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!.toJson(),
         if (instanceId != null) 'instanceId': instanceId!,
         if (parent != null) 'parent': parent!,
@@ -3225,7 +3223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parent != null) 'parent': parent!,
         if (poolId != null) 'poolId': poolId!,
         if (workerPool != null) 'workerPool': workerPool!.toJson(),
@@ -3248,7 +3246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -3270,7 +3268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -3392,7 +3390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerImageSources != null)
           'containerImageSources': containerImageSources!.toJson(),
         if (dockerAddCapabilities != null)
@@ -3444,7 +3442,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedValues != null) 'allowedValues': allowedValues!,
         if (policy != null) 'policy': policy!,
       };
@@ -3466,7 +3464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -3488,7 +3486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -3562,7 +3560,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (featurePolicy != null) 'featurePolicy': featurePolicy!.toJson(),
         if (location != null) 'location': location!,
         if (loggingEnabled != null) 'loggingEnabled': loggingEnabled!,
@@ -3586,7 +3584,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parent != null) 'parent': parent!,
       };
 }
@@ -3608,7 +3606,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
       };
@@ -3652,7 +3650,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
         if (parent != null) 'parent': parent!,
       };
@@ -3677,7 +3675,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (workerPools != null)
           'workerPools': workerPools!.map((value) => value.toJson()).toList(),
       };
@@ -3729,7 +3727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!.toJson(),
         if (loggingEnabled != null) 'loggingEnabled': loggingEnabled!,
         if (name != null) 'name': name!,
@@ -3766,7 +3764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (updateMask != null) 'updateMask': updateMask!,
         if (workerPool != null) 'workerPool': workerPool!.toJson(),
       };
@@ -3858,13 +3856,12 @@
       diskType = _json['diskType'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('machineType')) {
       machineType = _json['machineType'] as core.String;
@@ -3889,7 +3886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accelerator != null) 'accelerator': accelerator!.toJson(),
         if (diskSizeGb != null) 'diskSizeGb': diskSizeGb!,
         if (diskType != null) 'diskType': diskType!,
@@ -3978,7 +3975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscale != null) 'autoscale': autoscale!.toJson(),
         if (channel != null) 'channel': channel!,
         if (name != null) 'name': name!,
@@ -4027,7 +4024,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arg != null) 'arg': arg!,
         if (command != null) 'command': command!,
       };
@@ -4061,7 +4058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contents != null) 'contents': contents!,
         if (digest != null) 'digest': digest!.toJson(),
       };
@@ -4097,7 +4094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exitCode != null) 'exitCode': exitCode!,
         if (outputs != null) 'outputs': outputs!.toJson(),
       };
@@ -4129,7 +4126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (overhead != null) 'overhead': overhead!,
       };
@@ -4191,8 +4188,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = (_json['metadata'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4213,7 +4210,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (exitCode != null) 'exitCode': exitCode!,
         if (metadata != null) 'metadata': metadata!,
@@ -4253,7 +4250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expectedOutputs != null)
           'expectedOutputs': expectedOutputs!.toJson(),
         if (inputs != null) 'inputs': inputs!.toJson(),
@@ -4340,7 +4337,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arguments != null) 'arguments': arguments!,
         if (environmentVariables != null)
           'environmentVariables':
@@ -4373,7 +4370,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -4429,7 +4426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directories != null) 'directories': directories!,
         if (files != null) 'files': files!,
         if (stderrDestination != null) 'stderrDestination': stderrDestination!,
@@ -4476,7 +4473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (execution != null) 'execution': execution!,
         if (idle != null) 'idle': idle!,
         if (shutdown != null) 'shutdown': shutdown!,
@@ -4516,7 +4513,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hash != null) 'hash': hash!,
         if (sizeBytes != null) 'sizeBytes': sizeBytes!,
       };
@@ -4551,7 +4548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directories != null)
           'directories': directories!.map((value) => value.toJson()).toList(),
         if (files != null)
@@ -4582,7 +4579,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digest != null) 'digest': digest!.toJson(),
         if (path != null) 'path': path!,
       };
@@ -4638,7 +4635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contents != null) 'contents': contents!,
         if (digest != null) 'digest': digest!.toJson(),
         if (isExecutable != null) 'isExecutable': isExecutable!,
@@ -4700,29 +4697,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4764,8 +4759,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4778,7 +4773,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/reseller/v1.dart b/generated/googleapis/lib/reseller/v1.dart
index 68335ff..4c63471 100644
--- a/generated/googleapis/lib/reseller/v1.dart
+++ b/generated/googleapis/lib/reseller/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1069,7 +1068,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressLine1 != null) 'addressLine1': addressLine1!,
         if (addressLine2 != null) 'addressLine2': addressLine2!,
         if (addressLine3 != null) 'addressLine3': addressLine3!,
@@ -1147,7 +1146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dealCode != null) 'dealCode': dealCode!,
         if (kind != null) 'kind': kind!,
         if (planName != null) 'planName': planName!,
@@ -1240,7 +1239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternateEmail != null) 'alternateEmail': alternateEmail!,
         if (customerDomain != null) 'customerDomain': customerDomain!,
         if (customerDomainVerified != null)
@@ -1278,7 +1277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (renewalType != null) 'renewalType': renewalType!,
       };
@@ -1306,7 +1305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (serviceAccountEmailAddresses != null)
           'serviceAccountEmailAddresses': serviceAccountEmailAddresses!,
         if (topicName != null) 'topicName': topicName!,
@@ -1326,7 +1325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topicName != null) 'topicName': topicName!,
       };
 }
@@ -1384,7 +1383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (licensedNumberOfSeats != null)
           'licensedNumberOfSeats': licensedNumberOfSeats!,
@@ -1422,7 +1421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -1478,7 +1477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commitmentInterval != null)
           'commitmentInterval': commitmentInterval!.toJson(),
         if (isCommitmentPlan != null) 'isCommitmentPlan': isCommitmentPlan!,
@@ -1515,7 +1514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minimumTransferableSeats != null)
           'minimumTransferableSeats': minimumTransferableSeats!,
         if (transferabilityExpirationTime != null)
@@ -1551,7 +1550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isInTrial != null) 'isInTrial': isInTrial!,
         if (trialEndTime != null) 'trialEndTime': trialEndTime!,
       };
@@ -1744,7 +1743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingMethod != null) 'billingMethod': billingMethod!,
         if (creationTime != null) 'creationTime': creationTime!,
         if (customerDomain != null) 'customerDomain': customerDomain!,
@@ -1805,7 +1804,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (subscriptions != null)
diff --git a/generated/googleapis/lib/retail/v2.dart b/generated/googleapis/lib/retail/v2.dart
index 84c4eda..0d582f8 100644
--- a/generated/googleapis/lib/retail/v2.dart
+++ b/generated/googleapis/lib/retail/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1123,8 +1122,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1134,7 +1133,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (data != null) 'data': data!,
         if (extensions != null) 'extensions': extensions!,
@@ -1163,7 +1162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpRequest != null) 'httpRequest': httpRequest!.toJson(),
         if (reportLocation != null) 'reportLocation': reportLocation!.toJson(),
       };
@@ -1227,24 +1226,22 @@
       message = _json['message'] as core.String;
     }
     if (_json.containsKey('requestPayload')) {
-      requestPayload = (_json['requestPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      requestPayload =
+          (_json['requestPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('responsePayload')) {
-      responsePayload = (_json['responsePayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      responsePayload =
+          (_json['responsePayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('serviceContext')) {
       serviceContext = GoogleCloudRetailLoggingServiceContext.fromJson(
@@ -1256,7 +1253,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (importPayload != null) 'importPayload': importPayload!.toJson(),
         if (message != null) 'message': message!,
@@ -1280,7 +1277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responseStatusCode != null)
           'responseStatusCode': responseStatusCode!,
       };
@@ -1336,7 +1333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (catalogItem != null) 'catalogItem': catalogItem!,
         if (gcsPath != null) 'gcsPath': gcsPath!,
         if (lineNumber != null) 'lineNumber': lineNumber!,
@@ -1361,7 +1358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!,
       };
 }
@@ -1382,7 +1379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (functionName != null) 'functionName': functionName!,
       };
 }
@@ -1445,7 +1442,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSchema != null) 'dataSchema': dataSchema!,
         if (datasetId != null) 'datasetId': datasetId!,
         if (gcsStagingDir != null) 'gcsStagingDir': gcsStagingDir!,
@@ -1489,7 +1486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (productLevelConfig != null)
@@ -1531,7 +1528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numbers != null) 'numbers': numbers!,
         if (text != null) 'text': text!,
       };
@@ -1577,7 +1574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSchema != null) 'dataSchema': dataSchema!,
         if (inputUris != null) 'inputUris': inputUris!,
       };
@@ -1622,7 +1619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (uri != null) 'uri': uri!,
         if (width != null) 'width': width!,
@@ -1646,7 +1643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsPrefix != null) 'gcsPrefix': gcsPrefix!,
       };
 }
@@ -1686,7 +1683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (failureCount != null) 'failureCount': failureCount!,
         if (successCount != null) 'successCount': successCount!,
@@ -1725,7 +1722,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
@@ -1759,7 +1756,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -1791,7 +1788,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
       };
@@ -1832,7 +1829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -1866,7 +1863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (catalogs != null)
           'catalogs': catalogs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1953,13 +1950,12 @@
       filter = _json['filter'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('pageSize')) {
       pageSize = _json['pageSize'] as core.int;
@@ -1968,13 +1964,12 @@
       pageToken = _json['pageToken'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('userEvent')) {
       userEvent = GoogleCloudRetailV2UserEvent.fromJson(
@@ -1985,7 +1980,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
         if (labels != null) 'labels': labels!,
         if (pageSize != null) 'pageSize': pageSize!,
@@ -2040,7 +2035,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributionToken != null) 'attributionToken': attributionToken!,
         if (missingIds != null) 'missingIds': missingIds!,
         if (results != null)
@@ -2072,17 +2067,16 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (metadata != null) 'metadata': metadata!,
       };
@@ -2134,7 +2128,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cost != null) 'cost': cost!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (originalPrice != null) 'originalPrice': originalPrice!,
@@ -2319,15 +2313,14 @@
 
   GoogleCloudRetailV2Product.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = (_json['attributes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudRetailV2CustomAttribute.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      attributes =
+          (_json['attributes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudRetailV2CustomAttribute.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('availability')) {
       availability = _json['availability'] as core.String;
@@ -2382,7 +2375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes':
               attributes!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -2433,7 +2426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (product != null) 'product': product!.toJson(),
         if (quantity != null) 'quantity': quantity!,
       };
@@ -2460,7 +2453,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (products != null)
           'products': products!.map((value) => value.toJson()).toList(),
       };
@@ -2494,7 +2487,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigQuerySource != null) 'bigQuerySource': bigQuerySource!.toJson(),
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
         if (productInlineSource != null)
@@ -2546,7 +2539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingestionProductType != null)
           'ingestionProductType': ingestionProductType!,
         if (merchantCenterProductIdField != null)
@@ -2603,7 +2596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cost != null) 'cost': cost!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (id != null) 'id': id!,
@@ -2622,7 +2615,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for PurgeUserEvents method.
@@ -2662,7 +2655,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
         if (force != null) 'force': force!,
       };
@@ -2684,7 +2677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (purgedEventsCount != null) 'purgedEventsCount': purgedEventsCount!,
       };
 }
@@ -2697,7 +2690,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for RejoinUserEvents method.
@@ -2724,7 +2717,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userEventRejoinScope != null)
           'userEventRejoinScope': userEventRejoinScope!,
       };
@@ -2743,7 +2736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rejoinedUserEventsCount != null)
           'rejoinedUserEventsCount': rejoinedUserEventsCount!,
       };
@@ -2887,15 +2880,14 @@
 
   GoogleCloudRetailV2UserEvent.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = (_json['attributes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudRetailV2CustomAttribute.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      attributes =
+          (_json['attributes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudRetailV2CustomAttribute.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('attributionToken')) {
       attributionToken = _json['attributionToken'] as core.String;
@@ -2951,7 +2943,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes':
               attributes!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -2997,7 +2989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (joinedEventsCount != null) 'joinedEventsCount': joinedEventsCount!,
         if (unjoinedEventsCount != null)
           'unjoinedEventsCount': unjoinedEventsCount!,
@@ -3025,7 +3017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userEvents != null)
           'userEvents': userEvents!.map((value) => value.toJson()).toList(),
       };
@@ -3066,7 +3058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigQuerySource != null) 'bigQuerySource': bigQuerySource!.toJson(),
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
         if (userEventInlineSource != null)
@@ -3128,7 +3120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directUserRequest != null) 'directUserRequest': directUserRequest!,
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (userAgent != null) 'userAgent': userAgent!,
@@ -3153,7 +3145,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsPrefix != null) 'gcsPrefix': gcsPrefix!,
       };
 }
@@ -3181,7 +3173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (updateTime != null) 'updateTime': updateTime!,
       };
@@ -3214,7 +3206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -3249,7 +3241,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -3273,7 +3265,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsPrefix != null) 'gcsPrefix': gcsPrefix!,
       };
 }
@@ -3313,7 +3305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (failureCount != null) 'failureCount': failureCount!,
         if (successCount != null) 'successCount': successCount!,
@@ -3348,7 +3340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -3390,7 +3382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -3408,7 +3400,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response of the PurgeUserEventsRequest.
@@ -3427,7 +3419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (purgedEventsCount != null) 'purgedEventsCount': purgedEventsCount!,
       };
 }
@@ -3440,7 +3432,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for RejoinUserEvents method.
@@ -3456,7 +3448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rejoinedUserEventsCount != null)
           'rejoinedUserEventsCount': rejoinedUserEventsCount!,
       };
@@ -3484,7 +3476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (joinedEventsCount != null) 'joinedEventsCount': joinedEventsCount!,
         if (unjoinedEventsCount != null)
           'unjoinedEventsCount': unjoinedEventsCount!,
@@ -3508,7 +3500,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsPrefix != null) 'gcsPrefix': gcsPrefix!,
       };
 }
@@ -3536,7 +3528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (updateTime != null) 'updateTime': updateTime!,
       };
@@ -3569,7 +3561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -3604,7 +3596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -3628,7 +3620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsPrefix != null) 'gcsPrefix': gcsPrefix!,
       };
 }
@@ -3668,7 +3660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (failureCount != null) 'failureCount': failureCount!,
         if (successCount != null) 'successCount': successCount!,
@@ -3703,7 +3695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -3745,7 +3737,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -3763,7 +3755,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response of the PurgeUserEventsRequest.
@@ -3782,7 +3774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (purgedEventsCount != null) 'purgedEventsCount': purgedEventsCount!,
       };
 }
@@ -3795,7 +3787,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for RejoinUserEvents method.
@@ -3811,7 +3803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rejoinedUserEventsCount != null)
           'rejoinedUserEventsCount': rejoinedUserEventsCount!,
       };
@@ -3839,7 +3831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (joinedEventsCount != null) 'joinedEventsCount': joinedEventsCount!,
         if (unjoinedEventsCount != null)
           'unjoinedEventsCount': unjoinedEventsCount!,
@@ -3863,7 +3855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsPrefix != null) 'gcsPrefix': gcsPrefix!,
       };
 }
@@ -3891,7 +3883,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (updateTime != null) 'updateTime': updateTime!,
       };
@@ -3924,7 +3916,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -3959,7 +3951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -3983,7 +3975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsPrefix != null) 'gcsPrefix': gcsPrefix!,
       };
 }
@@ -4023,7 +4015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (failureCount != null) 'failureCount': failureCount!,
         if (successCount != null) 'successCount': successCount!,
@@ -4058,7 +4050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -4100,7 +4092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -4118,7 +4110,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response of the PurgeUserEventsRequest.
@@ -4137,7 +4129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (purgedEventsCount != null) 'purgedEventsCount': purgedEventsCount!,
       };
 }
@@ -4150,7 +4142,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for RejoinUserEvents method.
@@ -4166,7 +4158,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rejoinedUserEventsCount != null)
           'rejoinedUserEventsCount': rejoinedUserEventsCount!,
       };
@@ -4194,7 +4186,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (joinedEventsCount != null) 'joinedEventsCount': joinedEventsCount!,
         if (unjoinedEventsCount != null)
           'unjoinedEventsCount': unjoinedEventsCount!,
@@ -4224,7 +4216,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -4285,29 +4277,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4330,7 +4320,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -4366,8 +4356,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4380,7 +4370,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/run/v1.dart b/generated/googleapis/lib/run/v1.dart
index 6d21d36..a2bc820 100644
--- a/generated/googleapis/lib/run/v1.dart
+++ b/generated/googleapis/lib/run/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2255,7 +2254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -2301,7 +2300,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -2343,7 +2342,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -2376,7 +2375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
       };
@@ -2448,7 +2447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -2491,7 +2490,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (localObjectReference != null)
           'localObjectReference': localObjectReference!.toJson(),
         if (name != null) 'name': name!,
@@ -2538,7 +2537,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (localObjectReference != null)
           'localObjectReference': localObjectReference!.toJson(),
@@ -2602,7 +2601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultMode != null) 'defaultMode': defaultMode!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -2660,7 +2659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (kind != null) 'kind': kind!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -2685,7 +2684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (template != null) 'template': template!.toJson(),
       };
 }
@@ -2739,7 +2738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
         if (latestCreatedRevisionName != null)
@@ -2946,7 +2945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (args != null) 'args': args!,
         if (command != null) 'command': command!,
         if (env != null) 'env': env!.map((value) => value.toJson()).toList(),
@@ -3005,7 +3004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerPort != null) 'containerPort': containerPort!,
         if (name != null) 'name': name!,
         if (protocol != null) 'protocol': protocol!,
@@ -3054,7 +3053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (kind != null) 'kind': kind!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -3100,7 +3099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificateMode != null) 'certificateMode': certificateMode!,
         if (forceOverride != null) 'forceOverride': forceOverride!,
         if (routeName != null) 'routeName': routeName!,
@@ -3163,7 +3162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
         if (mappedRouteName != null) 'mappedRouteName': mappedRouteName!,
@@ -3209,7 +3208,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configMapRef != null) 'configMapRef': configMapRef!.toJson(),
         if (prefix != null) 'prefix': prefix!,
         if (secretRef != null) 'secretRef': secretRef!.toJson(),
@@ -3254,7 +3253,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
         if (valueFrom != null) 'valueFrom': valueFrom!.toJson(),
@@ -3285,7 +3284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configMapKeyRef != null)
           'configMapKeyRef': configMapKeyRef!.toJson(),
         if (secretKeyRef != null) 'secretKeyRef': secretKeyRef!.toJson(),
@@ -3316,7 +3315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (command != null) 'command': command!,
       };
 }
@@ -3382,7 +3381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -3446,7 +3445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastTransitionTime != null)
           'lastTransitionTime': lastTransitionTime!,
         if (message != null) 'message': message!,
@@ -3502,7 +3501,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (httpHeaders != null)
           'httpHeaders': httpHeaders!.map((value) => value.toJson()).toList(),
@@ -3533,7 +3532,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -3576,7 +3575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (mode != null) 'mode': mode!,
         if (path != null) 'path': path!,
@@ -3605,7 +3604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domains != null)
           'domains': domains!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3655,7 +3654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -3708,7 +3707,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -3740,7 +3739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3791,7 +3790,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (continue_ != null) 'continue': continue_!,
         if (resourceVersion != null) 'resourceVersion': resourceVersion!,
         if (selfLink != null) 'selfLink': selfLink!,
@@ -3841,7 +3840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -3894,7 +3893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -3947,7 +3946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -3976,7 +3975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -4018,32 +4017,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -4203,14 +4200,13 @@
 
   ObjectMeta.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
-      annotations = (_json['annotations'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      annotations =
+          (_json['annotations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('clusterName')) {
       clusterName = _json['clusterName'] as core.String;
@@ -4237,13 +4233,12 @@
       generation = _json['generation'] as core.int;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4268,7 +4263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotations != null) 'annotations': annotations!,
         if (clusterName != null) 'clusterName': clusterName!,
         if (creationTimestamp != null) 'creationTimestamp': creationTimestamp!,
@@ -4352,7 +4347,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (blockOwnerDeletion != null)
           'blockOwnerDeletion': blockOwnerDeletion!,
@@ -4467,7 +4462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -4567,7 +4562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exec != null) 'exec': exec!.toJson(),
         if (failureThreshold != null) 'failureThreshold': failureThreshold!,
         if (httpGet != null) 'httpGet': httpGet!.toJson(),
@@ -4617,7 +4612,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (rrdata != null) 'rrdata': rrdata!,
         if (type != null) 'type': type!,
@@ -4650,26 +4645,24 @@
 
   ResourceRequirements.fromJson(core.Map _json) {
     if (_json.containsKey('limits')) {
-      limits =
-          (_json['limits'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      limits = (_json['limits'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('requests')) {
-      requests =
-          (_json['requests'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      requests = (_json['requests'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (limits != null) 'limits': limits!,
         if (requests != null) 'requests': requests!,
       };
@@ -4721,7 +4714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (kind != null) 'kind': kind!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -4794,7 +4787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerConcurrency != null)
           'containerConcurrency': containerConcurrency!,
         if (containers != null)
@@ -4870,7 +4863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
         if (imageDigest != null) 'imageDigest': imageDigest!,
@@ -4916,7 +4909,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (spec != null) 'spec': spec!.toJson(),
       };
@@ -4972,7 +4965,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (kind != null) 'kind': kind!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -5000,7 +4993,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (traffic != null)
           'traffic': traffic!.map((value) => value.toJson()).toList(),
       };
@@ -5071,7 +5064,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!.toJson(),
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
@@ -5118,7 +5111,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (localObjectReference != null)
           'localObjectReference': localObjectReference!.toJson(),
         if (name != null) 'name': name!,
@@ -5167,7 +5160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (localObjectReference != null)
           'localObjectReference': localObjectReference!.toJson(),
@@ -5231,7 +5224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultMode != null) 'defaultMode': defaultMode!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -5264,7 +5257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (runAsUser != null) 'runAsUser': runAsUser!,
       };
 }
@@ -5321,7 +5314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (kind != null) 'kind': kind!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -5356,7 +5349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (template != null) 'template': template!.toJson(),
         if (traffic != null)
           'traffic': traffic!.map((value) => value.toJson()).toList(),
@@ -5454,7 +5447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!.toJson(),
         if (conditions != null)
           'conditions': conditions!.map((value) => value.toJson()).toList(),
@@ -5497,7 +5490,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -5568,7 +5561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!.toJson(),
         if (message != null) 'message': message!,
@@ -5615,7 +5608,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (field != null) 'field': field!,
         if (message != null) 'message': message!,
         if (reason != null) 'reason': reason!,
@@ -5695,7 +5688,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (causes != null)
           'causes': causes!.map((value) => value.toJson()).toList(),
         if (group != null) 'group': group!,
@@ -5732,7 +5725,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (port != null) 'port': port!,
       };
@@ -5757,7 +5750,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -5778,7 +5771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -5855,7 +5848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configurationName != null) 'configurationName': configurationName!,
         if (latestRevision != null) 'latestRevision': latestRevision!,
         if (percent != null) 'percent': percent!,
@@ -5894,7 +5887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configMap != null) 'configMap': configMap!.toJson(),
         if (name != null) 'name': name!,
         if (secret != null) 'secret': secret!.toJson(),
@@ -5944,7 +5937,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mountPath != null) 'mountPath': mountPath!,
         if (name != null) 'name': name!,
         if (readOnly != null) 'readOnly': readOnly!,
diff --git a/generated/googleapis/lib/runtimeconfig/v1.dart b/generated/googleapis/lib/runtimeconfig/v1.dart
index b415b16..114d3ad 100644
--- a/generated/googleapis/lib/runtimeconfig/v1.dart
+++ b/generated/googleapis/lib/runtimeconfig/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -225,7 +224,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -242,7 +241,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Operations.ListOperations.
@@ -267,7 +266,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -328,29 +327,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -392,8 +389,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -406,7 +403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/safebrowsing/v4.dart b/generated/googleapis/lib/safebrowsing/v4.dart
index c71f336..ca1dbb0 100644
--- a/generated/googleapis/lib/safebrowsing/v4.dart
+++ b/generated/googleapis/lib/safebrowsing/v4.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -402,7 +401,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The expected state of a client's local database.
@@ -425,7 +424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sha256 != null) 'sha256': sha256!,
       };
 }
@@ -450,7 +449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientId != null) 'clientId': clientId!,
         if (clientVersion != null) 'clientVersion': clientVersion!,
       };
@@ -488,7 +487,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (client != null) 'client': client!.toJson(),
         if (listUpdateRequests != null)
           'listUpdateRequests':
@@ -589,7 +588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (constraints != null) 'constraints': constraints!.toJson(),
         if (platformType != null) 'platformType': platformType!,
         if (state != null) 'state': state!,
@@ -657,7 +656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceLocation != null) 'deviceLocation': deviceLocation!,
         if (language != null) 'language': language!,
         if (maxDatabaseEntries != null)
@@ -702,7 +701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (listUpdateResponses != null)
           'listUpdateResponses':
               listUpdateResponses!.map((value) => value.toJson()).toList(),
@@ -848,7 +847,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additions != null)
           'additions': additions!.map((value) => value.toJson()).toList(),
         if (checksum != null) 'checksum': checksum!.toJson(),
@@ -899,7 +898,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiClient != null) 'apiClient': apiClient!.toJson(),
         if (client != null) 'client': client!.toJson(),
         if (clientStates != null) 'clientStates': clientStates!,
@@ -940,7 +939,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matches != null)
           'matches': matches!.map((value) => value.toJson()).toList(),
         if (minimumWaitDuration != null)
@@ -972,7 +971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (client != null) 'client': client!.toJson(),
         if (threatInfo != null) 'threatInfo': threatInfo!.toJson(),
       };
@@ -995,7 +994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matches != null)
           'matches': matches!.map((value) => value.toJson()).toList(),
       };
@@ -1017,7 +1016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (threatLists != null)
           'threatLists': threatLists!.map((value) => value.toJson()).toList(),
       };
@@ -1061,7 +1060,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (prefixSize != null) 'prefixSize': prefixSize!,
         if (rawHashes != null) 'rawHashes': rawHashes!,
       };
@@ -1082,7 +1081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indices != null) 'indices': indices!,
       };
 }
@@ -1135,7 +1134,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encodedData != null) 'encodedData': encodedData!,
         if (firstValue != null) 'firstValue': firstValue!,
         if (numEntries != null) 'numEntries': numEntries!,
@@ -1190,7 +1189,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (digest != null) 'digest': digest!,
         if (hash != null) 'hash': hash!,
         if (url != null) 'url': url!,
@@ -1219,7 +1218,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
       };
@@ -1261,7 +1260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -1322,7 +1321,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compressionType != null) 'compressionType': compressionType!,
         if (rawHashes != null) 'rawHashes': rawHashes!.toJson(),
         if (rawIndices != null) 'rawIndices': rawIndices!.toJson(),
@@ -1418,7 +1417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientInfo != null) 'clientInfo': clientInfo!.toJson(),
         if (entry != null) 'entry': entry!.toJson(),
         if (platformType != null) 'platformType': platformType!,
@@ -1473,7 +1472,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (referrer != null) 'referrer': referrer!,
         if (remoteIp != null) 'remoteIp': remoteIp!,
         if (type != null) 'type': type!,
@@ -1506,7 +1505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (regionCode != null) 'regionCode': regionCode!,
         if (userId != null) 'userId': userId!,
       };
@@ -1554,7 +1553,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (platformTypes != null) 'platformTypes': platformTypes!,
         if (threatEntries != null)
           'threatEntries':
@@ -1636,7 +1635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (platformType != null) 'platformType': platformType!,
         if (threatEntryType != null) 'threatEntryType': threatEntryType!,
         if (threatType != null) 'threatType': threatType!,
@@ -1737,7 +1736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheDuration != null) 'cacheDuration': cacheDuration!,
         if (platformType != null) 'platformType': platformType!,
         if (threat != null) 'threat': threat!.toJson(),
diff --git a/generated/googleapis/lib/script/v1.dart b/generated/googleapis/lib/script/v1.dart
index d49ae04..4cd4c31 100644
--- a/generated/googleapis/lib/script/v1.dart
+++ b/generated/googleapis/lib/script/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -993,7 +992,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (files != null)
           'files': files!.map((value) => value.toJson()).toList(),
         if (scriptId != null) 'scriptId': scriptId!,
@@ -1022,7 +1021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parentId != null) 'parentId': parentId!,
         if (title != null) 'title': title!,
       };
@@ -1063,7 +1062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deploymentConfig != null)
           'deploymentConfig': deploymentConfig!.toJson(),
         if (deploymentId != null) 'deploymentId': deploymentId!,
@@ -1104,7 +1103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (manifestFileName != null) 'manifestFileName': manifestFileName!,
         if (scriptId != null) 'scriptId': scriptId!,
@@ -1126,7 +1125,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A configuration that defines how a deployment is accessed externally.
@@ -1168,7 +1167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addOn != null) 'addOn': addOn!.toJson(),
         if (entryPointType != null) 'entryPointType': entryPointType!,
         if (executionApi != null) 'executionApi': executionApi!.toJson(),
@@ -1191,7 +1190,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!.toJson(),
       };
 }
@@ -1236,7 +1235,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (errorType != null) 'errorType': errorType!,
         if (scriptStackTraceElements != null)
@@ -1309,7 +1308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devMode != null) 'devMode': devMode!,
         if (function != null) 'function': function!,
         if (parameters != null) 'parameters': parameters!,
@@ -1342,7 +1341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (result != null) 'result': result!,
       };
 }
@@ -1421,7 +1420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (functionSet != null) 'functionSet': functionSet!.toJson(),
         if (lastModifyUser != null) 'lastModifyUser': lastModifyUser!.toJson(),
@@ -1479,7 +1478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addOnType != null) 'addOnType': addOnType!,
         if (description != null) 'description': description!,
         if (helpUrl != null) 'helpUrl': helpUrl!,
@@ -1512,7 +1511,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (access != null) 'access': access!,
       };
 }
@@ -1531,7 +1530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entryPointConfig != null)
           'entryPointConfig': entryPointConfig!.toJson(),
       };
@@ -1550,7 +1549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -1574,7 +1573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
       };
@@ -1661,7 +1660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (functionName != null) 'functionName': functionName!,
         if (processStatus != null) 'processStatus': processStatus!,
@@ -1703,7 +1702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domain != null) 'domain': domain!,
         if (email != null) 'email': email!,
         if (name != null) 'name': name!,
@@ -1745,7 +1744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (access != null) 'access': access!,
         if (executeAs != null) 'executeAs': executeAs!,
       };
@@ -1771,7 +1770,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entryPointConfig != null)
           'entryPointConfig': entryPointConfig!.toJson(),
         if (url != null) 'url': url!,
@@ -1801,7 +1800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployments != null)
           'deployments': deployments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1833,7 +1832,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (processes != null)
           'processes': processes!.map((value) => value.toJson()).toList(),
@@ -1865,7 +1864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (processes != null)
           'processes': processes!.map((value) => value.toJson()).toList(),
@@ -1888,7 +1887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
       };
@@ -1918,7 +1917,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (versions != null)
           'versions': versions!.map((value) => value.toJson()).toList(),
@@ -1960,7 +1959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeUsers != null)
           'activeUsers': activeUsers!.map((value) => value.toJson()).toList(),
         if (failedExecutions != null)
@@ -1997,7 +1996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
         if (value != null) 'value': value!,
@@ -2056,17 +2055,16 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (response != null) 'response': response!,
@@ -2127,7 +2125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (creator != null) 'creator': creator!.toJson(),
         if (lastModifyUser != null) 'lastModifyUser': lastModifyUser!.toJson(),
@@ -2152,7 +2150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (returnValue != null) 'returnValue': returnValue!.toJson(),
       };
 }
@@ -2176,7 +2174,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (function != null) 'function': function!,
         if (lineNumber != null) 'lineNumber': lineNumber!,
       };
@@ -2214,8 +2212,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2228,7 +2226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2245,18 +2243,16 @@
 
   Struct.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
-      fields = (_json['fields'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Value.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      fields = (_json['fields'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Value.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields':
               fields!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -2277,7 +2273,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deploymentConfig != null)
           'deploymentConfig': deploymentConfig!.toJson(),
       };
@@ -2348,14 +2344,13 @@
       numberValue = (_json['numberValue'] as core.num).toDouble();
     }
     if (_json.containsKey('protoValue')) {
-      protoValue = (_json['protoValue'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      protoValue =
+          (_json['protoValue'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('stringValue')) {
       stringValue = _json['stringValue'] as core.String;
@@ -2366,7 +2361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (bytesValue != null) 'bytesValue': bytesValue!,
         if (dateValue != null) 'dateValue': dateValue!,
@@ -2417,7 +2412,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (scriptId != null) 'scriptId': scriptId!,
diff --git a/generated/googleapis/lib/searchconsole/v1.dart b/generated/googleapis/lib/searchconsole/v1.dart
index f9b79a5..79e82f2 100644
--- a/generated/googleapis/lib/searchconsole/v1.dart
+++ b/generated/googleapis/lib/searchconsole/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -520,7 +519,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clicks != null) 'clicks': clicks!,
         if (ctr != null) 'ctr': ctr!,
         if (impressions != null) 'impressions': impressions!,
@@ -569,7 +568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!,
         if (expression != null) 'expression': expression!,
         if (operator != null) 'operator': operator!,
@@ -603,7 +602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filters != null)
           'filters': filters!.map((value) => value.toJson()).toList(),
         if (groupType != null) 'groupType': groupType!,
@@ -623,7 +622,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
@@ -656,7 +655,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -693,7 +692,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rule != null) 'rule': rule!,
       };
 }
@@ -712,7 +711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockedResource != null)
           'blockedResource': blockedResource!.toJson(),
       };
@@ -739,7 +738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestScreenshot != null) 'requestScreenshot': requestScreenshot!,
         if (url != null) 'url': url!,
       };
@@ -796,7 +795,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mobileFriendliness != null)
           'mobileFriendliness': mobileFriendliness!,
         if (mobileFriendlyIssues != null)
@@ -928,7 +927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregationType != null) 'aggregationType': aggregationType!,
         if (dataState != null) 'dataState': dataState!,
         if (dimensionFilterGroups != null)
@@ -972,7 +971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responseAggregationType != null)
           'responseAggregationType': responseAggregationType!,
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
@@ -996,7 +995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sitemap != null)
           'sitemap': sitemap!.map((value) => value.toJson()).toList(),
       };
@@ -1021,7 +1020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (siteEntry != null)
           'siteEntry': siteEntry!.map((value) => value.toJson()).toList(),
       };
@@ -1057,7 +1056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!,
         if (status != null) 'status': status!,
       };
@@ -1093,7 +1092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissionLevel != null) 'permissionLevel': permissionLevel!,
         if (siteUrl != null) 'siteUrl': siteUrl!,
       };
@@ -1183,7 +1182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contents != null)
           'contents': contents!.map((value) => value.toJson()).toList(),
         if (errors != null) 'errors': errors!,
@@ -1235,7 +1234,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexed != null) 'indexed': indexed!,
         if (submitted != null) 'submitted': submitted!,
         if (type != null) 'type': type!,
diff --git a/generated/googleapis/lib/secretmanager/v1.dart b/generated/googleapis/lib/secretmanager/v1.dart
index 4394e9d..75ce266 100644
--- a/generated/googleapis/lib/secretmanager/v1.dart
+++ b/generated/googleapis/lib/secretmanager/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -879,7 +878,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (payload != null) 'payload': payload!.toJson(),
       };
@@ -901,7 +900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payload != null) 'payload': payload!.toJson(),
       };
 }
@@ -947,7 +946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -989,7 +988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1018,7 +1017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerManagedEncryption != null)
           'customerManagedEncryption': customerManagedEncryption!.toJson(),
       };
@@ -1045,7 +1044,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerManagedEncryption != null)
           'customerManagedEncryption': customerManagedEncryption!.toJson(),
       };
@@ -1117,7 +1116,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1147,7 +1146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
       };
 }
@@ -1169,7 +1168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsKeyVersionName != null) 'kmsKeyVersionName': kmsKeyVersionName!,
       };
 }
@@ -1182,7 +1181,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for SecretManagerService.DisableSecretVersion.
@@ -1193,7 +1192,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A generic empty message that you can re-use to avoid defining duplicated
@@ -1210,7 +1209,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for SecretManagerService.EnableSecretVersion.
@@ -1221,7 +1220,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -1285,7 +1284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1315,7 +1314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1354,7 +1353,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (totalSize != null) 'totalSize': totalSize!,
         if (versions != null)
@@ -1393,7 +1392,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (secrets != null)
           'secrets': secrets!.map((value) => value.toJson()).toList(),
@@ -1438,32 +1437,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1576,7 +1573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -1616,7 +1613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerManagedEncryption != null)
           'customerManagedEncryption': customerManagedEncryption!.toJson(),
         if (location != null) 'location': location!,
@@ -1652,7 +1649,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerManagedEncryption != null)
           'customerManagedEncryption': customerManagedEncryption!.toJson(),
         if (location != null) 'location': location!,
@@ -1680,7 +1677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (automatic != null) 'automatic': automatic!.toJson(),
         if (userManaged != null) 'userManaged': userManaged!.toJson(),
       };
@@ -1713,7 +1710,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (automatic != null) 'automatic': automatic!.toJson(),
         if (userManaged != null) 'userManaged': userManaged!.toJson(),
       };
@@ -1782,13 +1779,12 @@
       expireTime = _json['expireTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1808,7 +1804,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (expireTime != null) 'expireTime': expireTime!,
         if (labels != null) 'labels': labels!,
@@ -1844,7 +1840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
       };
 }
@@ -1908,7 +1904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (destroyTime != null) 'destroyTime': destroyTime!,
         if (name != null) 'name': name!,
@@ -1945,7 +1941,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -1970,7 +1966,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1991,7 +1987,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2016,7 +2012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -2042,7 +2038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (replicas != null)
           'replicas': replicas!.map((value) => value.toJson()).toList(),
       };
@@ -2068,7 +2064,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (replicas != null)
           'replicas': replicas!.map((value) => value.toJson()).toList(),
       };
diff --git a/generated/googleapis/lib/securitycenter/v1.dart b/generated/googleapis/lib/securitycenter/v1.dart
index e762b1f..0a995db 100644
--- a/generated/googleapis/lib/securitycenter/v1.dart
+++ b/generated/googleapis/lib/securitycenter/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3005,14 +3004,14 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('resourceProperties')) {
-      resourceProperties = (_json['resourceProperties'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      resourceProperties =
+          (_json['resourceProperties'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('securityCenterProperties')) {
       securityCenterProperties = SecurityCenterProperties.fromJson(
@@ -3028,7 +3027,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (iamPolicy != null) 'iamPolicy': iamPolicy!.toJson(),
         if (name != null) 'name': name!,
@@ -3079,7 +3078,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folderIds != null) 'folderIds': folderIds!,
         if (inclusionMode != null) 'inclusionMode': inclusionMode!,
         if (projectIds != null) 'projectIds': projectIds!,
@@ -3127,7 +3126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -3169,7 +3168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -3241,7 +3240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -3262,7 +3261,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -3326,7 +3325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -3495,21 +3494,21 @@
       severity = _json['severity'] as core.String;
     }
     if (_json.containsKey('sourceProperties')) {
-      sourceProperties = (_json['sourceProperties'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      sourceProperties =
+          (_json['sourceProperties'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (createTime != null) 'createTime': createTime!,
         if (eventTime != null) 'eventTime': eventTime!,
@@ -3548,7 +3547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceFolder != null) 'resourceFolder': resourceFolder!,
         if (resourceFolderDisplayName != null)
           'resourceFolderDisplayName': resourceFolderDisplayName!,
@@ -3570,7 +3569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -3597,7 +3596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -3630,7 +3629,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (finding != null) 'finding': finding!.toJson(),
         if (notificationConfigName != null)
           'notificationConfigName': notificationConfigName!,
@@ -3692,7 +3691,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folders != null)
           'folders': folders!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -3731,7 +3730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (state != null) 'state': state!,
       };
@@ -3764,7 +3763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (state != null) 'state': state!,
       };
@@ -3899,21 +3898,21 @@
       severity = _json['severity'] as core.String;
     }
     if (_json.containsKey('sourceProperties')) {
-      sourceProperties = (_json['sourceProperties'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      sourceProperties =
+          (_json['sourceProperties'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (createTime != null) 'createTime': createTime!,
         if (eventTime != null) 'eventTime': eventTime!,
@@ -3952,7 +3951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceFolder != null) 'resourceFolder': resourceFolder!,
         if (resourceFolderDisplayName != null)
           'resourceFolderDisplayName': resourceFolderDisplayName!,
@@ -3987,7 +3986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (finding != null) 'finding': finding!.toJson(),
         if (notificationConfigName != null)
           'notificationConfigName': notificationConfigName!,
@@ -4050,7 +4049,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folders != null)
           'folders': folders!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -4089,7 +4088,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duration != null) 'duration': duration!,
         if (state != null) 'state': state!,
       };
@@ -4124,19 +4123,19 @@
 
   GoogleCloudSecuritycenterV1p1beta1SecurityMarks.fromJson(core.Map _json) {
     if (_json.containsKey('marks')) {
-      marks = (_json['marks'] as core.Map).cast<core.String, core.String>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      marks = (_json['marks'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (marks != null) 'marks': marks!,
         if (name != null) 'name': name!,
       };
@@ -4260,7 +4259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compareDuration != null) 'compareDuration': compareDuration!,
         if (filter != null) 'filter': filter!,
         if (groupBy != null) 'groupBy': groupBy!,
@@ -4309,7 +4308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupByResults != null)
           'groupByResults':
               groupByResults!.map((value) => value.toJson()).toList(),
@@ -4422,7 +4421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compareDuration != null) 'compareDuration': compareDuration!,
         if (filter != null) 'filter': filter!,
         if (groupBy != null) 'groupBy': groupBy!,
@@ -4471,7 +4470,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupByResults != null)
           'groupByResults':
               groupByResults!.map((value) => value.toJson()).toList(),
@@ -4499,18 +4498,17 @@
       count = _json['count'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (properties != null) 'properties': properties!,
       };
@@ -4536,7 +4534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policyBlob != null) 'policyBlob': policyBlob!,
       };
 }
@@ -4576,7 +4574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (listAssetsResults != null)
           'listAssetsResults':
               listAssetsResults!.map((value) => value.toJson()).toList(),
@@ -4612,7 +4610,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (asset != null) 'asset': asset!.toJson(),
         if (stateChange != null) 'stateChange': stateChange!,
       };
@@ -4653,7 +4651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (listFindingsResults != null)
           'listFindingsResults':
               listFindingsResults!.map((value) => value.toJson()).toList(),
@@ -4702,7 +4700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (finding != null) 'finding': finding!.toJson(),
         if (resource != null) 'resource': resource!.toJson(),
         if (stateChange != null) 'stateChange': stateChange!,
@@ -4732,7 +4730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (notificationConfigs != null)
           'notificationConfigs':
@@ -4762,7 +4760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -4792,7 +4790,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sources != null)
           'sources': sources!.map((value) => value.toJson()).toList(),
@@ -4851,7 +4849,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (name != null) 'name': name!,
         if (pubsubTopic != null) 'pubsubTopic': pubsubTopic!,
@@ -4915,29 +4913,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4981,7 +4977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assetDiscoveryConfig != null)
           'assetDiscoveryConfig': assetDiscoveryConfig!.toJson(),
         if (enableAssetDiscovery != null)
@@ -5094,7 +5090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -5159,7 +5155,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folders != null)
           'folders': folders!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -5179,7 +5175,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Security Command Center managed properties.
@@ -5269,7 +5265,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folders != null)
           'folders': folders!.map((value) => value.toJson()).toList(),
         if (resourceDisplayName != null)
@@ -5315,19 +5311,19 @@
 
   SecurityMarks.fromJson(core.Map _json) {
     if (_json.containsKey('marks')) {
-      marks = (_json['marks'] as core.Map).cast<core.String, core.String>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      marks = (_json['marks'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (marks != null) 'marks': marks!,
         if (name != null) 'name': name!,
       };
@@ -5362,7 +5358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (startTime != null) 'startTime': startTime!,
         if (state != null) 'state': state!,
       };
@@ -5395,7 +5391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -5444,7 +5440,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -5484,8 +5480,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -5498,7 +5494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -5530,7 +5526,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
       };
 }
@@ -5554,7 +5550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -5575,7 +5571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
diff --git a/generated/googleapis/lib/serviceconsumermanagement/v1.dart b/generated/googleapis/lib/serviceconsumermanagement/v1.dart
index 1ce3b81..0909b4e 100644
--- a/generated/googleapis/lib/serviceconsumermanagement/v1.dart
+++ b/generated/googleapis/lib/serviceconsumermanagement/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -830,7 +829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectConfig != null) 'projectConfig': projectConfig!.toJson(),
         if (tag != null) 'tag': tag!,
       };
@@ -925,7 +924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (methods != null)
           'methods': methods!.map((value) => value.toJson()).toList(),
         if (mixins != null)
@@ -963,7 +962,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectConfig != null) 'projectConfig': projectConfig!.toJson(),
         if (tag != null) 'tag': tag!,
       };
@@ -1004,7 +1003,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (externalResource != null) 'externalResource': externalResource!,
         if (reservedResource != null) 'reservedResource': reservedResource!,
         if (tag != null) 'tag': tag!,
@@ -1098,7 +1097,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audiences != null) 'audiences': audiences!,
         if (authorizationUrl != null) 'authorizationUrl': authorizationUrl!,
         if (id != null) 'id': id!,
@@ -1144,7 +1143,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audiences != null) 'audiences': audiences!,
         if (providerId != null) 'providerId': providerId!,
       };
@@ -1183,7 +1182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (providers != null)
           'providers': providers!.map((value) => value.toJson()).toList(),
         if (rules != null)
@@ -1236,7 +1235,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowWithoutCredential != null)
           'allowWithoutCredential': allowWithoutCredential!,
         if (oauth != null) 'oauth': oauth!.toJson(),
@@ -1264,7 +1263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -1390,7 +1389,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (deadline != null) 'deadline': deadline!,
         if (disableAuth != null) 'disableAuth': disableAuth!,
@@ -1439,7 +1438,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -1461,7 +1460,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingAccount != null) 'billingAccount': billingAccount!,
       };
 }
@@ -1492,7 +1491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null) 'metrics': metrics!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -1506,7 +1505,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// `Context` defines which contexts an API requests.
@@ -1541,7 +1540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -1599,7 +1598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedRequestExtensions != null)
           'allowedRequestExtensions': allowedRequestExtensions!,
         if (allowedResponseExtensions != null)
@@ -1629,7 +1628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!,
       };
 }
@@ -1657,7 +1656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tenancyUnitId != null) 'tenancyUnitId': tenancyUnitId!,
       };
 }
@@ -1692,7 +1691,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
         if (types != null) 'types': types!,
@@ -1723,7 +1722,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isErrorType != null) 'isErrorType': isErrorType!,
         if (selector != null) 'selector': selector!,
       };
@@ -1748,7 +1747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (path != null) 'path': path!,
       };
@@ -1769,7 +1768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag != null) 'tag': tag!,
       };
 }
@@ -1865,7 +1864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentationRootUrl != null)
           'documentationRootUrl': documentationRootUrl!,
         if (overview != null) 'overview': overview!,
@@ -1912,7 +1911,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deprecationDescription != null)
           'deprecationDescription': deprecationDescription!,
         if (description != null) 'description': description!,
@@ -1934,7 +1933,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// `Endpoint` describes a network endpoint of a service that serves a set of
@@ -1996,7 +1995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliases != null) 'aliases': aliases!,
         if (allowCors != null) 'allowCors': allowCors!,
         if (name != null) 'name': name!,
@@ -2051,7 +2050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enumvalue != null)
           'enumvalue': enumvalue!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -2090,7 +2089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (number != null) 'number': number!,
         if (options != null)
@@ -2200,7 +2199,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cardinality != null) 'cardinality': cardinality!,
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (jsonName != null) 'jsonName': jsonName!,
@@ -2248,7 +2247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullyDecodeReservedExpansion != null)
           'fullyDecodeReservedExpansion': fullyDecodeReservedExpansion!,
         if (rules != null)
@@ -2496,7 +2495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalBindings != null)
           'additionalBindings':
               additionalBindings!.map((value) => value.toJson()).toList(),
@@ -2544,7 +2543,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!,
         if (query != null) 'query': query!,
         if (valuePrefix != null) 'valuePrefix': valuePrefix!,
@@ -2580,7 +2579,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (key != null) 'key': key!,
         if (valueType != null) 'valueType': valueType!,
@@ -2609,7 +2608,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -2638,7 +2637,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tenancyUnits != null)
           'tenancyUnits': tenancyUnits!.map((value) => value.toJson()).toList(),
@@ -2696,7 +2695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -2750,7 +2749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -2788,7 +2787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logs != null) 'logs': logs!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -2849,7 +2848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (options != null)
           'options': options!.map((value) => value.toJson()).toList(),
@@ -3075,7 +3074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -3158,7 +3157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingestDelay != null) 'ingestDelay': ingestDelay!,
         if (launchStage != null) 'launchStage': launchStage!,
         if (samplePeriod != null) 'samplePeriod': samplePeriod!,
@@ -3187,21 +3186,20 @@
 
   MetricRule.fromJson(core.Map _json) {
     if (_json.containsKey('metricCosts')) {
-      metricCosts = (_json['metricCosts'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      metricCosts =
+          (_json['metricCosts'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('selector')) {
       selector = _json['selector'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricCosts != null) 'metricCosts': metricCosts!,
         if (selector != null) 'selector': selector!,
       };
@@ -3257,7 +3255,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (root != null) 'root': root!,
       };
@@ -3379,7 +3377,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -3451,7 +3449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -3487,7 +3485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null) 'metrics': metrics!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -3524,7 +3522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalScopes != null) 'canonicalScopes': canonicalScopes!,
       };
 }
@@ -3583,29 +3581,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -3642,16 +3638,16 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = (_json['value'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      value = (_json['value'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -3701,7 +3697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (name != null) 'name': name!,
         if (subpages != null)
@@ -3736,7 +3732,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
       };
@@ -3791,7 +3787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (limits != null)
           'limits': limits!.map((value) => value.toJson()).toList(),
         if (metricRules != null)
@@ -3915,17 +3911,16 @@
       unit = _json['unit'] as core.String;
     }
     if (_json.containsKey('values')) {
-      values =
-          (_json['values'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      values = (_json['values'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultLimit != null) 'defaultLimit': defaultLimit!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -3954,7 +3949,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag != null) 'tag': tag!,
       };
 }
@@ -3981,7 +3976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tenancyUnits != null)
           'tenancyUnits': tenancyUnits!.map((value) => value.toJson()).toList(),
@@ -4245,7 +4240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apis != null) 'apis': apis!.map((value) => value.toJson()).toList(),
         if (authentication != null) 'authentication': authentication!.toJson(),
         if (backend != null) 'backend': backend!.toJson(),
@@ -4310,7 +4305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (tenantProjectRoles != null)
           'tenantProjectRoles': tenantProjectRoles!,
@@ -4334,7 +4329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileName != null) 'fileName': fileName!,
       };
 }
@@ -4352,8 +4347,8 @@
   SourceInfo.fromJson(core.Map _json) {
     if (_json.containsKey('sourceFiles')) {
       sourceFiles = (_json['sourceFiles'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4363,7 +4358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sourceFiles != null) 'sourceFiles': sourceFiles!,
       };
 }
@@ -4401,8 +4396,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4415,7 +4410,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4456,7 +4451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpHeader != null) 'httpHeader': httpHeader!,
         if (name != null) 'name': name!,
         if (urlQueryParameter != null) 'urlQueryParameter': urlQueryParameter!,
@@ -4494,7 +4489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
         if (selector != null) 'selector': selector!,
@@ -4533,7 +4528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -4592,7 +4587,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumer != null) 'consumer': consumer!,
         if (createTime != null) 'createTime': createTime!,
         if (name != null) 'name': name!,
@@ -4652,13 +4647,12 @@
       folder = _json['folder'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('serviceAccountConfig')) {
       serviceAccountConfig = ServiceAccountConfig.fromJson(
@@ -4675,7 +4669,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billingConfig != null) 'billingConfig': billingConfig!.toJson(),
         if (folder != null) 'folder': folder!,
         if (labels != null) 'labels': labels!,
@@ -4708,7 +4702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policyBindings != null)
           'policyBindings':
               policyBindings!.map((value) => value.toJson()).toList(),
@@ -4752,7 +4746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resource != null) 'resource': resource!,
         if (status != null) 'status': status!,
         if (tag != null) 'tag': tag!,
@@ -4814,7 +4808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -4842,7 +4836,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag != null) 'tag': tag!,
       };
 }
@@ -4895,7 +4889,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (producerNotificationChannel != null)
           'producerNotificationChannel': producerNotificationChannel!,
         if (requirements != null) 'requirements': requirements!,
@@ -4949,7 +4943,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowUnregisteredCalls != null)
           'allowUnregisteredCalls': allowUnregisteredCalls!,
         if (selector != null) 'selector': selector!,
@@ -4976,7 +4970,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
       };
 }
@@ -4997,7 +4991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (overrides != null)
           'overrides': overrides!.map((value) => value.toJson()).toList(),
       };
@@ -5014,7 +5008,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for the `EnableConsumer` method.
@@ -5028,7 +5022,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for the `GenerateServiceIdentity` method.
@@ -5048,7 +5042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identity != null) 'identity': identity!.toJson(),
       };
 }
@@ -5069,7 +5063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (overrides != null)
           'overrides': overrides!.map((value) => value.toJson()).toList(),
       };
@@ -5092,7 +5086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policies != null)
           'policies': policies!.map((value) => value.toJson()).toList(),
       };
@@ -5153,14 +5147,13 @@
       container = _json['container'] as core.String;
     }
     if (_json.containsKey('dimensions')) {
-      dimensions = (_json['dimensions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      dimensions =
+          (_json['dimensions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('metric')) {
       metric = _json['metric'] as core.String;
@@ -5176,7 +5169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (container != null) 'container': container!,
         if (dimensions != null) 'dimensions': dimensions!,
         if (metric != null) 'metric': metric!,
@@ -5242,14 +5235,13 @@
       adminOverrideAncestor = _json['adminOverrideAncestor'] as core.String;
     }
     if (_json.containsKey('dimensions')) {
-      dimensions = (_json['dimensions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      dimensions =
+          (_json['dimensions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('metric')) {
       metric = _json['metric'] as core.String;
@@ -5265,7 +5257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminOverrideAncestor != null)
           'adminOverrideAncestor': adminOverrideAncestor!,
         if (dimensions != null) 'dimensions': dimensions!,
@@ -5287,7 +5279,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A service identity in the Identity and Access Management API.
@@ -5327,7 +5319,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (name != null) 'name': name!,
         if (tag != null) 'tag': tag!,
@@ -5373,7 +5365,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (name != null) 'name': name!,
         if (tag != null) 'tag': tag!,
@@ -5392,7 +5384,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for the `EnableConsumer` method.
@@ -5406,7 +5398,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for the `GenerateDefaultIdentity` method.
@@ -5458,7 +5450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachStatus != null) 'attachStatus': attachStatus!,
         if (identity != null) 'identity': identity!.toJson(),
         if (role != null) 'role': role!,
@@ -5482,7 +5474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!.toJson(),
       };
 }
@@ -5498,7 +5490,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for the `RemoveVisibilityLabels` method.
@@ -5519,7 +5511,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
       };
 }
@@ -5569,7 +5561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (iamAccountName != null) 'iamAccountName': iamAccountName!,
         if (name != null) 'name': name!,
diff --git a/generated/googleapis/lib/servicecontrol/v1.dart b/generated/googleapis/lib/servicecontrol/v1.dart
index b4e6f27..2f174a3 100644
--- a/generated/googleapis/lib/servicecontrol/v1.dart
+++ b/generated/googleapis/lib/servicecontrol/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -249,7 +248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unusedArguments != null) 'unusedArguments': unusedArguments!,
       };
 }
@@ -278,7 +277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allocateOperation != null)
           'allocateOperation': allocateOperation!.toJson(),
         if (serviceConfigId != null) 'serviceConfigId': serviceConfigId!,
@@ -338,7 +337,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allocateErrors != null)
           'allocateErrors':
               allocateErrors!.map((value) => value.toJson()).toList(),
@@ -376,7 +375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (intValue != null) 'intValue': intValue!,
         if (stringValue != null) 'stringValue': stringValue!.toJson(),
@@ -405,22 +404,20 @@
 
   Attributes.fromJson(core.Map _json) {
     if (_json.containsKey('attributeMap')) {
-      attributeMap = (_json['attributeMap'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              AttributeValue.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      attributeMap =
+          (_json['attributeMap'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          AttributeValue.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('droppedAttributesCount')) {
       droppedAttributesCount = _json['droppedAttributesCount'] as core.int;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeMap != null)
           'attributeMap': attributeMap!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -541,13 +538,12 @@
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('methodName')) {
       methodName = _json['methodName'] as core.String;
@@ -556,13 +552,12 @@
       numResponseItems = _json['numResponseItems'] as core.String;
     }
     if (_json.containsKey('request')) {
-      request =
-          (_json['request'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      request = (_json['request'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('requestMetadata')) {
       requestMetadata = RequestMetadata.fromJson(
@@ -576,33 +571,31 @@
       resourceName = _json['resourceName'] as core.String;
     }
     if (_json.containsKey('resourceOriginalState')) {
-      resourceOriginalState = (_json['resourceOriginalState'] as core.Map)
-          .cast<core.String, core.Object>()
+      resourceOriginalState = (_json['resourceOriginalState']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('serviceData')) {
-      serviceData = (_json['serviceData'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      serviceData =
+          (_json['serviceData'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('serviceName')) {
       serviceName = _json['serviceName'] as core.String;
@@ -613,7 +606,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authenticationInfo != null)
           'authenticationInfo': authenticationInfo!.toJson(),
         if (authorizationInfo != null)
@@ -709,13 +702,12 @@
           .toList();
     }
     if (_json.containsKey('claims')) {
-      claims =
-          (_json['claims'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      claims = (_json['claims'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('presenter')) {
       presenter = _json['presenter'] as core.String;
@@ -725,7 +717,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevels != null) 'accessLevels': accessLevels!,
         if (audiences != null) 'audiences': audiences!,
         if (claims != null) 'claims': claims!,
@@ -805,18 +797,18 @@
       serviceAccountKeyName = _json['serviceAccountKeyName'] as core.String;
     }
     if (_json.containsKey('thirdPartyPrincipal')) {
-      thirdPartyPrincipal = (_json['thirdPartyPrincipal'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      thirdPartyPrincipal =
+          (_json['thirdPartyPrincipal'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authoritySelector != null) 'authoritySelector': authoritySelector!,
         if (principalEmail != null) 'principalEmail': principalEmail!,
         if (principalSubject != null) 'principalSubject': principalSubject!,
@@ -871,7 +863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (granted != null) 'granted': granted!,
         if (permission != null) 'permission': permission!,
         if (resource != null) 'resource': resource!,
@@ -986,7 +978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (detail != null) 'detail': detail!,
         if (status != null) 'status': status!.toJson(),
@@ -1019,7 +1011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerInfo != null) 'consumerInfo': consumerInfo!.toJson(),
         if (unusedArguments != null) 'unusedArguments': unusedArguments!,
       };
@@ -1065,7 +1057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operation != null) 'operation': operation!.toJson(),
         if (requestProjectSettings != null)
           'requestProjectSettings': requestProjectSettings!,
@@ -1129,7 +1121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checkErrors != null)
           'checkErrors': checkErrors!.map((value) => value.toJson()).toList(),
         if (checkInfo != null) 'checkInfo': checkInfo!.toJson(),
@@ -1182,7 +1174,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerNumber != null) 'consumerNumber': consumerNumber!,
         if (projectNumber != null) 'projectNumber': projectNumber!,
         if (type != null) 'type': type!,
@@ -1294,7 +1286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketCounts != null) 'bucketCounts': bucketCounts!,
         if (count != null) 'count': count!,
         if (exemplars != null)
@@ -1346,8 +1338,8 @@
   Exemplar.fromJson(core.Map _json) {
     if (_json.containsKey('attachments')) {
       attachments = (_json['attachments'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1363,7 +1355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachments != null) 'attachments': attachments!,
         if (timestamp != null) 'timestamp': timestamp!,
         if (value != null) 'value': value!,
@@ -1395,7 +1387,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bounds != null) 'bounds': bounds!,
       };
 }
@@ -1436,7 +1428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (growthFactor != null) 'growthFactor': growthFactor!,
         if (numFiniteBuckets != null) 'numFiniteBuckets': numFiniteBuckets!,
         if (scale != null) 'scale': scale!,
@@ -1465,18 +1457,17 @@
       principalEmail = _json['principalEmail'] as core.String;
     }
     if (_json.containsKey('serviceMetadata')) {
-      serviceMetadata = (_json['serviceMetadata'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      serviceMetadata =
+          (_json['serviceMetadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (principalEmail != null) 'principalEmail': principalEmail!,
         if (serviceMetadata != null) 'serviceMetadata': serviceMetadata!,
       };
@@ -1608,7 +1599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheFillBytes != null) 'cacheFillBytes': cacheFillBytes!,
         if (cacheHit != null) 'cacheHit': cacheHit!,
         if (cacheLookup != null) 'cacheLookup': cacheLookup!,
@@ -1662,7 +1653,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numFiniteBuckets != null) 'numFiniteBuckets': numFiniteBuckets!,
         if (offset != null) 'offset': offset!,
         if (width != null) 'width': width!,
@@ -1766,13 +1757,12 @@
       insertId = _json['insertId'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1782,14 +1772,13 @@
           _json['operation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('protoPayload')) {
-      protoPayload = (_json['protoPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      protoPayload =
+          (_json['protoPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('severity')) {
       severity = _json['severity'] as core.String;
@@ -1799,14 +1788,13 @@
           _json['sourceLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('structPayload')) {
-      structPayload = (_json['structPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      structPayload =
+          (_json['structPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('textPayload')) {
       textPayload = _json['textPayload'] as core.String;
@@ -1819,7 +1807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpRequest != null) 'httpRequest': httpRequest!.toJson(),
         if (insertId != null) 'insertId': insertId!,
         if (labels != null) 'labels': labels!,
@@ -1882,7 +1870,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (first != null) 'first': first!,
         if (id != null) 'id': id!,
         if (last != null) 'last': last!,
@@ -1933,7 +1921,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (file != null) 'file': file!,
         if (function != null) 'function': function!,
         if (line != null) 'line': line!,
@@ -2003,13 +1991,12 @@
       int64Value = _json['int64Value'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('moneyValue')) {
       moneyValue = Money.fromJson(
@@ -2023,7 +2010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (distributionValue != null)
           'distributionValue': distributionValue!.toJson(),
@@ -2062,7 +2049,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricName != null) 'metricName': metricName!,
         if (metricValues != null)
           'metricValues': metricValues!.map((value) => value.toJson()).toList(),
@@ -2102,7 +2089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -2234,8 +2221,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2247,13 +2234,12 @@
       importance = _json['importance'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('logEntries')) {
       logEntries = (_json['logEntries'] as core.List)
@@ -2293,18 +2279,17 @@
           .toList();
     }
     if (_json.containsKey('userLabels')) {
-      userLabels = (_json['userLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      userLabels =
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerId != null) 'consumerId': consumerId!,
         if (endTime != null) 'endTime': endTime!,
         if (extensions != null) 'extensions': extensions!,
@@ -2363,13 +2348,12 @@
       ip = _json['ip'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('port')) {
       port = _json['port'] as core.String;
@@ -2382,7 +2366,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ip != null) 'ip': ip!,
         if (labels != null) 'labels': labels!,
         if (port != null) 'port': port!,
@@ -2456,7 +2440,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (description != null) 'description': description!,
         if (status != null) 'status': status!.toJson(),
@@ -2506,14 +2490,13 @@
           .toList();
     }
     if (_json.containsKey('quotaConsumed')) {
-      quotaConsumed = (_json['quotaConsumed'] as core.Map)
-          .cast<core.String, core.int>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.int,
-            ),
-          );
+      quotaConsumed =
+          (_json['quotaConsumed'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.int,
+        ),
+      );
     }
     if (_json.containsKey('quotaMetrics')) {
       quotaMetrics = (_json['quotaMetrics'] as core.List)
@@ -2523,7 +2506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (limitExceeded != null) 'limitExceeded': limitExceeded!,
         if (quotaConsumed != null) 'quotaConsumed': quotaConsumed!,
         if (quotaMetrics != null)
@@ -2614,13 +2597,12 @@
       consumerId = _json['consumerId'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('methodName')) {
       methodName = _json['methodName'] as core.String;
@@ -2639,7 +2621,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerId != null) 'consumerId': consumerId!,
         if (labels != null) 'labels': labels!,
         if (methodName != null) 'methodName': methodName!,
@@ -2674,7 +2656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quotaMode != null) 'quotaMode': quotaMode!,
       };
 }
@@ -2699,7 +2681,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationId != null) 'operationId': operationId!,
         if (status != null) 'status': status!.toJson(),
       };
@@ -2738,7 +2720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
         if (serviceConfigId != null) 'serviceConfigId': serviceConfigId!,
@@ -2785,7 +2767,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reportErrors != null)
           'reportErrors': reportErrors!.map((value) => value.toJson()).toList(),
         if (serviceConfigId != null) 'serviceConfigId': serviceConfigId!,
@@ -2867,13 +2849,12 @@
           Auth.fromJson(_json['auth'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('host')) {
       host = _json['host'] as core.String;
@@ -2907,7 +2888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auth != null) 'auth': auth!.toJson(),
         if (headers != null) 'headers': headers!,
         if (host != null) 'host': host!,
@@ -2994,7 +2975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (callerIp != null) 'callerIp': callerIp!,
         if (callerNetwork != null) 'callerNetwork': callerNetwork!,
         if (callerSuppliedUserAgent != null)
@@ -3110,14 +3091,13 @@
 
   Resource.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
-      annotations = (_json['annotations'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      annotations =
+          (_json['annotations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -3132,13 +3112,12 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -3160,7 +3139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotations != null) 'annotations': annotations!,
         if (createTime != null) 'createTime': createTime!,
         if (deleteTime != null) 'deleteTime': deleteTime!,
@@ -3210,7 +3189,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceContainer != null) 'resourceContainer': resourceContainer!,
         if (resourceLocation != null) 'resourceLocation': resourceLocation!,
         if (resourceName != null) 'resourceName': resourceName!,
@@ -3248,7 +3227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentLocations != null) 'currentLocations': currentLocations!,
         if (originalLocations != null) 'originalLocations': originalLocations!,
       };
@@ -3283,7 +3262,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firstPartyPrincipal != null)
           'firstPartyPrincipal': firstPartyPrincipal!.toJson(),
         if (principalSubject != null) 'principalSubject': principalSubject!,
@@ -3316,7 +3295,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (spanName != null) 'spanName': spanName!,
       };
 }
@@ -3354,8 +3333,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3368,7 +3347,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -3387,18 +3366,18 @@
 
   ThirdPartyPrincipal.fromJson(core.Map _json) {
     if (_json.containsKey('thirdPartyClaims')) {
-      thirdPartyClaims = (_json['thirdPartyClaims'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      thirdPartyClaims =
+          (_json['thirdPartyClaims'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (thirdPartyClaims != null) 'thirdPartyClaims': thirdPartyClaims!,
       };
 }
@@ -3535,7 +3514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!.toJson(),
         if (childSpanCount != null) 'childSpanCount': childSpanCount!,
         if (displayName != null) 'displayName': displayName!.toJson(),
@@ -3578,7 +3557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (truncatedByteCount != null)
           'truncatedByteCount': truncatedByteCount!,
         if (value != null) 'value': value!,
diff --git a/generated/googleapis/lib/servicecontrol/v2.dart b/generated/googleapis/lib/servicecontrol/v2.dart
index e7585d2..b87d4c8 100644
--- a/generated/googleapis/lib/servicecontrol/v2.dart
+++ b/generated/googleapis/lib/servicecontrol/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -228,7 +227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operation != null) 'operation': operation!,
         if (protocol != null) 'protocol': protocol!,
         if (service != null) 'service': service!,
@@ -302,8 +301,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -333,7 +332,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (api != null) 'api': api!.toJson(),
         if (destination != null) 'destination': destination!.toJson(),
         if (extensions != null) 'extensions': extensions!,
@@ -457,13 +456,12 @@
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('methodName')) {
       methodName = _json['methodName'] as core.String;
@@ -472,13 +470,12 @@
       numResponseItems = _json['numResponseItems'] as core.String;
     }
     if (_json.containsKey('request')) {
-      request =
-          (_json['request'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      request = (_json['request'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('requestMetadata')) {
       requestMetadata = RequestMetadata.fromJson(
@@ -492,33 +489,31 @@
       resourceName = _json['resourceName'] as core.String;
     }
     if (_json.containsKey('resourceOriginalState')) {
-      resourceOriginalState = (_json['resourceOriginalState'] as core.Map)
-          .cast<core.String, core.Object>()
+      resourceOriginalState = (_json['resourceOriginalState']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('serviceData')) {
-      serviceData = (_json['serviceData'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      serviceData =
+          (_json['serviceData'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('serviceName')) {
       serviceName = _json['serviceName'] as core.String;
@@ -529,7 +524,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authenticationInfo != null)
           'authenticationInfo': authenticationInfo!.toJson(),
         if (authorizationInfo != null)
@@ -625,13 +620,12 @@
           .toList();
     }
     if (_json.containsKey('claims')) {
-      claims =
-          (_json['claims'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      claims = (_json['claims'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('presenter')) {
       presenter = _json['presenter'] as core.String;
@@ -641,7 +635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessLevels != null) 'accessLevels': accessLevels!,
         if (audiences != null) 'audiences': audiences!,
         if (claims != null) 'claims': claims!,
@@ -721,18 +715,18 @@
       serviceAccountKeyName = _json['serviceAccountKeyName'] as core.String;
     }
     if (_json.containsKey('thirdPartyPrincipal')) {
-      thirdPartyPrincipal = (_json['thirdPartyPrincipal'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      thirdPartyPrincipal =
+          (_json['thirdPartyPrincipal'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authoritySelector != null) 'authoritySelector': authoritySelector!,
         if (principalEmail != null) 'principalEmail': principalEmail!,
         if (principalSubject != null) 'principalSubject': principalSubject!,
@@ -787,7 +781,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (granted != null) 'granted': granted!,
         if (permission != null) 'permission': permission!,
         if (resource != null) 'resource': resource!,
@@ -837,7 +831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!.toJson(),
         if (flags != null) 'flags': flags!,
         if (resources != null)
@@ -861,13 +855,12 @@
 
   CheckResponse.fromJson(core.Map _json) {
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('status')) {
       status = Status.fromJson(
@@ -875,7 +868,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headers != null) 'headers': headers!,
         if (status != null) 'status': status!.toJson(),
       };
@@ -903,18 +896,17 @@
       principalEmail = _json['principalEmail'] as core.String;
     }
     if (_json.containsKey('serviceMetadata')) {
-      serviceMetadata = (_json['serviceMetadata'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      serviceMetadata =
+          (_json['serviceMetadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (principalEmail != null) 'principalEmail': principalEmail!,
         if (serviceMetadata != null) 'serviceMetadata': serviceMetadata!,
       };
@@ -955,13 +947,12 @@
       ip = _json['ip'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('port')) {
       port = _json['port'] as core.String;
@@ -974,7 +965,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ip != null) 'ip': ip!,
         if (labels != null) 'labels': labels!,
         if (port != null) 'port': port!,
@@ -1012,7 +1003,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
         if (serviceConfigId != null) 'serviceConfigId': serviceConfigId!,
@@ -1029,7 +1020,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// This message defines attributes for an HTTP request.
@@ -1106,13 +1097,12 @@
           Auth.fromJson(_json['auth'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('host')) {
       host = _json['host'] as core.String;
@@ -1146,7 +1136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auth != null) 'auth': auth!.toJson(),
         if (headers != null) 'headers': headers!,
         if (host != null) 'host': host!,
@@ -1233,7 +1223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (callerIp != null) 'callerIp': callerIp!,
         if (callerNetwork != null) 'callerNetwork': callerNetwork!,
         if (callerSuppliedUserAgent != null)
@@ -1349,14 +1339,13 @@
 
   Resource.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
-      annotations = (_json['annotations'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      annotations =
+          (_json['annotations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -1371,13 +1360,12 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -1399,7 +1387,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotations != null) 'annotations': annotations!,
         if (createTime != null) 'createTime': createTime!,
         if (deleteTime != null) 'deleteTime': deleteTime!,
@@ -1442,7 +1430,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (permission != null) 'permission': permission!,
         if (type != null) 'type': type!,
@@ -1480,7 +1468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentLocations != null) 'currentLocations': currentLocations!,
         if (originalLocations != null) 'originalLocations': originalLocations!,
       };
@@ -1527,13 +1515,12 @@
       code = _json['code'] as core.String;
     }
     if (_json.containsKey('headers')) {
-      headers =
-          (_json['headers'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      headers = (_json['headers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('size')) {
       size = _json['size'] as core.String;
@@ -1543,7 +1530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backendLatency != null) 'backendLatency': backendLatency!,
         if (code != null) 'code': code!,
         if (headers != null) 'headers': headers!,
@@ -1581,7 +1568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firstPartyPrincipal != null)
           'firstPartyPrincipal': firstPartyPrincipal!.toJson(),
         if (principalSubject != null) 'principalSubject': principalSubject!,
@@ -1614,7 +1601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (spanName != null) 'spanName': spanName!,
       };
 }
@@ -1652,8 +1639,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1666,7 +1653,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1685,18 +1672,18 @@
 
   ThirdPartyPrincipal.fromJson(core.Map _json) {
     if (_json.containsKey('thirdPartyClaims')) {
-      thirdPartyClaims = (_json['thirdPartyClaims'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      thirdPartyClaims =
+          (_json['thirdPartyClaims'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (thirdPartyClaims != null) 'thirdPartyClaims': thirdPartyClaims!,
       };
 }
diff --git a/generated/googleapis/lib/servicedirectory/v1.dart b/generated/googleapis/lib/servicedirectory/v1.dart
index 87b8f56..89805ba 100644
--- a/generated/googleapis/lib/servicedirectory/v1.dart
+++ b/generated/googleapis/lib/servicedirectory/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1319,7 +1318,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1340,7 +1339,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An individual endpoint that provides a service.
@@ -1396,14 +1395,13 @@
       address = _json['address'] as core.String;
     }
     if (_json.containsKey('annotations')) {
-      annotations = (_json['annotations'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      annotations =
+          (_json['annotations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1413,7 +1411,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (annotations != null) 'annotations': annotations!,
         if (name != null) 'name': name!,
@@ -1482,7 +1480,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1505,7 +1503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -1532,7 +1530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -1561,7 +1559,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endpoints != null)
           'endpoints': endpoints!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1590,7 +1588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1620,7 +1618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namespaces != null)
           'namespaces': namespaces!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1650,7 +1648,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (services != null)
           'services': services!.map((value) => value.toJson()).toList(),
@@ -1694,32 +1692,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1751,20 +1747,19 @@
 
   Namespace.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (name != null) 'name': name!,
       };
@@ -1865,7 +1860,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -1922,7 +1917,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endpointFilter != null) 'endpointFilter': endpointFilter!,
         if (maxEndpoints != null) 'maxEndpoints': maxEndpoints!,
       };
@@ -1941,7 +1936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!.toJson(),
       };
 }
@@ -1991,14 +1986,13 @@
 
   Service.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
-      annotations = (_json['annotations'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      annotations =
+          (_json['annotations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('endpoints')) {
       endpoints = (_json['endpoints'] as core.List)
@@ -2011,7 +2005,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotations != null) 'annotations': annotations!,
         if (endpoints != null)
           'endpoints': endpoints!.map((value) => value.toJson()).toList(),
@@ -2037,7 +2031,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -2061,7 +2055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2082,7 +2076,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
diff --git a/generated/googleapis/lib/servicemanagement/v1.dart b/generated/googleapis/lib/servicemanagement/v1.dart
index 2beb686..f55bf14 100644
--- a/generated/googleapis/lib/servicemanagement/v1.dart
+++ b/generated/googleapis/lib/servicemanagement/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1235,7 +1234,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
       };
 }
@@ -1329,7 +1328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (methods != null)
           'methods': methods!.map((value) => value.toJson()).toList(),
         if (mixins != null)
@@ -1384,7 +1383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1426,7 +1425,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1519,7 +1518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audiences != null) 'audiences': audiences!,
         if (authorizationUrl != null) 'authorizationUrl': authorizationUrl!,
         if (id != null) 'id': id!,
@@ -1565,7 +1564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audiences != null) 'audiences': audiences!,
         if (providerId != null) 'providerId': providerId!,
       };
@@ -1604,7 +1603,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (providers != null)
           'providers': providers!.map((value) => value.toJson()).toList(),
         if (rules != null)
@@ -1657,7 +1656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowWithoutCredential != null)
           'allowWithoutCredential': allowWithoutCredential!,
         if (oauth != null) 'oauth': oauth!.toJson(),
@@ -1685,7 +1684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -1811,7 +1810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (deadline != null) 'deadline': deadline!,
         if (disableAuth != null) 'disableAuth': disableAuth!,
@@ -1860,7 +1859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -1893,7 +1892,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null) 'metrics': metrics!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -1965,7 +1964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1996,7 +1995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configChanges != null)
           'configChanges':
               configChanges!.map((value) => value.toJson()).toList(),
@@ -2073,7 +2072,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advices != null)
           'advices': advices!.map((value) => value.toJson()).toList(),
         if (changeType != null) 'changeType': changeType!,
@@ -2130,7 +2129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileContents != null) 'fileContents': fileContents!,
         if (filePath != null) 'filePath': filePath!,
         if (fileType != null) 'fileType': fileType!,
@@ -2153,7 +2152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -2185,7 +2184,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (files != null)
           'files': files!.map((value) => value.toJson()).toList(),
         if (id != null) 'id': id!,
@@ -2224,7 +2223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -2282,7 +2281,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedRequestExtensions != null)
           'allowedRequestExtensions': allowedRequestExtensions!,
         if (allowedResponseExtensions != null)
@@ -2312,7 +2311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!,
       };
 }
@@ -2347,7 +2346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
         if (types != null) 'types': types!,
@@ -2378,7 +2377,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isErrorType != null) 'isErrorType': isErrorType!,
         if (selector != null) 'selector': selector!,
       };
@@ -2403,7 +2402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (path != null) 'path': path!,
       };
@@ -2420,7 +2419,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a diagnostic message (error or warning)
@@ -2451,7 +2450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (location != null) 'location': location!,
         if (message != null) 'message': message!,
@@ -2466,7 +2465,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// `Documentation` provides the information for describing a service.
@@ -2560,7 +2559,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentationRootUrl != null)
           'documentationRootUrl': documentationRootUrl!,
         if (overview != null) 'overview': overview!,
@@ -2607,7 +2606,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deprecationDescription != null)
           'deprecationDescription': deprecationDescription!,
         if (description != null) 'description': description!,
@@ -2635,7 +2634,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerId != null) 'consumerId': consumerId!,
       };
 }
@@ -2648,7 +2647,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// `Endpoint` describes a network endpoint of a service that serves a set of
@@ -2710,7 +2709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliases != null) 'aliases': aliases!,
         if (allowCors != null) 'allowCors': allowCors!,
         if (name != null) 'name': name!,
@@ -2765,7 +2764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enumvalue != null)
           'enumvalue': enumvalue!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -2804,7 +2803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (number != null) 'number': number!,
         if (options != null)
@@ -2873,7 +2872,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2983,7 +2982,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cardinality != null) 'cardinality': cardinality!,
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (jsonName != null) 'jsonName': jsonName!,
@@ -3019,7 +3018,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exceptionType != null) 'exceptionType': exceptionType!,
         if (flowStepId != null) 'flowStepId': flowStepId!,
       };
@@ -3056,25 +3055,25 @@
   GenerateConfigReportRequest.fromJson(core.Map _json) {
     if (_json.containsKey('newConfig')) {
       newConfig =
-          (_json['newConfig'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+          (_json['newConfig'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('oldConfig')) {
       oldConfig =
-          (_json['oldConfig'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+          (_json['oldConfig'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newConfig != null) 'newConfig': newConfig!,
         if (oldConfig != null) 'oldConfig': oldConfig!,
       };
@@ -3119,7 +3118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changeReports != null)
           'changeReports':
               changeReports!.map((value) => value.toJson()).toList(),
@@ -3145,7 +3144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -3172,7 +3171,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -3211,7 +3210,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullyDecodeReservedExpansion != null)
           'fullyDecodeReservedExpansion': fullyDecodeReservedExpansion!,
         if (rules != null)
@@ -3459,7 +3458,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalBindings != null)
           'additionalBindings':
               additionalBindings!.map((value) => value.toJson()).toList(),
@@ -3507,7 +3506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!,
         if (query != null) 'query': query!,
         if (valuePrefix != null) 'valuePrefix': valuePrefix!,
@@ -3543,7 +3542,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (key != null) 'key': key!,
         if (valueType != null) 'valueType': valueType!,
@@ -3572,7 +3571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -3601,7 +3600,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (serviceConfigs != null)
           'serviceConfigs':
@@ -3631,7 +3630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (rollouts != null)
           'rollouts': rollouts!.map((value) => value.toJson()).toList(),
@@ -3660,7 +3659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (services != null)
           'services': services!.map((value) => value.toJson()).toList(),
@@ -3718,7 +3717,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -3772,7 +3771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -3810,7 +3809,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logs != null) 'logs': logs!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -3839,7 +3838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (producerProjectId != null) 'producerProjectId': producerProjectId!,
         if (serviceName != null) 'serviceName': serviceName!,
       };
@@ -3900,7 +3899,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (options != null)
           'options': options!.map((value) => value.toJson()).toList(),
@@ -4126,7 +4125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -4209,7 +4208,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingestDelay != null) 'ingestDelay': ingestDelay!,
         if (launchStage != null) 'launchStage': launchStage!,
         if (samplePeriod != null) 'samplePeriod': samplePeriod!,
@@ -4238,21 +4237,20 @@
 
   MetricRule.fromJson(core.Map _json) {
     if (_json.containsKey('metricCosts')) {
-      metricCosts = (_json['metricCosts'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      metricCosts =
+          (_json['metricCosts'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('selector')) {
       selector = _json['selector'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricCosts != null) 'metricCosts': metricCosts!,
         if (selector != null) 'selector': selector!,
       };
@@ -4308,7 +4306,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (root != null) 'root': root!,
       };
@@ -4430,7 +4428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -4502,7 +4500,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -4538,7 +4536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null) 'metrics': metrics!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -4575,7 +4573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalScopes != null) 'canonicalScopes': canonicalScopes!,
       };
 }
@@ -4634,29 +4632,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4704,7 +4700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (progressPercentage != null)
           'progressPercentage': progressPercentage!,
         if (resourceNames != null) 'resourceNames': resourceNames!,
@@ -4742,16 +4738,16 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = (_json['value'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      value = (_json['value'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -4801,7 +4797,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (name != null) 'name': name!,
         if (subpages != null)
@@ -4913,7 +4909,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -4972,7 +4968,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (limits != null)
           'limits': limits!.map((value) => value.toJson()).toList(),
         if (metricRules != null)
@@ -5096,17 +5092,16 @@
       unit = _json['unit'] as core.String;
     }
     if (_json.containsKey('values')) {
-      values =
-          (_json['values'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      values = (_json['values'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultLimit != null) 'defaultLimit': defaultLimit!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -5153,7 +5148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childType != null) 'childType': childType!,
         if (type != null) 'type': type!,
       };
@@ -5247,7 +5242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (createdBy != null) 'createdBy': createdBy!,
         if (deleteServiceStrategy != null)
@@ -5517,7 +5512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apis != null) 'apis': apis!.map((value) => value.toJson()).toList(),
         if (authentication != null) 'authentication': authentication!.toJson(),
         if (backend != null) 'backend': backend!.toJson(),
@@ -5583,7 +5578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -5606,7 +5601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileName != null) 'fileName': fileName!,
       };
 }
@@ -5624,8 +5619,8 @@
   SourceInfo.fromJson(core.Map _json) {
     if (_json.containsKey('sourceFiles')) {
       sourceFiles = (_json['sourceFiles'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -5635,7 +5630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sourceFiles != null) 'sourceFiles': sourceFiles!,
       };
 }
@@ -5673,8 +5668,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -5687,7 +5682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -5721,7 +5716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (status != null) 'status': status!,
       };
@@ -5753,7 +5748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configSource != null) 'configSource': configSource!.toJson(),
         if (validateOnly != null) 'validateOnly': validateOnly!,
       };
@@ -5773,7 +5768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (serviceConfig != null) 'serviceConfig': serviceConfig!.toJson(),
       };
 }
@@ -5812,7 +5807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpHeader != null) 'httpHeader': httpHeader!,
         if (name != null) 'name': name!,
         if (urlQueryParameter != null) 'urlQueryParameter': urlQueryParameter!,
@@ -5850,7 +5845,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
         if (selector != null) 'selector': selector!,
@@ -5889,7 +5884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -5914,7 +5909,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -5935,7 +5930,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -5962,18 +5957,17 @@
 
   TrafficPercentStrategy.fromJson(core.Map _json) {
     if (_json.containsKey('percentages')) {
-      percentages = (_json['percentages'] as core.Map)
-          .cast<core.String, core.double>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              (item as core.num).toDouble(),
-            ),
-          );
+      percentages =
+          (_json['percentages'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          (item as core.num).toDouble(),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (percentages != null) 'percentages': percentages!,
       };
 }
@@ -6033,7 +6027,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -6059,7 +6053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!.toJson(),
       };
 }
@@ -6112,7 +6106,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (producerNotificationChannel != null)
           'producerNotificationChannel': producerNotificationChannel!,
         if (requirements != null) 'requirements': requirements!,
@@ -6166,7 +6160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowUnregisteredCalls != null)
           'allowUnregisteredCalls': allowUnregisteredCalls!,
         if (selector != null) 'selector': selector!,
diff --git a/generated/googleapis/lib/servicenetworking/v1.dart b/generated/googleapis/lib/servicenetworking/v1.dart
index 252e10d..0d4f66c 100644
--- a/generated/googleapis/lib/servicenetworking/v1.dart
+++ b/generated/googleapis/lib/servicenetworking/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1265,7 +1264,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to add a record set to a private managed DNS zone in the shared
@@ -1306,7 +1305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerNetwork != null) 'consumerNetwork': consumerNetwork!,
         if (dnsRecordSet != null) 'dnsRecordSet': dnsRecordSet!.toJson(),
         if (zone != null) 'zone': zone!,
@@ -1322,7 +1321,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to add a private managed DNS zone in the shared producer host
@@ -1366,7 +1365,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerNetwork != null) 'consumerNetwork': consumerNetwork!,
         if (dnsSuffix != null) 'dnsSuffix': dnsSuffix!,
         if (name != null) 'name': name!,
@@ -1395,7 +1394,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerPeeringZone != null)
           'consumerPeeringZone': consumerPeeringZone!.toJson(),
         if (producerPrivateZone != null)
@@ -1412,7 +1411,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request for AddRoles to allow Service Producers to add roles in the shared
@@ -1445,7 +1444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerNetwork != null) 'consumerNetwork': consumerNetwork!,
         if (policyBinding != null)
           'policyBinding':
@@ -1471,7 +1470,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policyBinding != null)
           'policyBinding':
               policyBinding!.map((value) => value.toJson()).toList(),
@@ -1602,7 +1601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumer != null) 'consumer': consumer!,
         if (consumerNetwork != null) 'consumerNetwork': consumerNetwork!,
         if (description != null) 'description': description!,
@@ -1707,7 +1706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (methods != null)
           'methods': methods!.map((value) => value.toJson()).toList(),
         if (mixins != null)
@@ -1808,7 +1807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audiences != null) 'audiences': audiences!,
         if (authorizationUrl != null) 'authorizationUrl': authorizationUrl!,
         if (id != null) 'id': id!,
@@ -1854,7 +1853,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audiences != null) 'audiences': audiences!,
         if (providerId != null) 'providerId': providerId!,
       };
@@ -1893,7 +1892,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (providers != null)
           'providers': providers!.map((value) => value.toJson()).toList(),
         if (rules != null)
@@ -1946,7 +1945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowWithoutCredential != null)
           'allowWithoutCredential': allowWithoutCredential!,
         if (oauth != null) 'oauth': oauth!.toJson(),
@@ -1974,7 +1973,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -2100,7 +2099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (deadline != null) 'deadline': deadline!,
         if (disableAuth != null) 'disableAuth': disableAuth!,
@@ -2149,7 +2148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -2182,7 +2181,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null) 'metrics': metrics!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -2196,7 +2195,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a private connection resource.
@@ -2256,7 +2255,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (network != null) 'network': network!,
         if (peering != null) 'peering': peering!,
         if (reservedPeeringRanges != null)
@@ -2369,7 +2368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerExportCustomRoutes != null)
           'consumerExportCustomRoutes': consumerExportCustomRoutes!,
         if (consumerExportSubnetRoutesWithPublicIp != null)
@@ -2409,7 +2408,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a consumer project.
@@ -2430,7 +2429,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectNum != null) 'projectNum': projectNum!,
       };
 }
@@ -2467,7 +2466,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -2525,7 +2524,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedRequestExtensions != null)
           'allowedRequestExtensions': allowedRequestExtensions!,
         if (allowedResponseExtensions != null)
@@ -2555,7 +2554,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!,
       };
 }
@@ -2590,7 +2589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
         if (types != null) 'types': types!,
@@ -2621,7 +2620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isErrorType != null) 'isErrorType': isErrorType!,
         if (selector != null) 'selector': selector!,
       };
@@ -2646,7 +2645,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (path != null) 'path': path!,
       };
@@ -2661,7 +2660,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Metadata provided through GetOperation request for the LRO generated by
@@ -2673,7 +2672,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to disable VPC service controls.
@@ -2694,7 +2693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerNetwork != null) 'consumerNetwork': consumerNetwork!,
       };
 }
@@ -2741,7 +2740,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
         if (domain != null) 'domain': domain!,
         if (ttl != null) 'ttl': ttl!,
@@ -2772,7 +2771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dnsSuffix != null) 'dnsSuffix': dnsSuffix!,
         if (name != null) 'name': name!,
       };
@@ -2869,7 +2868,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentationRootUrl != null)
           'documentationRootUrl': documentationRootUrl!,
         if (overview != null) 'overview': overview!,
@@ -2916,7 +2915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deprecationDescription != null)
           'deprecationDescription': deprecationDescription!,
         if (description != null) 'description': description!,
@@ -2938,7 +2937,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to enable VPC service controls.
@@ -2959,7 +2958,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerNetwork != null) 'consumerNetwork': consumerNetwork!,
       };
 }
@@ -3023,7 +3022,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliases != null) 'aliases': aliases!,
         if (allowCors != null) 'allowCors': allowCors!,
         if (name != null) 'name': name!,
@@ -3078,7 +3077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enumvalue != null)
           'enumvalue': enumvalue!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -3117,7 +3116,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (number != null) 'number': number!,
         if (options != null)
@@ -3227,7 +3226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cardinality != null) 'cardinality': cardinality!,
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (jsonName != null) 'jsonName': jsonName!,
@@ -3272,7 +3271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (ipPrefixLength != null) 'ipPrefixLength': ipPrefixLength!,
         if (name != null) 'name': name!,
@@ -3333,7 +3332,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (network != null) 'network': network!,
         if (peering != null) 'peering': peering!,
         if (reservedPeeringRanges != null)
@@ -3380,7 +3379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
         if (name != null) 'name': name!,
         if (network != null) 'network': network!,
@@ -3421,7 +3420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullyDecodeReservedExpansion != null)
           'fullyDecodeReservedExpansion': fullyDecodeReservedExpansion!,
         if (rules != null)
@@ -3669,7 +3668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalBindings != null)
           'additionalBindings':
               additionalBindings!.map((value) => value.toJson()).toList(),
@@ -3717,7 +3716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!,
         if (query != null) 'query': query!,
         if (valuePrefix != null) 'valuePrefix': valuePrefix!,
@@ -3753,7 +3752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (key != null) 'key': key!,
         if (valueType != null) 'valueType': valueType!,
@@ -3777,7 +3776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connections != null)
           'connections': connections!.map((value) => value.toJson()).toList(),
       };
@@ -3805,7 +3804,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -3828,7 +3827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (peeredDnsDomains != null)
           'peeredDnsDomains':
               peeredDnsDomains!.map((value) => value.toJson()).toList(),
@@ -3886,7 +3885,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -3940,7 +3939,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -3978,7 +3977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logs != null) 'logs': logs!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -4039,7 +4038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (options != null)
           'options': options!.map((value) => value.toJson()).toList(),
@@ -4265,7 +4264,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -4348,7 +4347,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingestDelay != null) 'ingestDelay': ingestDelay!,
         if (launchStage != null) 'launchStage': launchStage!,
         if (samplePeriod != null) 'samplePeriod': samplePeriod!,
@@ -4377,21 +4376,20 @@
 
   MetricRule.fromJson(core.Map _json) {
     if (_json.containsKey('metricCosts')) {
-      metricCosts = (_json['metricCosts'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      metricCosts =
+          (_json['metricCosts'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('selector')) {
       selector = _json['selector'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricCosts != null) 'metricCosts': metricCosts!,
         if (selector != null) 'selector': selector!,
       };
@@ -4447,7 +4445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (root != null) 'root': root!,
       };
@@ -4569,7 +4567,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -4641,7 +4639,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -4677,7 +4675,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null) 'metrics': metrics!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -4714,7 +4712,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalScopes != null) 'canonicalScopes': canonicalScopes!,
       };
 }
@@ -4773,29 +4771,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4832,16 +4828,16 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = (_json['value'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      value = (_json['value'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -4891,7 +4887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (name != null) 'name': name!,
         if (subpages != null)
@@ -4923,7 +4919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dnsSuffix != null) 'dnsSuffix': dnsSuffix!,
         if (name != null) 'name': name!,
       };
@@ -4938,7 +4934,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Grouping of IAM role and IAM member.
@@ -4973,7 +4969,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (member != null) 'member': member!,
         if (role != null) 'role': role!,
       };
@@ -5028,7 +5024,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (limits != null)
           'limits': limits!.map((value) => value.toJson()).toList(),
         if (metricRules != null)
@@ -5152,17 +5148,16 @@
       unit = _json['unit'] as core.String;
     }
     if (_json.containsKey('values')) {
-      values =
-          (_json['values'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      values = (_json['values'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultLimit != null) 'defaultLimit': defaultLimit!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -5199,7 +5194,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
         if (network != null) 'network': network!,
       };
@@ -5270,7 +5265,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipPrefixLength != null) 'ipPrefixLength': ipPrefixLength!,
         if (requestedRanges != null) 'requestedRanges': requestedRanges!,
         if (secondaryRangeIpPrefixLengths != null)
@@ -5290,7 +5285,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to remove a record set from a private managed DNS zone in the shared
@@ -5334,7 +5329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerNetwork != null) 'consumerNetwork': consumerNetwork!,
         if (dnsRecordSet != null) 'dnsRecordSet': dnsRecordSet!.toJson(),
         if (zone != null) 'zone': zone!,
@@ -5349,7 +5344,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Metadata provided through GetOperation request for the LRO generated by
@@ -5361,7 +5356,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to remove a private managed DNS zone in the shared producer host
@@ -5393,7 +5388,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerNetwork != null) 'consumerNetwork': consumerNetwork!,
         if (name != null) 'name': name!,
       };
@@ -5407,7 +5402,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a route that was created or discovered by a private access
@@ -5450,7 +5445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destRange != null) 'destRange': destRange!,
         if (name != null) 'name': name!,
         if (network != null) 'network': network!,
@@ -5488,7 +5483,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipPrefixLength != null) 'ipPrefixLength': ipPrefixLength!,
         if (network != null) 'network': network!,
       };
@@ -5512,7 +5507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
         if (rangeName != null) 'rangeName': rangeName!,
       };
@@ -5560,7 +5555,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipPrefixLength != null) 'ipPrefixLength': ipPrefixLength!,
         if (rangeName != null) 'rangeName': rangeName!,
         if (requestedAddress != null) 'requestedAddress': requestedAddress!,
@@ -5824,7 +5819,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apis != null) 'apis': apis!.map((value) => value.toJson()).toList(),
         if (authentication != null) 'authentication': authentication!.toJson(),
         if (backend != null) 'backend': backend!.toJson(),
@@ -5880,7 +5875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileName != null) 'fileName': fileName!,
       };
 }
@@ -5898,8 +5893,8 @@
   SourceInfo.fromJson(core.Map _json) {
     if (_json.containsKey('sourceFiles')) {
       sourceFiles = (_json['sourceFiles'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -5909,7 +5904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sourceFiles != null) 'sourceFiles': sourceFiles!,
       };
 }
@@ -5947,8 +5942,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -5961,7 +5956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -6021,7 +6016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipCidrRange != null) 'ipCidrRange': ipCidrRange!,
         if (name != null) 'name': name!,
         if (network != null) 'network': network!,
@@ -6067,7 +6062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpHeader != null) 'httpHeader': httpHeader!,
         if (name != null) 'name': name!,
         if (urlQueryParameter != null) 'urlQueryParameter': urlQueryParameter!,
@@ -6105,7 +6100,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
         if (selector != null) 'selector': selector!,
@@ -6144,7 +6139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -6205,7 +6200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -6235,7 +6230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerConfig != null) 'consumerConfig': consumerConfig!.toJson(),
       };
 }
@@ -6249,7 +6244,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request to update a record set from a private managed DNS zone in the shared
@@ -6302,7 +6297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerNetwork != null) 'consumerNetwork': consumerNetwork!,
         if (existingDnsRecordSet != null)
           'existingDnsRecordSet': existingDnsRecordSet!.toJson(),
@@ -6360,7 +6355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (producerNotificationChannel != null)
           'producerNotificationChannel': producerNotificationChannel!,
         if (requirements != null) 'requirements': requirements!,
@@ -6414,7 +6409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowUnregisteredCalls != null)
           'allowUnregisteredCalls': allowUnregisteredCalls!,
         if (selector != null) 'selector': selector!,
@@ -6469,7 +6464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerNetwork != null) 'consumerNetwork': consumerNetwork!,
         if (consumerProject != null)
           'consumerProject': consumerProject!.toJson(),
@@ -6534,7 +6529,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (existingSubnetworkCandidates != null)
           'existingSubnetworkCandidates': existingSubnetworkCandidates!
               .map((value) => value.toJson())
diff --git a/generated/googleapis/lib/serviceusage/v1.dart b/generated/googleapis/lib/serviceusage/v1.dart
index d537fbd..81b0ebe 100644
--- a/generated/googleapis/lib/serviceusage/v1.dart
+++ b/generated/googleapis/lib/serviceusage/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -607,14 +606,13 @@
       container = _json['container'] as core.String;
     }
     if (_json.containsKey('dimensions')) {
-      dimensions = (_json['dimensions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      dimensions =
+          (_json['dimensions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('metric')) {
       metric = _json['metric'] as core.String;
@@ -630,7 +628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (container != null) 'container': container!,
         if (dimensions != null) 'dimensions': dimensions!,
         if (metric != null) 'metric': metric!,
@@ -729,7 +727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (methods != null)
           'methods': methods!.map((value) => value.toJson()).toList(),
         if (mixins != null)
@@ -830,7 +828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audiences != null) 'audiences': audiences!,
         if (authorizationUrl != null) 'authorizationUrl': authorizationUrl!,
         if (id != null) 'id': id!,
@@ -876,7 +874,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audiences != null) 'audiences': audiences!,
         if (providerId != null) 'providerId': providerId!,
       };
@@ -915,7 +913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (providers != null)
           'providers': providers!.map((value) => value.toJson()).toList(),
         if (rules != null)
@@ -968,7 +966,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowWithoutCredential != null)
           'allowWithoutCredential': allowWithoutCredential!,
         if (oauth != null) 'oauth': oauth!.toJson(),
@@ -996,7 +994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -1122,7 +1120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (deadline != null) 'deadline': deadline!,
         if (disableAuth != null) 'disableAuth': disableAuth!,
@@ -1151,7 +1149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (overrides != null)
           'overrides': overrides!.map((value) => value.toJson()).toList(),
       };
@@ -1173,7 +1171,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (overrides != null)
           'overrides': overrides!.map((value) => value.toJson()).toList(),
       };
@@ -1200,7 +1198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (serviceIds != null) 'serviceIds': serviceIds!,
       };
 }
@@ -1235,7 +1233,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failures != null)
           'failures': failures!.map((value) => value.toJson()).toList(),
         if (services != null)
@@ -1260,7 +1258,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (services != null)
           'services': services!.map((value) => value.toJson()).toList(),
       };
@@ -1302,7 +1300,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -1335,7 +1333,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null) 'metrics': metrics!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -1349,7 +1347,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// `Context` defines which contexts an API requests.
@@ -1384,7 +1382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -1442,7 +1440,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedRequestExtensions != null)
           'allowedRequestExtensions': allowedRequestExtensions!,
         if (allowedResponseExtensions != null)
@@ -1472,7 +1470,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!,
       };
 }
@@ -1507,7 +1505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
         if (types != null) 'types': types!,
@@ -1538,7 +1536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isErrorType != null) 'isErrorType': isErrorType!,
         if (selector != null) 'selector': selector!,
       };
@@ -1563,7 +1561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (path != null) 'path': path!,
       };
@@ -1600,7 +1598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checkIfServiceHasUsage != null)
           'checkIfServiceHasUsage': checkIfServiceHasUsage!,
         if (disableDependentServices != null)
@@ -1625,7 +1623,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!.toJson(),
       };
 }
@@ -1721,7 +1719,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentationRootUrl != null)
           'documentationRootUrl': documentationRootUrl!,
         if (overview != null) 'overview': overview!,
@@ -1768,7 +1766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deprecationDescription != null)
           'deprecationDescription': deprecationDescription!,
         if (description != null) 'description': description!,
@@ -1790,7 +1788,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Provides error messages for the failing services.
@@ -1812,7 +1810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (serviceId != null) 'serviceId': serviceId!,
       };
@@ -1826,7 +1824,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for the `EnableService` method.
@@ -1846,7 +1844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (service != null) 'service': service!.toJson(),
       };
 }
@@ -1910,7 +1908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliases != null) 'aliases': aliases!,
         if (allowCors != null) 'allowCors': allowCors!,
         if (name != null) 'name': name!,
@@ -1965,7 +1963,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enumvalue != null)
           'enumvalue': enumvalue!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -2004,7 +2002,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (number != null) 'number': number!,
         if (options != null)
@@ -2114,7 +2112,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cardinality != null) 'cardinality': cardinality!,
         if (defaultValue != null) 'defaultValue': defaultValue!,
         if (jsonName != null) 'jsonName': jsonName!,
@@ -2157,7 +2155,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identity != null) 'identity': identity!.toJson(),
         if (state != null) 'state': state!,
       };
@@ -2420,7 +2418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apis != null) 'apis': apis!.map((value) => value.toJson()).toList(),
         if (authentication != null) 'authentication': authentication!.toJson(),
         if (backend != null) 'backend': backend!.toJson(),
@@ -2475,7 +2473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceNames != null) 'resourceNames': resourceNames!,
       };
 }
@@ -2529,7 +2527,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (name != null) 'name': name!,
         if (parent != null) 'parent': parent!,
@@ -2634,7 +2632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apis != null) 'apis': apis!.map((value) => value.toJson()).toList(),
         if (authentication != null) 'authentication': authentication!.toJson(),
         if (documentation != null) 'documentation': documentation!.toJson(),
@@ -2680,7 +2678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identity != null) 'identity': identity!.toJson(),
         if (state != null) 'state': state!,
       };
@@ -2711,7 +2709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (uniqueId != null) 'uniqueId': uniqueId!,
       };
@@ -2750,7 +2748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullyDecodeReservedExpansion != null)
           'fullyDecodeReservedExpansion': fullyDecodeReservedExpansion!,
         if (rules != null)
@@ -2998,7 +2996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalBindings != null)
           'additionalBindings':
               additionalBindings!.map((value) => value.toJson()).toList(),
@@ -3030,7 +3028,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (overrides != null)
           'overrides': overrides!.map((value) => value.toJson()).toList(),
       };
@@ -3052,7 +3050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policies != null)
           'policies': policies!.map((value) => value.toJson()).toList(),
       };
@@ -3074,7 +3072,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (overrides != null)
           'overrides': overrides!.map((value) => value.toJson()).toList(),
       };
@@ -3112,7 +3110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (header != null) 'header': header!,
         if (query != null) 'query': query!,
         if (valuePrefix != null) 'valuePrefix': valuePrefix!,
@@ -3148,7 +3146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (key != null) 'key': key!,
         if (valueType != null) 'valueType': valueType!,
@@ -3177,7 +3175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -3207,7 +3205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (services != null)
           'services': services!.map((value) => value.toJson()).toList(),
@@ -3265,7 +3263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -3319,7 +3317,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -3357,7 +3355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logs != null) 'logs': logs!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -3418,7 +3416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (options != null)
           'options': options!.map((value) => value.toJson()).toList(),
@@ -3644,7 +3642,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -3727,7 +3725,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ingestDelay != null) 'ingestDelay': ingestDelay!,
         if (launchStage != null) 'launchStage': launchStage!,
         if (samplePeriod != null) 'samplePeriod': samplePeriod!,
@@ -3756,21 +3754,20 @@
 
   MetricRule.fromJson(core.Map _json) {
     if (_json.containsKey('metricCosts')) {
-      metricCosts = (_json['metricCosts'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      metricCosts =
+          (_json['metricCosts'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('selector')) {
       selector = _json['selector'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricCosts != null) 'metricCosts': metricCosts!,
         if (selector != null) 'selector': selector!,
       };
@@ -3826,7 +3823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (root != null) 'root': root!,
       };
@@ -3948,7 +3945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (labels != null)
@@ -4020,7 +4017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerDestinations != null)
           'consumerDestinations':
               consumerDestinations!.map((value) => value.toJson()).toList(),
@@ -4056,7 +4053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metrics != null) 'metrics': metrics!,
         if (monitoredResource != null) 'monitoredResource': monitoredResource!,
       };
@@ -4093,7 +4090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalScopes != null) 'canonicalScopes': canonicalScopes!,
       };
 }
@@ -4152,29 +4149,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4199,7 +4194,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceNames != null) 'resourceNames': resourceNames!,
       };
 }
@@ -4232,16 +4227,16 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = (_json['value'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      value = (_json['value'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -4291,7 +4286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (name != null) 'name': name!,
         if (subpages != null)
@@ -4348,7 +4343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (limits != null)
           'limits': limits!.map((value) => value.toJson()).toList(),
         if (metricRules != null)
@@ -4472,17 +4467,16 @@
       unit = _json['unit'] as core.String;
     }
     if (_json.containsKey('values')) {
-      values =
-          (_json['values'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      values = (_json['values'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultLimit != null) 'defaultLimit': defaultLimit!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -4557,14 +4551,13 @@
       adminOverrideAncestor = _json['adminOverrideAncestor'] as core.String;
     }
     if (_json.containsKey('dimensions')) {
-      dimensions = (_json['dimensions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      dimensions =
+          (_json['dimensions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('metric')) {
       metric = _json['metric'] as core.String;
@@ -4580,7 +4573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminOverrideAncestor != null)
           'adminOverrideAncestor': adminOverrideAncestor!,
         if (dimensions != null) 'dimensions': dimensions!,
@@ -4616,7 +4609,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (uniqueId != null) 'uniqueId': uniqueId!,
       };
@@ -4639,7 +4632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileName != null) 'fileName': fileName!,
       };
 }
@@ -4657,8 +4650,8 @@
   SourceInfo.fromJson(core.Map _json) {
     if (_json.containsKey('sourceFiles')) {
       sourceFiles = (_json['sourceFiles'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4668,7 +4661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sourceFiles != null) 'sourceFiles': sourceFiles!,
       };
 }
@@ -4706,8 +4699,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4720,7 +4713,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4761,7 +4754,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpHeader != null) 'httpHeader': httpHeader!,
         if (name != null) 'name': name!,
         if (urlQueryParameter != null) 'urlQueryParameter': urlQueryParameter!,
@@ -4799,7 +4792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
         if (selector != null) 'selector': selector!,
@@ -4838,7 +4831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rules != null)
           'rules': rules!.map((value) => value.toJson()).toList(),
       };
@@ -4899,7 +4892,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -4959,7 +4952,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (producerNotificationChannel != null)
           'producerNotificationChannel': producerNotificationChannel!,
         if (requirements != null) 'requirements': requirements!,
@@ -5013,7 +5006,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowUnregisteredCalls != null)
           'allowUnregisteredCalls': allowUnregisteredCalls!,
         if (selector != null) 'selector': selector!,
diff --git a/generated/googleapis/lib/sheets/v4.dart b/generated/googleapis/lib/sheets/v4.dart
index fda2fb6..9bf58aa 100644
--- a/generated/googleapis/lib/sheets/v4.dart
+++ b/generated/googleapis/lib/sheets/v4.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1164,7 +1163,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bandedRange != null) 'bandedRange': bandedRange!.toJson(),
       };
 }
@@ -1183,7 +1182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bandedRange != null) 'bandedRange': bandedRange!.toJson(),
       };
 }
@@ -1207,7 +1206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chart != null) 'chart': chart!.toJson(),
       };
 }
@@ -1226,7 +1225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chart != null) 'chart': chart!.toJson(),
       };
 }
@@ -1253,7 +1252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (index != null) 'index': index!,
         if (rule != null) 'rule': rule!.toJson(),
       };
@@ -1278,7 +1277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSource != null) 'dataSource': dataSource!.toJson(),
       };
 }
@@ -1304,7 +1303,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataExecutionStatus != null)
           'dataExecutionStatus': dataExecutionStatus!.toJson(),
         if (dataSource != null) 'dataSource': dataSource!.toJson(),
@@ -1339,7 +1338,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
       };
 }
@@ -1360,7 +1359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionGroups != null)
           'dimensionGroups':
               dimensionGroups!.map((value) => value.toJson()).toList(),
@@ -1385,7 +1384,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!.toJson(),
       };
 }
@@ -1404,7 +1403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!.toJson(),
       };
 }
@@ -1427,7 +1426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namedRange != null) 'namedRange': namedRange!.toJson(),
       };
 }
@@ -1446,7 +1445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namedRange != null) 'namedRange': namedRange!.toJson(),
       };
 }
@@ -1469,7 +1468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (protectedRange != null) 'protectedRange': protectedRange!.toJson(),
       };
 }
@@ -1488,7 +1487,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (protectedRange != null) 'protectedRange': protectedRange!.toJson(),
       };
 }
@@ -1515,7 +1514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (properties != null) 'properties': properties!.toJson(),
       };
 }
@@ -1534,7 +1533,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (properties != null) 'properties': properties!.toJson(),
       };
 }
@@ -1558,7 +1557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (slicer != null) 'slicer': slicer!.toJson(),
       };
 }
@@ -1577,7 +1576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (slicer != null) 'slicer': slicer!.toJson(),
       };
 }
@@ -1615,7 +1614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
         if (sheetId != null) 'sheetId': sheetId!,
@@ -1651,7 +1650,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!,
         if (length != null) 'length': length!,
         if (sheetId != null) 'sheetId': sheetId!,
@@ -1687,7 +1686,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
         if (tableRange != null) 'tableRange': tableRange!,
         if (updates != null) 'updates': updates!.toJson(),
@@ -1729,7 +1728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
         if (sourceAndDestination != null)
           'sourceAndDestination': sourceAndDestination!.toJson(),
@@ -1761,7 +1760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceSheetDimensions != null)
           'dataSourceSheetDimensions': dataSourceSheetDimensions!.toJson(),
         if (dimensions != null) 'dimensions': dimensions!.toJson(),
@@ -1810,7 +1809,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bandedRangeId != null) 'bandedRangeId': bandedRangeId!,
         if (columnProperties != null)
           'columnProperties': columnProperties!.toJson(),
@@ -1922,7 +1921,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firstBandColor != null) 'firstBandColor': firstBandColor!.toJson(),
         if (firstBandColorStyle != null)
           'firstBandColorStyle': firstBandColorStyle!.toJson(),
@@ -2024,7 +2023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comparisonType != null) 'comparisonType': comparisonType!,
         if (description != null) 'description': description!,
         if (negativeColor != null) 'negativeColor': negativeColor!.toJson(),
@@ -2094,7 +2093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (format != null) 'format': format!.toJson(),
         if (position != null) 'position': position!,
         if (title != null) 'title': title!,
@@ -2130,7 +2129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domain != null) 'domain': domain!.toJson(),
         if (reversed != null) 'reversed': reversed!,
       };
@@ -2252,7 +2251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (colorStyle != null) 'colorStyle': colorStyle!.toJson(),
         if (dataLabel != null) 'dataLabel': dataLabel!.toJson(),
@@ -2416,7 +2415,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (axis != null) 'axis': axis!.map((value) => value.toJson()).toList(),
         if (chartType != null) 'chartType': chartType!,
         if (compareMode != null) 'compareMode': compareMode!,
@@ -2461,15 +2460,12 @@
 
   BasicFilter.fromJson(core.Map _json) {
     if (_json.containsKey('criteria')) {
-      criteria = (_json['criteria'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              FilterCriteria.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      criteria = (_json['criteria'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          FilterCriteria.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('filterSpecs')) {
       filterSpecs = (_json['filterSpecs'] as core.List)
@@ -2489,7 +2485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (criteria != null)
           'criteria':
               criteria!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -2544,7 +2540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (colorStyle != null) 'colorStyle': colorStyle!.toJson(),
         if (index != null) 'index': index!,
@@ -2569,7 +2565,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFilters != null)
           'dataFilters': dataFilters!.map((value) => value.toJson()).toList(),
       };
@@ -2601,7 +2597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clearedRanges != null) 'clearedRanges': clearedRanges!,
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
       };
@@ -2622,7 +2618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ranges != null) 'ranges': ranges!,
       };
 }
@@ -2652,7 +2648,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clearedRanges != null) 'clearedRanges': clearedRanges!,
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
       };
@@ -2734,7 +2730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFilters != null)
           'dataFilters': dataFilters!.map((value) => value.toJson()).toList(),
         if (dateTimeRenderOption != null)
@@ -2767,7 +2763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
         if (valueRanges != null)
           'valueRanges': valueRanges!.map((value) => value.toJson()).toList(),
@@ -2799,7 +2795,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
         if (valueRanges != null)
           'valueRanges': valueRanges!.map((value) => value.toJson()).toList(),
@@ -2851,7 +2847,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeSpreadsheetInResponse != null)
           'includeSpreadsheetInResponse': includeSpreadsheetInResponse!,
         if (requests != null)
@@ -2898,7 +2894,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (replies != null)
           'replies': replies!.map((value) => value.toJson()).toList(),
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
@@ -2998,7 +2994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (includeValuesInResponse != null)
           'includeValuesInResponse': includeValuesInResponse!,
@@ -3059,7 +3055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
@@ -3160,7 +3156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (includeValuesInResponse != null)
           'includeValuesInResponse': includeValuesInResponse!,
@@ -3221,7 +3217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
@@ -3263,7 +3259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectId != null) 'projectId': projectId!,
         if (querySpec != null) 'querySpec': querySpec!.toJson(),
         if (tableSpec != null) 'tableSpec': tableSpec!.toJson(),
@@ -3283,7 +3279,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rawQuery != null) 'rawQuery': rawQuery!,
       };
 }
@@ -3318,7 +3314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetId != null) 'datasetId': datasetId!,
         if (tableId != null) 'tableId': tableId!,
         if (tableProjectId != null) 'tableProjectId': tableProjectId!,
@@ -3460,7 +3456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
@@ -3493,7 +3489,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (format != null) 'format': format!.toJson(),
       };
@@ -3546,7 +3542,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (colorStyle != null) 'colorStyle': colorStyle!.toJson(),
         if (style != null) 'style': style!,
@@ -3589,7 +3585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottom != null) 'bottom': bottom!.toJson(),
         if (left != null) 'left': left!.toJson(),
         if (right != null) 'right': right!.toJson(),
@@ -3717,7 +3713,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bubbleBorderColor != null)
           'bubbleBorderColor': bubbleBorderColor!.toJson(),
         if (bubbleBorderColorStyle != null)
@@ -3766,7 +3762,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!.map((value) => value.toJson()).toList(),
         if (domain != null) 'domain': domain!.toJson(),
       };
@@ -3818,7 +3814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (closeSeries != null) 'closeSeries': closeSeries!.toJson(),
         if (highSeries != null) 'highSeries': highSeries!.toJson(),
         if (lowSeries != null) 'lowSeries': lowSeries!.toJson(),
@@ -3846,7 +3842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!.toJson(),
         if (reversed != null) 'reversed': reversed!,
       };
@@ -3866,7 +3862,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!.toJson(),
       };
 }
@@ -4006,7 +4002,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceFormula != null)
           'dataSourceFormula': dataSourceFormula!.toJson(),
         if (dataSourceTable != null)
@@ -4161,7 +4157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null)
           'backgroundColor': backgroundColor!.toJson(),
         if (backgroundColorStyle != null)
@@ -4223,7 +4219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (viewWindowMax != null) 'viewWindowMax': viewWindowMax!,
         if (viewWindowMin != null) 'viewWindowMin': viewWindowMin!,
         if (viewWindowMode != null) 'viewWindowMode': viewWindowMode!,
@@ -4253,7 +4249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (prefix != null) 'prefix': prefix!,
         if (suffix != null) 'suffix': suffix!,
       };
@@ -4306,7 +4302,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregateType != null) 'aggregateType': aggregateType!,
         if (columnReference != null)
           'columnReference': columnReference!.toJson(),
@@ -4357,7 +4353,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -4390,7 +4386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dateTimeRule != null) 'dateTimeRule': dateTimeRule!.toJson(),
         if (histogramRule != null) 'histogramRule': histogramRule!.toJson(),
       };
@@ -4430,7 +4426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intervalSize != null) 'intervalSize': intervalSize!,
         if (maxValue != null) 'maxValue': maxValue!,
         if (minValue != null) 'minValue': minValue!,
@@ -4462,7 +4458,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sources != null)
           'sources': sources!.map((value) => value.toJson()).toList(),
       };
@@ -4679,7 +4675,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (altText != null) 'altText': altText!,
         if (backgroundColor != null)
           'backgroundColor': backgroundColor!.toJson(),
@@ -4731,7 +4727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sheetId != null) 'sheetId': sheetId!,
       };
 }
@@ -4744,7 +4740,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response when clearing a range of values in a spreadsheet.
@@ -4770,7 +4766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clearedRange != null) 'clearedRange': clearedRange!,
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
       };
@@ -4864,7 +4860,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alpha != null) 'alpha': alpha!,
         if (blue != null) 'blue': blue!,
         if (green != null) 'green': green!,
@@ -4903,7 +4899,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rgbColor != null) 'rgbColor': rgbColor!.toJson(),
         if (themeColor != null) 'themeColor': themeColor!,
       };
@@ -4943,7 +4939,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (relativeDate != null) 'relativeDate': relativeDate!,
         if (userEnteredValue != null) 'userEnteredValue': userEnteredValue!,
       };
@@ -4981,7 +4977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (booleanRule != null) 'booleanRule': booleanRule!.toJson(),
         if (gradientRule != null) 'gradientRule': gradientRule!.toJson(),
         if (ranges != null)
@@ -5041,7 +5037,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!.toJson(),
         if (pasteOrientation != null) 'pasteOrientation': pasteOrientation!,
         if (pasteType != null) 'pasteType': pasteType!,
@@ -5063,7 +5059,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationSpreadsheetId != null)
           'destinationSpreadsheetId': destinationSpreadsheetId!,
       };
@@ -5083,7 +5079,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (developerMetadata != null)
           'developerMetadata': developerMetadata!.toJson(),
       };
@@ -5103,7 +5099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (developerMetadata != null)
           'developerMetadata': developerMetadata!.toJson(),
       };
@@ -5148,7 +5144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!.toJson(),
         if (pasteType != null) 'pasteType': pasteType!,
         if (source != null) 'source': source!.toJson(),
@@ -5231,7 +5227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorCode != null) 'errorCode': errorCode!,
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (lastRefreshTime != null) 'lastRefreshTime': lastRefreshTime!,
@@ -5269,7 +5265,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (a1Range != null) 'a1Range': a1Range!,
         if (developerMetadataLookup != null)
           'developerMetadataLookup': developerMetadataLookup!.toJson(),
@@ -5319,7 +5315,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFilter != null) 'dataFilter': dataFilter!.toJson(),
         if (majorDimension != null) 'majorDimension': majorDimension!,
         if (values != null) 'values': values!,
@@ -5391,7 +5387,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customLabelData != null)
           'customLabelData': customLabelData!.toJson(),
         if (placement != null) 'placement': placement!,
@@ -5441,7 +5437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calculatedColumns != null)
           'calculatedColumns':
               calculatedColumns!.map((value) => value.toJson()).toList(),
@@ -5473,7 +5469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataExecutionStatus != null)
           'dataExecutionStatus': dataExecutionStatus!.toJson(),
         if (dataSourceId != null) 'dataSourceId': dataSourceId!,
@@ -5500,7 +5496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formula != null) 'formula': formula!,
         if (reference != null) 'reference': reference!.toJson(),
       };
@@ -5521,7 +5517,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -5548,7 +5544,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataExecutionStatus != null)
           'dataExecutionStatus': dataExecutionStatus!.toJson(),
         if (dataSourceId != null) 'dataSourceId': dataSourceId!,
@@ -5598,7 +5594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chartId != null) 'chartId': chartId!,
         if (dataSourceFormulaCell != null)
           'dataSourceFormulaCell': dataSourceFormulaCell!.toJson(),
@@ -5628,7 +5624,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (references != null)
           'references': references!.map((value) => value.toJson()).toList(),
       };
@@ -5671,7 +5667,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (namedRangeId != null) 'namedRangeId': namedRangeId!,
         if (range != null) 'range': range!.toJson(),
@@ -5696,7 +5692,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (startTime != null) 'startTime': startTime!.toJson(),
       };
 }
@@ -5731,7 +5727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (daysOfMonth != null) 'daysOfMonth': daysOfMonth!,
         if (startTime != null) 'startTime': startTime!.toJson(),
       };
@@ -5798,7 +5794,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dailySchedule != null) 'dailySchedule': dailySchedule!.toJson(),
         if (enabled != null) 'enabled': enabled!,
         if (monthlySchedule != null)
@@ -5838,7 +5834,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (daysOfWeek != null) 'daysOfWeek': daysOfWeek!,
         if (startTime != null) 'startTime': startTime!.toJson(),
       };
@@ -5867,7 +5863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnReferences != null)
           'columnReferences':
               columnReferences!.map((value) => value.toJson()).toList(),
@@ -5905,7 +5901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null)
           'columns': columns!.map((value) => value.toJson()).toList(),
         if (dataExecutionStatus != null)
@@ -5940,7 +5936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigQuery != null) 'bigQuery': bigQuery!.toJson(),
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
@@ -6029,7 +6025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnSelectionType != null)
           'columnSelectionType': columnSelectionType!,
         if (columns != null)
@@ -6079,7 +6075,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (inputMessage != null) 'inputMessage': inputMessage!,
         if (showCustomUi != null) 'showCustomUi': showCustomUi!,
@@ -6138,7 +6134,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -6156,7 +6152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bandedRangeId != null) 'bandedRangeId': bandedRangeId!,
       };
 }
@@ -6182,7 +6178,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (index != null) 'index': index!,
         if (sheetId != null) 'sheetId': sheetId!,
       };
@@ -6202,7 +6198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rule != null) 'rule': rule!.toJson(),
       };
 }
@@ -6223,7 +6219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceId != null) 'dataSourceId': dataSourceId!,
       };
 }
@@ -6243,7 +6239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFilter != null) 'dataFilter': dataFilter!.toJson(),
       };
 }
@@ -6265,7 +6261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deletedDeveloperMetadata != null)
           'deletedDeveloperMetadata':
               deletedDeveloperMetadata!.map((value) => value.toJson()).toList(),
@@ -6291,7 +6287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
       };
 }
@@ -6312,7 +6308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionGroups != null)
           'dimensionGroups':
               dimensionGroups!.map((value) => value.toJson()).toList(),
@@ -6333,7 +6329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
       };
 }
@@ -6372,7 +6368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comparisonColumns != null)
           'comparisonColumns':
               comparisonColumns!.map((value) => value.toJson()).toList(),
@@ -6393,7 +6389,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (duplicatesRemovedCount != null)
           'duplicatesRemovedCount': duplicatesRemovedCount!,
       };
@@ -6412,7 +6408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -6430,7 +6426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filterId != null) 'filterId': filterId!,
       };
 }
@@ -6448,7 +6444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namedRangeId != null) 'namedRangeId': namedRangeId!,
       };
 }
@@ -6466,7 +6462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (protectedRangeId != null) 'protectedRangeId': protectedRangeId!,
       };
 }
@@ -6499,7 +6495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
         if (shiftDimension != null) 'shiftDimension': shiftDimension!,
       };
@@ -6521,7 +6517,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sheetId != null) 'sheetId': sheetId!,
       };
 }
@@ -6586,7 +6582,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null) 'location': location!.toJson(),
         if (metadataId != null) 'metadataId': metadataId!,
         if (metadataKey != null) 'metadataKey': metadataKey!,
@@ -6638,7 +6634,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionRange != null) 'dimensionRange': dimensionRange!.toJson(),
         if (locationType != null) 'locationType': locationType!,
         if (sheetId != null) 'sheetId': sheetId!,
@@ -6760,7 +6756,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locationMatchingStrategy != null)
           'locationMatchingStrategy': locationMatchingStrategy!,
         if (locationType != null) 'locationType': locationType!,
@@ -6810,7 +6806,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collapsed != null) 'collapsed': collapsed!,
         if (depth != null) 'depth': depth!,
         if (range != null) 'range': range!.toJson(),
@@ -6863,7 +6859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceColumnReference != null)
           'dataSourceColumnReference': dataSourceColumnReference!.toJson(),
         if (developerMetadata != null)
@@ -6914,7 +6910,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!,
         if (endIndex != null) 'endIndex': endIndex!,
         if (sheetId != null) 'sheetId': sheetId!,
@@ -6935,7 +6931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filterId != null) 'filterId': filterId!,
       };
 }
@@ -6954,7 +6950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!.toJson(),
       };
 }
@@ -7002,7 +6998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (insertSheetIndex != null) 'insertSheetIndex': insertSheetIndex!,
         if (newSheetId != null) 'newSheetId': newSheetId!,
         if (newSheetName != null) 'newSheetName': newSheetName!,
@@ -7024,7 +7020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (properties != null) 'properties': properties!.toJson(),
       };
 }
@@ -7061,7 +7057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domainUsersCanEdit != null)
           'domainUsersCanEdit': domainUsersCanEdit!,
         if (groups != null) 'groups': groups!,
@@ -7103,7 +7099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (border != null) 'border': border!.toJson(),
         if (chartId != null) 'chartId': chartId!,
         if (position != null) 'position': position!.toJson(),
@@ -7134,7 +7130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (colorStyle != null) 'colorStyle': colorStyle!.toJson(),
       };
@@ -7171,7 +7167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newSheet != null) 'newSheet': newSheet!,
         if (overlayPosition != null)
           'overlayPosition': overlayPosition!.toJson(),
@@ -7210,7 +7206,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (message != null) 'message': message!,
         if (type != null) 'type': type!,
       };
@@ -7263,7 +7259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (errorValue != null) 'errorValue': errorValue!.toJson(),
         if (formulaValue != null) 'formulaValue': formulaValue!,
@@ -7343,7 +7339,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (hiddenValues != null) 'hiddenValues': hiddenValues!,
         if (visibleBackgroundColor != null)
@@ -7385,7 +7381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnIndex != null) 'columnIndex': columnIndex!,
         if (dataSourceColumnReference != null)
           'dataSourceColumnReference': dataSourceColumnReference!.toJson(),
@@ -7433,15 +7429,12 @@
 
   FilterView.fromJson(core.Map _json) {
     if (_json.containsKey('criteria')) {
-      criteria = (_json['criteria'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              FilterCriteria.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      criteria = (_json['criteria'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          FilterCriteria.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('filterSpecs')) {
       filterSpecs = (_json['filterSpecs'] as core.List)
@@ -7470,7 +7463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (criteria != null)
           'criteria':
               criteria!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -7557,7 +7550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allSheets != null) 'allSheets': allSheets!,
         if (find != null) 'find': find!,
         if (includeFormulas != null) 'includeFormulas': includeFormulas!,
@@ -7610,7 +7603,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (formulasChanged != null) 'formulasChanged': formulasChanged!,
         if (occurrencesChanged != null)
           'occurrencesChanged': occurrencesChanged!,
@@ -7645,7 +7638,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFilters != null)
           'dataFilters': dataFilters!.map((value) => value.toJson()).toList(),
         if (includeGridData != null) 'includeGridData': includeGridData!,
@@ -7684,7 +7677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxpoint != null) 'maxpoint': maxpoint!.toJson(),
         if (midpoint != null) 'midpoint': midpoint!.toJson(),
         if (minpoint != null) 'minpoint': minpoint!.toJson(),
@@ -7718,7 +7711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnIndex != null) 'columnIndex': columnIndex!,
         if (rowIndex != null) 'rowIndex': rowIndex!,
         if (sheetId != null) 'sheetId': sheetId!,
@@ -7776,7 +7769,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnMetadata != null)
           'columnMetadata':
               columnMetadata!.map((value) => value.toJson()).toList(),
@@ -7838,7 +7831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnCount != null) 'columnCount': columnCount!,
         if (columnGroupControlAfter != null)
           'columnGroupControlAfter': columnGroupControlAfter!,
@@ -7902,7 +7895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endColumnIndex != null) 'endColumnIndex': endColumnIndex!,
         if (endRowIndex != null) 'endRowIndex': endRowIndex!,
         if (sheetId != null) 'sheetId': sheetId!,
@@ -7979,7 +7972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketSize != null) 'bucketSize': bucketSize!,
         if (legendPosition != null) 'legendPosition': legendPosition!,
         if (outlierPercentile != null) 'outlierPercentile': outlierPercentile!,
@@ -8040,7 +8033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (end != null) 'end': end!,
         if (interval != null) 'interval': interval!,
         if (start != null) 'start': start!,
@@ -8080,7 +8073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (barColor != null) 'barColor': barColor!.toJson(),
         if (barColorStyle != null) 'barColorStyle': barColorStyle!.toJson(),
         if (data != null) 'data': data!.toJson(),
@@ -8119,7 +8112,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inheritFromBefore != null) 'inheritFromBefore': inheritFromBefore!,
         if (range != null) 'range': range!.toJson(),
       };
@@ -8152,7 +8145,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
         if (shiftDimension != null) 'shiftDimension': shiftDimension!,
       };
@@ -8215,7 +8208,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (colorStyle != null) 'colorStyle': colorStyle!.toJson(),
         if (type != null) 'type': type!,
@@ -8257,7 +8250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -8286,7 +8279,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (convergenceThreshold != null)
           'convergenceThreshold': convergenceThreshold!,
         if (maxIterations != null) 'maxIterations': maxIterations!,
@@ -8316,7 +8309,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (position != null) 'position': position!.toJson(),
         if (textFormat != null) 'textFormat': textFormat!.toJson(),
       };
@@ -8354,7 +8347,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (width != null) 'width': width!,
       };
@@ -8390,7 +8383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groups != null)
           'groups': groups!.map((value) => value.toJson()).toList(),
       };
@@ -8426,7 +8419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupName != null) 'groupName': groupName!.toJson(),
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -8457,7 +8450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFilters != null)
           'dataFilters': dataFilters!.map((value) => value.toJson()).toList(),
         if (developerMetadata != null)
@@ -8488,7 +8481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFilters != null)
           'dataFilters': dataFilters!.map((value) => value.toJson()).toList(),
         if (valueRange != null) 'valueRange': valueRange!.toJson(),
@@ -8519,7 +8512,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mergeType != null) 'mergeType': mergeType!,
         if (range != null) 'range': range!.toJson(),
       };
@@ -8554,7 +8547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationIndex != null) 'destinationIndex': destinationIndex!,
         if (source != null) 'source': source!.toJson(),
       };
@@ -8586,7 +8579,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (namedRangeId != null) 'namedRangeId': namedRangeId!,
         if (range != null) 'range': range!.toJson(),
@@ -8630,7 +8623,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pattern != null) 'pattern': pattern!,
         if (type != null) 'type': type!,
       };
@@ -8725,7 +8718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!.toJson(),
         if (nodeColor != null) 'nodeColor': nodeColor!.toJson(),
         if (nodeColorStyle != null) 'nodeColorStyle': nodeColorStyle!.toJson(),
@@ -8783,7 +8776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (anchorCell != null) 'anchorCell': anchorCell!.toJson(),
         if (heightPixels != null) 'heightPixels': heightPixels!,
         if (offsetXPixels != null) 'offsetXPixels': offsetXPixels!,
@@ -8825,7 +8818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottom != null) 'bottom': bottom!,
         if (left != null) 'left': left!,
         if (right != null) 'right': right!,
@@ -8881,7 +8874,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coordinate != null) 'coordinate': coordinate!.toJson(),
         if (data != null) 'data': data!,
         if (delimiter != null) 'delimiter': delimiter!,
@@ -8937,7 +8930,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domain != null) 'domain': domain!.toJson(),
         if (legendPosition != null) 'legendPosition': legendPosition!,
         if (pieHole != null) 'pieHole': pieHole!,
@@ -8991,7 +8984,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (visibleByDefault != null) 'visibleByDefault': visibleByDefault!,
         if (visibleValues != null) 'visibleValues': visibleValues!,
@@ -9027,7 +9020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnOffsetIndex != null) 'columnOffsetIndex': columnOffsetIndex!,
         if (dataSourceColumnReference != null)
           'dataSourceColumnReference': dataSourceColumnReference!.toJson(),
@@ -9141,7 +9134,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceColumnReference != null)
           'dataSourceColumnReference': dataSourceColumnReference!.toJson(),
         if (groupLimit != null) 'groupLimit': groupLimit!.toJson(),
@@ -9185,7 +9178,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applyOrder != null) 'applyOrder': applyOrder!,
         if (countLimit != null) 'countLimit': countLimit!,
       };
@@ -9224,7 +9217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dateTimeRule != null) 'dateTimeRule': dateTimeRule!.toJson(),
         if (histogramRule != null) 'histogramRule': histogramRule!.toJson(),
         if (manualRule != null) 'manualRule': manualRule!.toJson(),
@@ -9262,7 +9255,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buckets != null)
           'buckets': buckets!.map((value) => value.toJson()).toList(),
         if (valuesIndex != null) 'valuesIndex': valuesIndex!,
@@ -9292,7 +9285,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (collapsed != null) 'collapsed': collapsed!,
         if (value != null) 'value': value!.toJson(),
       };
@@ -9354,15 +9347,13 @@
           .toList();
     }
     if (_json.containsKey('criteria')) {
-      criteria = (_json['criteria'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              PivotFilterCriteria.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      criteria = (_json['criteria'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          PivotFilterCriteria.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('dataExecutionStatus')) {
       dataExecutionStatus = DataExecutionStatus.fromJson(
@@ -9398,7 +9389,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null)
           'columns': columns!.map((value) => value.toJson()).toList(),
         if (criteria != null)
@@ -9503,7 +9494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calculatedDisplayType != null)
           'calculatedDisplayType': calculatedDisplayType!,
         if (dataSourceColumnReference != null)
@@ -9549,7 +9540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (shape != null) 'shape': shape!,
         if (size != null) 'size': size!,
       };
@@ -9639,7 +9630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (editors != null) 'editors': editors!.toJson(),
         if (namedRangeId != null) 'namedRangeId': namedRangeId!,
@@ -9668,7 +9659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
       };
 }
@@ -9694,7 +9685,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataExecutionStatus != null)
           'dataExecutionStatus': dataExecutionStatus!.toJson(),
         if (reference != null) 'reference': reference!.toJson(),
@@ -9745,7 +9736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceId != null) 'dataSourceId': dataSourceId!,
         if (force != null) 'force': force!,
         if (isAll != null) 'isAll': isAll!,
@@ -9773,7 +9764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (statuses != null)
           'statuses': statuses!.map((value) => value.toJson()).toList(),
       };
@@ -9819,7 +9810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cell != null) 'cell': cell!.toJson(),
         if (fields != null) 'fields': fields!,
         if (range != null) 'range': range!.toJson(),
@@ -10302,7 +10293,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addBanding != null) 'addBanding': addBanding!.toJson(),
         if (addChart != null) 'addChart': addChart!.toJson(),
         if (addConditionalFormatRule != null)
@@ -10584,7 +10575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addBanding != null) 'addBanding': addBanding!.toJson(),
         if (addChart != null) 'addChart': addChart!.toJson(),
         if (addDataSource != null) 'addDataSource': addDataSource!.toJson(),
@@ -10641,7 +10632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (values != null)
           'values': values!.map((value) => value.toJson()).toList(),
       };
@@ -10743,7 +10734,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregateType != null) 'aggregateType': aggregateType!,
         if (baselineValueData != null)
           'baselineValueData': baselineValueData!.toJson(),
@@ -10780,7 +10771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFilters != null)
           'dataFilters': dataFilters!.map((value) => value.toJson()).toList(),
       };
@@ -10804,7 +10795,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matchedDeveloperMetadata != null)
           'matchedDeveloperMetadata':
               matchedDeveloperMetadata!.map((value) => value.toJson()).toList(),
@@ -10825,7 +10816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!.toJson(),
       };
 }
@@ -10854,7 +10845,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
         if (rule != null) 'rule': rule!.toJson(),
       };
@@ -10991,7 +10982,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bandedRanges != null)
           'bandedRanges': bandedRanges!.map((value) => value.toJson()).toList(),
         if (basicFilter != null) 'basicFilter': basicFilter!.toJson(),
@@ -11123,7 +11114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceSheetProperties != null)
           'dataSourceSheetProperties': dataSourceSheetProperties!.toJson(),
         if (gridProperties != null) 'gridProperties': gridProperties!.toJson(),
@@ -11169,7 +11160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (position != null) 'position': position!.toJson(),
         if (slicerId != null) 'slicerId': slicerId!,
         if (spec != null) 'spec': spec!.toJson(),
@@ -11254,7 +11245,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applyToPivotTables != null)
           'applyToPivotTables': applyToPivotTables!,
         if (backgroundColor != null)
@@ -11297,7 +11288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
         if (sortSpecs != null)
           'sortSpecs': sortSpecs!.map((value) => value.toJson()).toList(),
@@ -11377,7 +11368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null)
           'backgroundColor': backgroundColor!.toJson(),
         if (backgroundColorStyle != null)
@@ -11427,7 +11418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!,
         if (fillLength != null) 'fillLength': fillLength!,
         if (source != null) 'source': source!.toJson(),
@@ -11512,7 +11503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceSchedules != null)
           'dataSourceSchedules':
               dataSourceSchedules!.map((value) => value.toJson()).toList(),
@@ -11606,7 +11597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoRecalc != null) 'autoRecalc': autoRecalc!,
         if (defaultFormat != null) 'defaultFormat': defaultFormat!.toJson(),
         if (iterativeCalculationSettings != null)
@@ -11644,7 +11635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (primaryFontFamily != null) 'primaryFontFamily': primaryFontFamily!,
         if (themeColors != null)
           'themeColors': themeColors!.map((value) => value.toJson()).toList(),
@@ -11712,7 +11703,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bold != null) 'bold': bold!,
         if (fontFamily != null) 'fontFamily': fontFamily!,
         if (fontSize != null) 'fontSize': fontSize!,
@@ -11751,7 +11742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (format != null) 'format': format!.toJson(),
         if (startIndex != null) 'startIndex': startIndex!,
       };
@@ -11776,7 +11767,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (horizontalAlignment != null)
           'horizontalAlignment': horizontalAlignment!,
       };
@@ -11809,7 +11800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angle != null) 'angle': angle!,
         if (vertical != null) 'vertical': vertical!,
       };
@@ -11855,7 +11846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delimiter != null) 'delimiter': delimiter!,
         if (delimiterType != null) 'delimiterType': delimiterType!,
         if (source != null) 'source': source!.toJson(),
@@ -11894,7 +11885,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (colorType != null) 'colorType': colorType!,
       };
@@ -11945,7 +11936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
@@ -12044,7 +12035,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxValueColor != null) 'maxValueColor': maxValueColor!.toJson(),
         if (maxValueColorStyle != null)
           'maxValueColorStyle': maxValueColorStyle!.toJson(),
@@ -12193,7 +12184,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colorData != null) 'colorData': colorData!.toJson(),
         if (colorScale != null) 'colorScale': colorScale!.toJson(),
         if (headerColor != null) 'headerColor': headerColor!.toJson(),
@@ -12232,7 +12223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
       };
 }
@@ -12250,7 +12241,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cellsChangedCount != null) 'cellsChangedCount': cellsChangedCount!,
       };
 }
@@ -12272,7 +12263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (range != null) 'range': range!.toJson(),
       };
 }
@@ -12301,7 +12292,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bandedRange != null) 'bandedRange': bandedRange!.toJson(),
         if (fields != null) 'fields': fields!,
       };
@@ -12369,7 +12360,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottom != null) 'bottom': bottom!.toJson(),
         if (innerHorizontal != null)
           'innerHorizontal': innerHorizontal!.toJson(),
@@ -12427,7 +12418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (range != null) 'range': range!.toJson(),
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
@@ -12458,7 +12449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chartId != null) 'chartId': chartId!,
         if (spec != null) 'spec': spec!.toJson(),
       };
@@ -12499,7 +12490,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (index != null) 'index': index!,
         if (newIndex != null) 'newIndex': newIndex!,
         if (rule != null) 'rule': rule!.toJson(),
@@ -12545,7 +12536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newIndex != null) 'newIndex': newIndex!,
         if (newRule != null) 'newRule': newRule!.toJson(),
         if (oldIndex != null) 'oldIndex': oldIndex!,
@@ -12581,7 +12572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSource != null) 'dataSource': dataSource!.toJson(),
         if (fields != null) 'fields': fields!,
       };
@@ -12608,7 +12599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataExecutionStatus != null)
           'dataExecutionStatus': dataExecutionStatus!.toJson(),
         if (dataSource != null) 'dataSource': dataSource!.toJson(),
@@ -12654,7 +12645,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFilters != null)
           'dataFilters': dataFilters!.map((value) => value.toJson()).toList(),
         if (developerMetadata != null)
@@ -12679,7 +12670,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (developerMetadata != null)
           'developerMetadata':
               developerMetadata!.map((value) => value.toJson()).toList(),
@@ -12713,7 +12704,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionGroup != null) 'dimensionGroup': dimensionGroup!.toJson(),
         if (fields != null) 'fields': fields!,
       };
@@ -12757,7 +12748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSourceSheetRange != null)
           'dataSourceSheetRange': dataSourceSheetRange!.toJson(),
         if (fields != null) 'fields': fields!,
@@ -12796,7 +12787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (border != null) 'border': border!.toJson(),
         if (fields != null) 'fields': fields!,
         if (objectId != null) 'objectId': objectId!,
@@ -12840,7 +12831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (newPosition != null) 'newPosition': newPosition!.toJson(),
         if (objectId != null) 'objectId': objectId!,
@@ -12861,7 +12852,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (position != null) 'position': position!.toJson(),
       };
 }
@@ -12890,7 +12881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (filter != null) 'filter': filter!.toJson(),
       };
@@ -12920,7 +12911,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (namedRange != null) 'namedRange': namedRange!.toJson(),
       };
@@ -12950,7 +12941,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (protectedRange != null) 'protectedRange': protectedRange!.toJson(),
       };
@@ -12980,7 +12971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (properties != null) 'properties': properties!.toJson(),
       };
@@ -13019,7 +13010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (slicerId != null) 'slicerId': slicerId!,
         if (spec != null) 'spec': spec!.toJson(),
@@ -13050,7 +13041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (properties != null) 'properties': properties!.toJson(),
       };
@@ -13106,7 +13097,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataFilter != null) 'dataFilter': dataFilter!.toJson(),
         if (updatedCells != null) 'updatedCells': updatedCells!,
         if (updatedColumns != null) 'updatedColumns': updatedColumns!,
@@ -13163,7 +13154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (spreadsheetId != null) 'spreadsheetId': spreadsheetId!,
         if (updatedCells != null) 'updatedCells': updatedCells!,
         if (updatedColumns != null) 'updatedColumns': updatedColumns!,
@@ -13230,7 +13221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (majorDimension != null) 'majorDimension': majorDimension!,
         if (range != null) 'range': range!,
         if (values != null) 'values': values!,
@@ -13266,7 +13257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (colorStyle != null) 'colorStyle': colorStyle!.toJson(),
         if (label != null) 'label': label!,
@@ -13308,7 +13299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataIsSubtotal != null) 'dataIsSubtotal': dataIsSubtotal!,
         if (label != null) 'label': label!,
         if (subtotalIndex != null) 'subtotalIndex': subtotalIndex!,
@@ -13335,7 +13326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!.toJson(),
         if (reversed != null) 'reversed': reversed!,
       };
@@ -13405,7 +13396,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customSubtotals != null)
           'customSubtotals':
               customSubtotals!.map((value) => value.toJson()).toList(),
@@ -13487,7 +13478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectorLineStyle != null)
           'connectorLineStyle': connectorLineStyle!.toJson(),
         if (domain != null) 'domain': domain!.toJson(),
diff --git a/generated/googleapis/lib/siteverification/v1.dart b/generated/googleapis/lib/siteverification/v1.dart
index cc8971a..015b7a7 100644
--- a/generated/googleapis/lib/siteverification/v1.dart
+++ b/generated/googleapis/lib/siteverification/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -346,7 +345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identifier != null) 'identifier': identifier!,
         if (type != null) 'type': type!,
       };
@@ -374,7 +373,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (site != null) 'site': site!.toJson(),
         if (verificationMethod != null)
           'verificationMethod': verificationMethod!,
@@ -407,7 +406,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (method != null) 'method': method!,
         if (token != null) 'token': token!,
       };
@@ -429,7 +428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
       };
@@ -459,7 +458,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (identifier != null) 'identifier': identifier!,
         if (type != null) 'type': type!,
       };
@@ -495,7 +494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (owners != null) 'owners': owners!,
         if (site != null) 'site': site!.toJson(),
diff --git a/generated/googleapis/lib/slides/v1.dart b/generated/googleapis/lib/slides/v1.dart
index c545455..184245a 100644
--- a/generated/googleapis/lib/slides/v1.dart
+++ b/generated/googleapis/lib/slides/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -396,7 +395,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (scaleX != null) 'scaleX': scaleX!,
         if (scaleY != null) 'scaleY': scaleY!,
         if (shearX != null) 'shearX': shearX!,
@@ -437,7 +436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (style != null) 'style': style!.toJson(),
         if (type != null) 'type': type!,
@@ -492,7 +491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autofitType != null) 'autofitType': autofitType!,
         if (fontScale != null) 'fontScale': fontScale!,
         if (lineSpacingReduction != null)
@@ -523,7 +522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
         if (writeControl != null) 'writeControl': writeControl!.toJson(),
@@ -562,7 +561,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (presentationId != null) 'presentationId': presentationId!,
         if (replies != null)
           'replies': replies!.map((value) => value.toJson()).toList(),
@@ -602,7 +601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bulletStyle != null) 'bulletStyle': bulletStyle!.toJson(),
         if (glyph != null) 'glyph': glyph!,
         if (listId != null) 'listId': listId!,
@@ -626,7 +625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colors != null)
           'colors': colors!.map((value) => value.toJson()).toList(),
       };
@@ -663,7 +662,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alpha != null) 'alpha': alpha!,
         if (color != null) 'color': color!.toJson(),
         if (position != null) 'position': position!,
@@ -717,7 +716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (elementProperties != null)
           'elementProperties': elementProperties!.toJson(),
         if (objectId != null) 'objectId': objectId!,
@@ -738,7 +737,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -804,7 +803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (elementProperties != null)
           'elementProperties': elementProperties!.toJson(),
@@ -826,7 +825,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -917,7 +916,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bulletPreset != null) 'bulletPreset': bulletPreset!,
         if (cellLocation != null) 'cellLocation': cellLocation!.toJson(),
         if (objectId != null) 'objectId': objectId!,
@@ -1220,7 +1219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (elementProperties != null)
           'elementProperties': elementProperties!.toJson(),
         if (objectId != null) 'objectId': objectId!,
@@ -1241,7 +1240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -1306,7 +1305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chartId != null) 'chartId': chartId!,
         if (elementProperties != null)
           'elementProperties': elementProperties!.toJson(),
@@ -1329,7 +1328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -1391,7 +1390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (insertionIndex != null) 'insertionIndex': insertionIndex!,
         if (objectId != null) 'objectId': objectId!,
         if (placeholderIdMappings != null)
@@ -1415,7 +1414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -1464,7 +1463,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null) 'columns': columns!,
         if (elementProperties != null)
           'elementProperties': elementProperties!.toJson(),
@@ -1486,7 +1485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -1548,7 +1547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (elementProperties != null)
           'elementProperties': elementProperties!.toJson(),
         if (id != null) 'id': id!,
@@ -1570,7 +1569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -1637,7 +1636,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angle != null) 'angle': angle!,
         if (bottomOffset != null) 'bottomOffset': bottomOffset!,
         if (leftOffset != null) 'leftOffset': leftOffset!,
@@ -1663,7 +1662,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -1703,7 +1702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cellLocation != null) 'cellLocation': cellLocation!.toJson(),
         if (objectId != null) 'objectId': objectId!,
         if (textRange != null) 'textRange': textRange!.toJson(),
@@ -1734,7 +1733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cellLocation != null) 'cellLocation': cellLocation!.toJson(),
         if (tableObjectId != null) 'tableObjectId': tableObjectId!,
       };
@@ -1764,7 +1763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cellLocation != null) 'cellLocation': cellLocation!.toJson(),
         if (tableObjectId != null) 'tableObjectId': tableObjectId!,
       };
@@ -1811,7 +1810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cellLocation != null) 'cellLocation': cellLocation!.toJson(),
         if (objectId != null) 'objectId': objectId!,
         if (textRange != null) 'textRange': textRange!.toJson(),
@@ -1843,7 +1842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (magnitude != null) 'magnitude': magnitude!,
         if (unit != null) 'unit': unit!,
       };
@@ -1885,16 +1884,16 @@
     }
     if (_json.containsKey('objectIds')) {
       objectIds =
-          (_json['objectIds'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+          (_json['objectIds'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
         if (objectIds != null) 'objectIds': objectIds!,
       };
@@ -1913,7 +1912,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -1936,7 +1935,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (children != null)
           'children': children!.map((value) => value.toJson()).toList(),
       };
@@ -1977,7 +1976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childrenObjectIds != null) 'childrenObjectIds': childrenObjectIds!,
         if (groupObjectId != null) 'groupObjectId': groupObjectId!,
       };
@@ -1996,7 +1995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -2033,7 +2032,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentUrl != null) 'contentUrl': contentUrl!,
         if (imageProperties != null)
           'imageProperties': imageProperties!.toJson(),
@@ -2120,7 +2119,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (brightness != null) 'brightness': brightness!,
         if (contrast != null) 'contrast': contrast!,
         if (cropProperties != null) 'cropProperties': cropProperties!.toJson(),
@@ -2174,7 +2173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cellLocation != null) 'cellLocation': cellLocation!.toJson(),
         if (insertRight != null) 'insertRight': insertRight!,
         if (number != null) 'number': number!,
@@ -2222,7 +2221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cellLocation != null) 'cellLocation': cellLocation!.toJson(),
         if (insertBelow != null) 'insertBelow': insertBelow!,
         if (number != null) 'number': number!,
@@ -2281,7 +2280,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cellLocation != null) 'cellLocation': cellLocation!.toJson(),
         if (insertionIndex != null) 'insertionIndex': insertionIndex!,
         if (objectId != null) 'objectId': objectId!,
@@ -2330,7 +2329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (layoutPlaceholder != null)
           'layoutPlaceholder': layoutPlaceholder!.toJson(),
         if (layoutPlaceholderObjectId != null)
@@ -2364,7 +2363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (masterObjectId != null) 'masterObjectId': masterObjectId!,
         if (name != null) 'name': name!,
@@ -2408,7 +2407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (layoutId != null) 'layoutId': layoutId!,
         if (predefinedLayout != null) 'predefinedLayout': predefinedLayout!,
       };
@@ -2471,7 +2470,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineCategory != null) 'lineCategory': lineCategory!,
         if (lineProperties != null) 'lineProperties': lineProperties!.toJson(),
         if (lineType != null) 'lineType': lineType!,
@@ -2510,7 +2509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectedObjectId != null) 'connectedObjectId': connectedObjectId!,
         if (connectionSiteIndex != null)
           'connectionSiteIndex': connectionSiteIndex!,
@@ -2531,7 +2530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (solidFill != null) 'solidFill': solidFill!.toJson(),
       };
 }
@@ -2656,7 +2655,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dashStyle != null) 'dashStyle': dashStyle!,
         if (endArrow != null) 'endArrow': endArrow!,
         if (endConnection != null) 'endConnection': endConnection!.toJson(),
@@ -2713,7 +2712,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageObjectId != null) 'pageObjectId': pageObjectId!,
         if (relativeLink != null) 'relativeLink': relativeLink!,
         if (slideIndex != null) 'slideIndex': slideIndex!,
@@ -2744,19 +2743,17 @@
       listId = _json['listId'] as core.String;
     }
     if (_json.containsKey('nestingLevel')) {
-      nestingLevel = (_json['nestingLevel'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              NestingLevel.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      nestingLevel =
+          (_json['nestingLevel'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          NestingLevel.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (listId != null) 'listId': listId!,
         if (nestingLevel != null)
           'nestingLevel': nestingLevel!
@@ -2778,7 +2775,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -2808,7 +2805,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
         if (tableRange != null) 'tableRange': tableRange!.toJson(),
       };
@@ -2829,7 +2826,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bulletStyle != null) 'bulletStyle': bulletStyle!.toJson(),
       };
 }
@@ -2854,7 +2851,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (speakerNotesObjectId != null)
           'speakerNotesObjectId': speakerNotesObjectId!,
       };
@@ -2900,7 +2897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rgbColor != null) 'rgbColor': rgbColor!.toJson(),
         if (themeColor != null) 'themeColor': themeColor!,
       };
@@ -2922,7 +2919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (opaqueColor != null) 'opaqueColor': opaqueColor!.toJson(),
       };
 }
@@ -3002,7 +2999,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dashStyle != null) 'dashStyle': dashStyle!,
         if (outlineFill != null) 'outlineFill': outlineFill!.toJson(),
         if (propertyState != null) 'propertyState': propertyState!,
@@ -3024,7 +3021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (solidFill != null) 'solidFill': solidFill!.toJson(),
       };
 }
@@ -3125,7 +3122,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (layoutProperties != null)
           'layoutProperties': layoutProperties!.toJson(),
         if (masterProperties != null)
@@ -3192,7 +3189,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (propertyState != null) 'propertyState': propertyState!,
         if (solidFill != null) 'solidFill': solidFill!.toJson(),
         if (stretchedPictureFill != null)
@@ -3313,7 +3310,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (elementGroup != null) 'elementGroup': elementGroup!.toJson(),
         if (image != null) 'image': image!.toJson(),
@@ -3360,7 +3357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageObjectId != null) 'pageObjectId': pageObjectId!,
         if (size != null) 'size': size!.toJson(),
         if (transform != null) 'transform': transform!.toJson(),
@@ -3404,7 +3401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colorScheme != null) 'colorScheme': colorScheme!.toJson(),
         if (pageBackgroundFill != null)
           'pageBackgroundFill': pageBackgroundFill!.toJson(),
@@ -3434,7 +3431,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bullet != null) 'bullet': bullet!.toJson(),
         if (style != null) 'style': style!.toJson(),
       };
@@ -3553,7 +3550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alignment != null) 'alignment': alignment!,
         if (direction != null) 'direction': direction!,
         if (indentEnd != null) 'indentEnd': indentEnd!.toJson(),
@@ -3616,7 +3613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (index != null) 'index': index!,
         if (parentObjectId != null) 'parentObjectId': parentObjectId!,
         if (type != null) 'type': type!,
@@ -3727,7 +3724,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (layouts != null)
           'layouts': layouts!.map((value) => value.toJson()).toList(),
         if (locale != null) 'locale': locale!,
@@ -3782,7 +3779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endIndex != null) 'endIndex': endIndex!,
         if (startIndex != null) 'startIndex': startIndex!,
         if (type != null) 'type': type!,
@@ -3869,7 +3866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (recolorStops != null)
           'recolorStops': recolorStops!.map((value) => value.toJson()).toList(),
@@ -3893,7 +3890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -3980,7 +3977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containsText != null) 'containsText': containsText!.toJson(),
         if (imageReplaceMethod != null)
           'imageReplaceMethod': imageReplaceMethod!,
@@ -4003,7 +4000,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (occurrencesChanged != null)
           'occurrencesChanged': occurrencesChanged!,
       };
@@ -4069,7 +4066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chartId != null) 'chartId': chartId!,
         if (containsText != null) 'containsText': containsText!.toJson(),
         if (linkingMode != null) 'linkingMode': linkingMode!,
@@ -4091,7 +4088,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (occurrencesChanged != null)
           'occurrencesChanged': occurrencesChanged!,
       };
@@ -4129,7 +4126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containsText != null) 'containsText': containsText!.toJson(),
         if (pageObjectIds != null) 'pageObjectIds': pageObjectIds!,
         if (replaceText != null) 'replaceText': replaceText!,
@@ -4149,7 +4146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (occurrencesChanged != null)
           'occurrencesChanged': occurrencesChanged!,
       };
@@ -4198,7 +4195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageObjectId != null) 'imageObjectId': imageObjectId!,
         if (imageReplaceMethod != null)
           'imageReplaceMethod': imageReplaceMethod!,
@@ -4530,7 +4527,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createImage != null) 'createImage': createImage!.toJson(),
         if (createLine != null) 'createLine': createLine!.toJson(),
         if (createParagraphBullets != null)
@@ -4624,7 +4621,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
       };
 }
@@ -4724,7 +4721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createImage != null) 'createImage': createImage!.toJson(),
         if (createLine != null) 'createLine': createLine!.toJson(),
         if (createShape != null) 'createShape': createShape!.toJson(),
@@ -4770,7 +4767,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blue != null) 'blue': blue!,
         if (green != null) 'green': green!,
         if (red != null) 'red': red!,
@@ -4886,7 +4883,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alignment != null) 'alignment': alignment!,
         if (alpha != null) 'alpha': alpha!,
         if (blurRadius != null) 'blurRadius': blurRadius!.toJson(),
@@ -5200,7 +5197,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (placeholder != null) 'placeholder': placeholder!.toJson(),
         if (shapeProperties != null)
           'shapeProperties': shapeProperties!.toJson(),
@@ -5251,7 +5248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (propertyState != null) 'propertyState': propertyState!,
         if (solidFill != null) 'solidFill': solidFill!.toJson(),
       };
@@ -5344,7 +5341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autofit != null) 'autofit': autofit!.toJson(),
         if (contentAlignment != null) 'contentAlignment': contentAlignment!,
         if (link != null) 'link': link!.toJson(),
@@ -5394,7 +5391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chartId != null) 'chartId': chartId!,
         if (contentUrl != null) 'contentUrl': contentUrl!,
         if (sheetsChartProperties != null)
@@ -5417,7 +5414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chartImageProperties != null)
           'chartImageProperties': chartImageProperties!.toJson(),
       };
@@ -5444,7 +5441,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!.toJson(),
         if (width != null) 'width': width!.toJson(),
       };
@@ -5489,7 +5486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (layoutObjectId != null) 'layoutObjectId': layoutObjectId!,
         if (masterObjectId != null) 'masterObjectId': masterObjectId!,
         if (notesPage != null) 'notesPage': notesPage!.toJson(),
@@ -5525,7 +5522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alpha != null) 'alpha': alpha!,
         if (color != null) 'color': color!.toJson(),
       };
@@ -5565,7 +5562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentUrl != null) 'contentUrl': contentUrl!,
         if (size != null) 'size': size!.toJson(),
       };
@@ -5593,7 +5590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matchCase != null) 'matchCase': matchCase!,
         if (text != null) 'text': text!,
       };
@@ -5667,7 +5664,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null) 'columns': columns!,
         if (horizontalBorderRows != null)
           'horizontalBorderRows':
@@ -5705,7 +5702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null) 'location': location!.toJson(),
         if (tableBorderProperties != null)
           'tableBorderProperties': tableBorderProperties!.toJson(),
@@ -5726,7 +5723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (solidFill != null) 'solidFill': solidFill!.toJson(),
       };
 }
@@ -5772,7 +5769,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dashStyle != null) 'dashStyle': dashStyle!,
         if (tableBorderFill != null)
           'tableBorderFill': tableBorderFill!.toJson(),
@@ -5799,7 +5796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tableBorderCells != null)
           'tableBorderCells':
               tableBorderCells!.map((value) => value.toJson()).toList(),
@@ -5846,7 +5843,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnSpan != null) 'columnSpan': columnSpan!,
         if (location != null) 'location': location!.toJson(),
         if (rowSpan != null) 'rowSpan': rowSpan!,
@@ -5898,7 +5895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (propertyState != null) 'propertyState': propertyState!,
         if (solidFill != null) 'solidFill': solidFill!.toJson(),
       };
@@ -5923,7 +5920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnIndex != null) 'columnIndex': columnIndex!,
         if (rowIndex != null) 'rowIndex': rowIndex!,
       };
@@ -5966,7 +5963,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentAlignment != null) 'contentAlignment': contentAlignment!,
         if (tableCellBackgroundFill != null)
           'tableCellBackgroundFill': tableCellBackgroundFill!.toJson(),
@@ -5987,7 +5984,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnWidth != null) 'columnWidth': columnWidth!.toJson(),
       };
 }
@@ -6024,7 +6021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnSpan != null) 'columnSpan': columnSpan!,
         if (location != null) 'location': location!.toJson(),
         if (rowSpan != null) 'rowSpan': rowSpan!,
@@ -6065,7 +6062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rowHeight != null) 'rowHeight': rowHeight!.toJson(),
         if (tableCells != null)
           'tableCells': tableCells!.map((value) => value.toJson()).toList(),
@@ -6092,7 +6089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (minRowHeight != null) 'minRowHeight': minRowHeight!.toJson(),
       };
 }
@@ -6115,14 +6112,12 @@
 
   TextContent.fromJson(core.Map _json) {
     if (_json.containsKey('lists')) {
-      lists = (_json['lists'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              List.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      lists = (_json['lists'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          List.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('textElements')) {
       textElements = (_json['textElements'] as core.List)
@@ -6132,7 +6127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lists != null)
           'lists': lists!.map((key, item) => core.MapEntry(key, item.toJson())),
         if (textElements != null)
@@ -6193,7 +6188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoText != null) 'autoText': autoText!.toJson(),
         if (endIndex != null) 'endIndex': endIndex!,
         if (paragraphMarker != null)
@@ -6224,7 +6219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (style != null) 'style': style!.toJson(),
       };
@@ -6390,7 +6385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null)
           'backgroundColor': backgroundColor!.toJson(),
         if (baselineOffset != null) 'baselineOffset': baselineOffset!,
@@ -6449,7 +6444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (type != null) 'type': type!,
       };
@@ -6486,7 +6481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentUrl != null) 'contentUrl': contentUrl!,
         if (height != null) 'height': height!,
         if (width != null) 'width': width!,
@@ -6512,7 +6507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectIds != null) 'objectIds': objectIds!,
       };
 }
@@ -6543,7 +6538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
         if (tableRange != null) 'tableRange': tableRange!.toJson(),
       };
@@ -6582,7 +6577,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (imageProperties != null)
           'imageProperties': imageProperties!.toJson(),
@@ -6620,7 +6615,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lineCategory != null) 'lineCategory': lineCategory!,
         if (objectId != null) 'objectId': objectId!,
       };
@@ -6659,7 +6654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (lineProperties != null) 'lineProperties': lineProperties!.toJson(),
         if (objectId != null) 'objectId': objectId!,
@@ -6699,7 +6694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (objectId != null) 'objectId': objectId!,
         if (title != null) 'title': title!,
@@ -6742,7 +6737,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applyMode != null) 'applyMode': applyMode!,
         if (objectId != null) 'objectId': objectId!,
         if (transform != null) 'transform': transform!.toJson(),
@@ -6787,7 +6782,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operation != null) 'operation': operation!,
         if (pageElementObjectIds != null)
           'pageElementObjectIds': pageElementObjectIds!,
@@ -6827,7 +6822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (objectId != null) 'objectId': objectId!,
         if (pageProperties != null) 'pageProperties': pageProperties!.toJson(),
@@ -6885,7 +6880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cellLocation != null) 'cellLocation': cellLocation!.toJson(),
         if (fields != null) 'fields': fields!,
         if (objectId != null) 'objectId': objectId!,
@@ -6928,7 +6923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (objectId != null) 'objectId': objectId!,
         if (shapeProperties != null)
@@ -6964,7 +6959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (insertionIndex != null) 'insertionIndex': insertionIndex!,
         if (slideObjectIds != null) 'slideObjectIds': slideObjectIds!,
       };
@@ -7034,7 +7029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (borderPosition != null) 'borderPosition': borderPosition!,
         if (fields != null) 'fields': fields!,
         if (objectId != null) 'objectId': objectId!,
@@ -7089,7 +7084,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (objectId != null) 'objectId': objectId!,
         if (tableCellProperties != null)
@@ -7145,7 +7140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnIndices != null) 'columnIndices': columnIndices!,
         if (fields != null) 'fields': fields!,
         if (objectId != null) 'objectId': objectId!,
@@ -7197,7 +7192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (objectId != null) 'objectId': objectId!,
         if (rowIndices != null) 'rowIndices': rowIndices!,
@@ -7264,7 +7259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cellLocation != null) 'cellLocation': cellLocation!.toJson(),
         if (fields != null) 'fields': fields!,
         if (objectId != null) 'objectId': objectId!,
@@ -7306,7 +7301,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null) 'fields': fields!,
         if (objectId != null) 'objectId': objectId!,
         if (videoProperties != null)
@@ -7353,7 +7348,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (source != null) 'source': source!,
         if (url != null) 'url': url!,
@@ -7419,7 +7414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoPlay != null) 'autoPlay': autoPlay!,
         if (end != null) 'end': end!,
         if (mute != null) 'mute': mute!,
@@ -7459,7 +7454,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fontFamily != null) 'fontFamily': fontFamily!,
         if (weight != null) 'weight': weight!,
       };
@@ -7478,7 +7473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (renderedText != null) 'renderedText': renderedText!,
       };
 }
@@ -7500,7 +7495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requiredRevisionId != null)
           'requiredRevisionId': requiredRevisionId!,
       };
diff --git a/generated/googleapis/lib/smartdevicemanagement/v1.dart b/generated/googleapis/lib/smartdevicemanagement/v1.dart
index e4df0be..8d76928 100644
--- a/generated/googleapis/lib/smartdevicemanagement/v1.dart
+++ b/generated/googleapis/lib/smartdevicemanagement/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -443,20 +442,19 @@
           .toList();
     }
     if (_json.containsKey('traits')) {
-      traits =
-          (_json['traits'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      traits = (_json['traits'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (parentRelations != null)
           'parentRelations':
@@ -486,17 +484,16 @@
       command = _json['command'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (command != null) 'command': command!,
         if (params != null) 'params': params!,
       };
@@ -515,17 +512,16 @@
   GoogleHomeEnterpriseSdmV1ExecuteDeviceCommandResponse.fromJson(
       core.Map _json) {
     if (_json.containsKey('results')) {
-      results =
-          (_json['results'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      results = (_json['results'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (results != null) 'results': results!,
       };
 }
@@ -553,7 +549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -585,7 +581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (rooms != null)
           'rooms': rooms!.map((value) => value.toJson()).toList(),
@@ -617,7 +613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (structures != null)
           'structures': structures!.map((value) => value.toJson()).toList(),
@@ -653,7 +649,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (parent != null) 'parent': parent!,
       };
@@ -682,17 +678,16 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('traits')) {
-      traits =
-          (_json['traits'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      traits = (_json['traits'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (traits != null) 'traits': traits!,
       };
@@ -721,17 +716,16 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('traits')) {
-      traits =
-          (_json['traits'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      traits = (_json['traits'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (traits != null) 'traits': traits!,
       };
diff --git a/generated/googleapis/lib/sourcerepo/v1.dart b/generated/googleapis/lib/sourcerepo/v1.dart
index c8fb253..fa735fa 100644
--- a/generated/googleapis/lib/sourcerepo/v1.dart
+++ b/generated/googleapis/lib/sourcerepo/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -605,7 +604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -647,7 +646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -719,7 +718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -740,7 +739,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -804,7 +803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -839,7 +838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (repos != null)
           'repos': repos!.map((value) => value.toJson()).toList(),
@@ -879,7 +878,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployKeyId != null) 'deployKeyId': deployKeyId!,
         if (url != null) 'url': url!,
         if (webhookId != null) 'webhookId': webhookId!,
@@ -940,29 +939,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1075,7 +1072,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -1111,19 +1108,17 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pubsubConfigs')) {
-      pubsubConfigs = (_json['pubsubConfigs'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              PubsubConfig.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      pubsubConfigs =
+          (_json['pubsubConfigs'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          PubsubConfig.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enablePrivateKeyCheck != null)
           'enablePrivateKeyCheck': enablePrivateKeyCheck!,
         if (name != null) 'name': name!,
@@ -1172,7 +1167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (messageFormat != null) 'messageFormat': messageFormat!,
         if (serviceAccountEmail != null)
           'serviceAccountEmail': serviceAccountEmail!,
@@ -1220,15 +1215,13 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pubsubConfigs')) {
-      pubsubConfigs = (_json['pubsubConfigs'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              PubsubConfig.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      pubsubConfigs =
+          (_json['pubsubConfigs'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          PubsubConfig.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('size')) {
       size = _json['size'] as core.String;
@@ -1238,7 +1231,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mirrorConfig != null) 'mirrorConfig': mirrorConfig!.toJson(),
         if (name != null) 'name': name!,
         if (pubsubConfigs != null)
@@ -1276,7 +1269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -1315,8 +1308,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1329,7 +1322,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1371,7 +1364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (startTime != null) 'startTime': startTime!,
         if (statusMessage != null) 'statusMessage': statusMessage!,
@@ -1387,7 +1380,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for `TestIamPermissions` method.
@@ -1409,7 +1402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1430,7 +1423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1458,7 +1451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectConfig != null) 'projectConfig': projectConfig!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -1487,7 +1480,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (repo != null) 'repo': repo!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
diff --git a/generated/googleapis/lib/spanner/v1.dart b/generated/googleapis/lib/spanner/v1.dart
index 205f2d7..681beb0 100644
--- a/generated/googleapis/lib/spanner/v1.dart
+++ b/generated/googleapis/lib/spanner/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3180,7 +3179,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (database != null) 'database': database!,
         if (encryptionInfo != null) 'encryptionInfo': encryptionInfo!.toJson(),
@@ -3229,7 +3228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backup != null) 'backup': backup!,
         if (createTime != null) 'createTime': createTime!,
         if (sourceDatabase != null) 'sourceDatabase': sourceDatabase!,
@@ -3263,7 +3262,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sessionCount != null) 'sessionCount': sessionCount!,
         if (sessionTemplate != null)
           'sessionTemplate': sessionTemplate!.toJson(),
@@ -3286,7 +3285,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (session != null)
           'session': session!.map((value) => value.toJson()).toList(),
       };
@@ -3308,7 +3307,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -3379,7 +3378,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -3423,7 +3422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childIndex != null) 'childIndex': childIndex!,
         if (type != null) 'type': type!,
         if (variable != null) 'variable': variable!,
@@ -3485,7 +3484,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mutations != null)
           'mutations': mutations!.map((value) => value.toJson()).toList(),
         if (returnCommitStats != null) 'returnCommitStats': returnCommitStats!,
@@ -3518,7 +3517,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commitStats != null) 'commitStats': commitStats!.toJson(),
         if (commitTimestamp != null) 'commitTimestamp': commitTimestamp!,
       };
@@ -3545,7 +3544,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mutationCount != null) 'mutationCount': mutationCount!,
       };
 }
@@ -3591,7 +3590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cancelTime != null) 'cancelTime': cancelTime!,
         if (database != null) 'database': database!,
         if (name != null) 'name': name!,
@@ -3612,7 +3611,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (database != null) 'database': database!,
       };
 }
@@ -3664,7 +3663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createStatement != null) 'createStatement': createStatement!,
         if (encryptionConfig != null)
           'encryptionConfig': encryptionConfig!.toJson(),
@@ -3707,7 +3706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cancelTime != null) 'cancelTime': cancelTime!,
         if (endTime != null) 'endTime': endTime!,
         if (instance != null) 'instance': instance!.toJson(),
@@ -3744,7 +3743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!.toJson(),
         if (instanceId != null) 'instanceId': instanceId!,
       };
@@ -3766,7 +3765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (session != null) 'session': session!.toJson(),
       };
 }
@@ -3884,7 +3883,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (earliestVersionTime != null)
           'earliestVersionTime': earliestVersionTime!,
@@ -3930,7 +3929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keySet != null) 'keySet': keySet!.toJson(),
         if (table != null) 'table': table!,
       };
@@ -3950,7 +3949,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Encryption configuration for a Cloud Spanner database.
@@ -3968,7 +3967,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
       };
 }
@@ -4019,7 +4018,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encryptionStatus != null)
           'encryptionStatus': encryptionStatus!.toJson(),
         if (encryptionType != null) 'encryptionType': encryptionType!,
@@ -4078,7 +4077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (seqno != null) 'seqno': seqno!,
         if (statements != null)
           'statements': statements!.map((value) => value.toJson()).toList(),
@@ -4132,7 +4131,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resultSets != null)
           'resultSets': resultSets!.map((value) => value.toJson()).toList(),
         if (status != null) 'status': status!.toJson(),
@@ -4242,23 +4241,21 @@
 
   ExecuteSqlRequest.fromJson(core.Map _json) {
     if (_json.containsKey('paramTypes')) {
-      paramTypes = (_json['paramTypes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Type.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      paramTypes =
+          (_json['paramTypes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Type.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('partitionToken')) {
       partitionToken = _json['partitionToken'] as core.String;
@@ -4285,7 +4282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (paramTypes != null)
           'paramTypes':
               paramTypes!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -4361,7 +4358,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -4396,7 +4393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (type != null) 'type': type!.toJson(),
       };
@@ -4418,7 +4415,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (statements != null) 'statements': statements!,
       };
 }
@@ -4438,7 +4435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -4465,7 +4462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -4560,13 +4557,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4579,7 +4575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!,
         if (displayName != null) 'displayName': displayName!,
         if (endpointUris != null) 'endpointUris': endpointUris!,
@@ -4624,7 +4620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (replicas != null)
@@ -4722,7 +4718,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endClosed != null) 'endClosed': endClosed!,
         if (endOpen != null) 'endOpen': endOpen!,
         if (startClosed != null) 'startClosed': startClosed!,
@@ -4779,7 +4775,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (all != null) 'all': all!,
         if (keys != null) 'keys': keys!,
         if (ranges != null)
@@ -4817,7 +4813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -4850,7 +4846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backups != null)
           'backups': backups!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4884,7 +4880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -4914,7 +4910,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (databases != null)
           'databases': databases!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4944,7 +4940,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceConfigs != null)
           'instanceConfigs':
               instanceConfigs!.map((value) => value.toJson()).toList(),
@@ -4986,7 +4982,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5016,7 +5012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -5046,7 +5042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (sessions != null)
           'sessions': sessions!.map((value) => value.toJson()).toList(),
@@ -5119,7 +5115,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delete != null) 'delete': delete!.toJson(),
         if (insert != null) 'insert': insert!.toJson(),
         if (insertOrUpdate != null) 'insertOrUpdate': insertOrUpdate!.toJson(),
@@ -5182,29 +5178,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -5242,7 +5236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (progressPercent != null) 'progressPercent': progressPercent!,
         if (startTime != null) 'startTime': startTime!,
@@ -5273,7 +5267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (progress != null) 'progress': progress!.toJson(),
       };
@@ -5382,7 +5376,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (chunkedValue != null) 'chunkedValue': chunkedValue!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (resumeToken != null) 'resumeToken': resumeToken!,
@@ -5413,7 +5407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (partitionToken != null) 'partitionToken': partitionToken!,
       };
 }
@@ -5449,7 +5443,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxPartitions != null) 'maxPartitions': maxPartitions!,
         if (partitionSizeBytes != null)
           'partitionSizeBytes': partitionSizeBytes!,
@@ -5505,23 +5499,21 @@
 
   PartitionQueryRequest.fromJson(core.Map _json) {
     if (_json.containsKey('paramTypes')) {
-      paramTypes = (_json['paramTypes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Type.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      paramTypes =
+          (_json['paramTypes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Type.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('partitionOptions')) {
       partitionOptions = PartitionOptions.fromJson(
@@ -5536,7 +5528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (paramTypes != null)
           'paramTypes':
               paramTypes!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -5610,7 +5602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null) 'columns': columns!,
         if (index != null) 'index': index!,
         if (keySet != null) 'keySet': keySet!.toJson(),
@@ -5644,7 +5636,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (partitions != null)
           'partitions': partitions!.map((value) => value.toJson()).toList(),
         if (transaction != null) 'transaction': transaction!.toJson(),
@@ -5659,7 +5651,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Node information for nodes appearing in a QueryPlan.plan_nodes.
@@ -5727,14 +5719,13 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('executionStats')) {
-      executionStats = (_json['executionStats'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      executionStats =
+          (_json['executionStats'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('index')) {
       index = _json['index'] as core.int;
@@ -5743,13 +5734,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('shortRepresentation')) {
       shortRepresentation = ShortRepresentation.fromJson(
@@ -5757,7 +5747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childLinks != null)
           'childLinks': childLinks!.map((value) => value.toJson()).toList(),
         if (displayName != null) 'displayName': displayName!,
@@ -5865,7 +5855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -5900,7 +5890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (optimizerVersion != null) 'optimizerVersion': optimizerVersion!,
       };
 }
@@ -5924,7 +5914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (planNodes != null)
           'planNodes': planNodes!.map((value) => value.toJson()).toList(),
       };
@@ -6005,7 +5995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exactStaleness != null) 'exactStaleness': exactStaleness!,
         if (maxStaleness != null) 'maxStaleness': maxStaleness!,
         if (minReadTimestamp != null) 'minReadTimestamp': minReadTimestamp!,
@@ -6124,7 +6114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null) 'columns': columns!,
         if (index != null) 'index': index!,
         if (keySet != null) 'keySet': keySet!.toJson(),
@@ -6146,7 +6136,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 class ReplicaInfo {
@@ -6192,7 +6182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultLeaderLocation != null)
           'defaultLeaderLocation': defaultLeaderLocation!,
         if (location != null) 'location': location!,
@@ -6235,7 +6225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encryptionType != null) 'encryptionType': encryptionType!,
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
       };
@@ -6309,7 +6299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupInfo != null) 'backupInfo': backupInfo!.toJson(),
         if (cancelTime != null) 'cancelTime': cancelTime!,
         if (name != null) 'name': name!,
@@ -6361,7 +6351,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backup != null) 'backup': backup!,
         if (databaseId != null) 'databaseId': databaseId!,
         if (encryptionConfig != null)
@@ -6394,7 +6384,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupInfo != null) 'backupInfo': backupInfo!.toJson(),
         if (sourceType != null) 'sourceType': sourceType!,
       };
@@ -6445,7 +6435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (rows != null) 'rows': rows!,
         if (stats != null) 'stats': stats!.toJson(),
@@ -6479,7 +6469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rowType != null) 'rowType': rowType!.toJson(),
         if (transaction != null) 'transaction': transaction!.toJson(),
       };
@@ -6515,14 +6505,13 @@
           _json['queryPlan'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queryStats')) {
-      queryStats = (_json['queryStats'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      queryStats =
+          (_json['queryStats'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('rowCountExact')) {
       rowCountExact = _json['rowCountExact'] as core.String;
@@ -6532,7 +6521,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queryPlan != null) 'queryPlan': queryPlan!.toJson(),
         if (queryStats != null) 'queryStats': queryStats!,
         if (rowCountExact != null) 'rowCountExact': rowCountExact!,
@@ -6563,7 +6552,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (transactionId != null) 'transactionId': transactionId!,
       };
 }
@@ -6609,20 +6598,19 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (approximateLastUseTime != null)
           'approximateLastUseTime': approximateLastUseTime!,
         if (createTime != null) 'createTime': createTime!,
@@ -6649,7 +6637,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -6677,16 +6665,16 @@
     }
     if (_json.containsKey('subqueries')) {
       subqueries =
-          (_json['subqueries'] as core.Map).cast<core.String, core.int>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.int,
-                ),
-              );
+          (_json['subqueries'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.int,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (subqueries != null) 'subqueries': subqueries!,
       };
@@ -6726,30 +6714,28 @@
 
   Statement.fromJson(core.Map _json) {
     if (_json.containsKey('paramTypes')) {
-      paramTypes = (_json['paramTypes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Type.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      paramTypes =
+          (_json['paramTypes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Type.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sql')) {
       sql = _json['sql'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (paramTypes != null)
           'paramTypes':
               paramTypes!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -6791,8 +6777,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -6805,7 +6791,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -6834,7 +6820,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fields != null)
           'fields': fields!.map((value) => value.toJson()).toList(),
       };
@@ -6858,7 +6844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -6879,7 +6865,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -6919,7 +6905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (readTimestamp != null) 'readTimestamp': readTimestamp!,
       };
@@ -7131,7 +7117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (partitionedDml != null) 'partitionedDml': partitionedDml!.toJson(),
         if (readOnly != null) 'readOnly': readOnly!.toJson(),
         if (readWrite != null) 'readWrite': readWrite!.toJson(),
@@ -7180,7 +7166,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (begin != null) 'begin': begin!.toJson(),
         if (id != null) 'id': id!,
         if (singleUse != null) 'singleUse': singleUse!.toJson(),
@@ -7244,7 +7230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arrayElementType != null)
           'arrayElementType': arrayElementType!.toJson(),
         if (code != null) 'code': code!,
@@ -7297,7 +7283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commitTimestamps != null) 'commitTimestamps': commitTimestamps!,
         if (database != null) 'database': database!,
         if (statements != null) 'statements': statements!,
@@ -7352,7 +7338,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operationId != null) 'operationId': operationId!,
         if (statements != null) 'statements': statements!,
       };
@@ -7393,7 +7379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cancelTime != null) 'cancelTime': cancelTime!,
         if (endTime != null) 'endTime': endTime!,
         if (instance != null) 'instance': instance!.toJson(),
@@ -7431,7 +7417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldMask != null) 'fieldMask': fieldMask!,
         if (instance != null) 'instance': instance!.toJson(),
       };
@@ -7483,7 +7469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null) 'columns': columns!,
         if (table != null) 'table': table!,
         if (values != null) 'values': values!,
diff --git a/generated/googleapis/lib/speech/v1.dart b/generated/googleapis/lib/speech/v1.dart
index c409fe2..fcfc565 100644
--- a/generated/googleapis/lib/speech/v1.dart
+++ b/generated/googleapis/lib/speech/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -266,7 +265,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -314,7 +313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastUpdateTime != null) 'lastUpdateTime': lastUpdateTime!,
         if (progressPercent != null) 'progressPercent': progressPercent!,
         if (startTime != null) 'startTime': startTime!,
@@ -349,7 +348,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!.toJson(),
         if (config != null) 'config': config!.toJson(),
       };
@@ -379,7 +378,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
       };
@@ -439,29 +438,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -509,7 +506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (uri != null) 'uri': uri!,
       };
@@ -724,7 +721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioChannelCount != null) 'audioChannelCount': audioChannelCount!,
         if (diarizationConfig != null)
           'diarizationConfig': diarizationConfig!.toJson(),
@@ -857,7 +854,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioTopic != null) 'audioTopic': audioTopic!,
         if (industryNaicsCodeOfAudio != null)
           'industryNaicsCodeOfAudio': industryNaicsCodeOfAudio!,
@@ -899,7 +896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!.toJson(),
         if (config != null) 'config': config!.toJson(),
       };
@@ -926,7 +923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
       };
@@ -975,7 +972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableSpeakerDiarization != null)
           'enableSpeakerDiarization': enableSpeakerDiarization!,
         if (maxSpeakerCount != null) 'maxSpeakerCount': maxSpeakerCount!,
@@ -1012,7 +1009,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (phrases != null) 'phrases': phrases!,
       };
 }
@@ -1055,7 +1052,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (transcript != null) 'transcript': transcript!,
         if (words != null)
@@ -1093,7 +1090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternatives != null)
           'alternatives': alternatives!.map((value) => value.toJson()).toList(),
         if (channelTag != null) 'channelTag': channelTag!,
@@ -1133,8 +1130,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1147,7 +1144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1202,7 +1199,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (speakerTag != null) 'speakerTag': speakerTag!,
         if (startTime != null) 'startTime': startTime!,
diff --git a/generated/googleapis/lib/storage/v1.dart b/generated/googleapis/lib/storage/v1.dart
index ebe23f6..34feef1 100644
--- a/generated/googleapis/lib/storage/v1.dart
+++ b/generated/googleapis/lib/storage/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3858,7 +3857,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requesterPays != null) 'requesterPays': requesterPays!,
       };
 }
@@ -3905,7 +3904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxAgeSeconds != null) 'maxAgeSeconds': maxAgeSeconds!,
         if (method != null) 'method': method!,
         if (origin != null) 'origin': origin!,
@@ -3927,7 +3926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultKmsKeyName != null) 'defaultKmsKeyName': defaultKmsKeyName!,
       };
 }
@@ -3960,7 +3959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
         if (lockedTime != null) 'lockedTime': lockedTime!.toIso8601String(),
       };
@@ -3990,7 +3989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
         if (lockedTime != null) 'lockedTime': lockedTime!.toIso8601String(),
       };
@@ -4032,7 +4031,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketPolicyOnly != null)
           'bucketPolicyOnly': bucketPolicyOnly!.toJson(),
         if (publicAccessPrevention != null)
@@ -4065,7 +4064,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (storageClass != null) 'storageClass': storageClass!,
         if (type != null) 'type': type!,
       };
@@ -4185,7 +4184,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (age != null) 'age': age!,
         if (createdBefore != null)
           'createdBefore':
@@ -4228,7 +4227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!.toJson(),
         if (condition != null) 'condition': condition!.toJson(),
       };
@@ -4253,7 +4252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rule != null) 'rule': rule!.map((value) => value.toJson()).toList(),
       };
 }
@@ -4278,7 +4277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logBucket != null) 'logBucket': logBucket!,
         if (logObjectPrefix != null) 'logObjectPrefix': logObjectPrefix!,
       };
@@ -4305,7 +4304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!,
         if (entityId != null) 'entityId': entityId!,
       };
@@ -4353,7 +4352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (effectiveTime != null)
           'effectiveTime': effectiveTime!.toIso8601String(),
         if (isLocked != null) 'isLocked': isLocked!,
@@ -4374,7 +4373,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -4408,7 +4407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mainPageSuffix != null) 'mainPageSuffix': mainPageSuffix!,
         if (notFoundPage != null) 'notFoundPage': notFoundPage!,
       };
@@ -4597,13 +4596,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lifecycle')) {
       lifecycle = BucketLifecycle.fromJson(
@@ -4666,7 +4664,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acl != null) 'acl': acl!.map((value) => value.toJson()).toList(),
         if (billing != null) 'billing': billing!.toJson(),
         if (cors != null) 'cors': cors!.map((value) => value.toJson()).toList(),
@@ -4722,7 +4720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectNumber != null) 'projectNumber': projectNumber!,
         if (team != null) 'team': team!,
       };
@@ -4820,7 +4818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucket != null) 'bucket': bucket!,
         if (domain != null) 'domain': domain!,
         if (email != null) 'email': email!,
@@ -4860,7 +4858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -4900,7 +4898,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -4969,13 +4967,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('payload')) {
       payload = _json['payload'] as core.bool;
@@ -4994,7 +4991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (expiration != null) 'expiration': expiration!,
         if (id != null) 'id': id!,
@@ -5025,7 +5022,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ifGenerationMatch != null) 'ifGenerationMatch': ifGenerationMatch!,
       };
 }
@@ -5059,7 +5056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (generation != null) 'generation': generation!,
         if (name != null) 'name': name!,
         if (objectPreconditions != null)
@@ -5097,7 +5094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!.toJson(),
         if (kind != null) 'kind': kind!,
         if (sourceObjects != null)
@@ -5151,7 +5148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -5188,7 +5185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (secret != null) 'secret': secret!,
@@ -5266,7 +5263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessId != null) 'accessId': accessId!,
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -5314,7 +5311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5364,14 +5361,14 @@
 
   Notification.fromJson(core.Map _json) {
     if (_json.containsKey('custom_attributes')) {
-      customAttributes = (_json['custom_attributes'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      customAttributes =
+          (_json['custom_attributes'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -5401,7 +5398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customAttributes != null) 'custom_attributes': customAttributes!,
         if (etag != null) 'etag': etag!,
         if (eventTypes != null) 'event_types': eventTypes!,
@@ -5438,7 +5435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5465,7 +5462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encryptionAlgorithm != null)
           'encryptionAlgorithm': encryptionAlgorithm!,
         if (keySha256 != null) 'keySha256': keySha256!,
@@ -5493,7 +5490,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!,
         if (entityId != null) 'entityId': entityId!,
       };
@@ -5724,13 +5721,12 @@
       mediaLink = _json['mediaLink'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('metageneration')) {
       metageneration = _json['metageneration'] as core.String;
@@ -5773,7 +5769,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acl != null) 'acl': acl!.map((value) => value.toJson()).toList(),
         if (bucket != null) 'bucket': bucket!,
         if (cacheControl != null) 'cacheControl': cacheControl!,
@@ -5832,7 +5828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectNumber != null) 'projectNumber': projectNumber!,
         if (team != null) 'team': team!,
       };
@@ -5942,7 +5938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucket != null) 'bucket': bucket!,
         if (domain != null) 'domain': domain!,
         if (email != null) 'email': email!,
@@ -5984,7 +5980,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -6033,7 +6029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -6120,7 +6116,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -6184,7 +6180,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -6250,7 +6246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (kind != null) 'kind': kind!,
         if (objectSize != null) 'objectSize': objectSize!,
@@ -6282,7 +6278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emailAddress != null) 'email_address': emailAddress!,
         if (kind != null) 'kind': kind!,
       };
@@ -6327,7 +6323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (permissions != null) 'permissions': permissions!,
       };
diff --git a/generated/googleapis/lib/storagetransfer/v1.dart b/generated/googleapis/lib/storagetransfer/v1.dart
index c681471..03a6c12 100644
--- a/generated/googleapis/lib/storagetransfer/v1.dart
+++ b/generated/googleapis/lib/storagetransfer/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -614,7 +613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessKeyId != null) 'accessKeyId': accessKeyId!,
         if (secretAccessKey != null) 'secretAccessKey': secretAccessKey!,
       };
@@ -663,7 +662,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (awsAccessKey != null) 'awsAccessKey': awsAccessKey!.toJson(),
         if (bucketName != null) 'bucketName': bucketName!,
         if (path != null) 'path': path!,
@@ -722,7 +721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (azureCredentials != null)
           'azureCredentials': azureCredentials!.toJson(),
         if (container != null) 'container': container!,
@@ -752,7 +751,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sasToken != null) 'sasToken': sasToken!,
       };
 }
@@ -765,7 +764,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a whole or partial calendar date, such as a birthday.
@@ -808,7 +807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -829,7 +828,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An entry describing an error that has occurred.
@@ -856,7 +855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorDetails != null) 'errorDetails': errorDetails!,
         if (url != null) 'url': url!,
       };
@@ -976,7 +975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorCode != null) 'errorCode': errorCode!,
         if (errorCount != null) 'errorCount': errorCount!,
         if (errorLogEntries != null)
@@ -1015,7 +1014,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketName != null) 'bucketName': bucketName!,
         if (path != null) 'path': path!,
       };
@@ -1034,7 +1033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountEmail != null) 'accountEmail': accountEmail!,
       };
 }
@@ -1081,7 +1080,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (listUrl != null) 'listUrl': listUrl!,
       };
 }
@@ -1108,7 +1107,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1137,7 +1136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (transferJobs != null)
           'transferJobs': transferJobs!.map((value) => value.toJson()).toList(),
@@ -1197,7 +1196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventTypes != null) 'eventTypes': eventTypes!,
         if (payloadFormat != null) 'payloadFormat': payloadFormat!,
         if (pubsubTopic != null) 'pubsubTopic': pubsubTopic!,
@@ -1317,7 +1316,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludePrefixes != null) 'excludePrefixes': excludePrefixes!,
         if (includePrefixes != null) 'includePrefixes': includePrefixes!,
         if (lastModifiedBefore != null)
@@ -1381,29 +1380,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1420,7 +1417,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request passed to ResumeTransferOperation.
@@ -1431,7 +1428,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request passed to RunTransferJob.
@@ -1450,7 +1447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectId != null) 'projectId': projectId!,
       };
 }
@@ -1536,7 +1533,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTimeOfDay != null) 'endTimeOfDay': endTimeOfDay!.toJson(),
         if (repeatInterval != null) 'repeatInterval': repeatInterval!,
         if (scheduleEndDate != null)
@@ -1580,8 +1577,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1594,7 +1591,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1646,7 +1643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
@@ -1771,7 +1768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bytesCopiedToSink != null) 'bytesCopiedToSink': bytesCopiedToSink!,
         if (bytesDeletedFromSink != null)
           'bytesDeletedFromSink': bytesDeletedFromSink!,
@@ -1918,7 +1915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (deletionTime != null) 'deletionTime': deletionTime!,
         if (description != null) 'description': description!,
@@ -2018,7 +2015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (counters != null) 'counters': counters!.toJson(),
         if (endTime != null) 'endTime': endTime!,
         if (errorBreakdowns != null)
@@ -2074,7 +2071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deleteObjectsFromSourceAfterTransfer != null)
           'deleteObjectsFromSourceAfterTransfer':
               deleteObjectsFromSourceAfterTransfer!,
@@ -2149,7 +2146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (awsS3DataSource != null)
           'awsS3DataSource': awsS3DataSource!.toJson(),
         if (azureBlobStorageDataSource != null)
@@ -2208,7 +2205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectId != null) 'projectId': projectId!,
         if (transferJob != null) 'transferJob': transferJob!.toJson(),
         if (updateTransferJobFieldMask != null)
diff --git a/generated/googleapis/lib/streetviewpublish/v1.dart b/generated/googleapis/lib/streetviewpublish/v1.dart
index 9c5d6cc..3584cd5 100644
--- a/generated/googleapis/lib/streetviewpublish/v1.dart
+++ b/generated/googleapis/lib/streetviewpublish/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -577,7 +576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (photoIds != null) 'photoIds': photoIds!,
       };
 }
@@ -599,7 +598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (status != null)
           'status': status!.map((value) => value.toJson()).toList(),
       };
@@ -622,7 +621,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
       };
@@ -648,7 +647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (updatePhotoRequests != null)
           'updatePhotoRequests':
               updatePhotoRequests!.map((value) => value.toJson()).toList(),
@@ -672,7 +671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
       };
@@ -695,7 +694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (target != null) 'target': target!.toJson(),
       };
 }
@@ -714,7 +713,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An object that represents a latitude/longitude pair.
@@ -744,7 +743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
@@ -778,7 +777,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (number != null) 'number': number!,
       };
@@ -809,7 +808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (photos != null)
           'photos': photos!.map((value) => value.toJson()).toList(),
@@ -870,29 +869,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1033,7 +1030,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (captureTime != null) 'captureTime': captureTime!,
         if (connections != null)
           'connections': connections!.map((value) => value.toJson()).toList(),
@@ -1067,7 +1064,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
       };
 }
@@ -1095,7 +1092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (photo != null) 'photo': photo!.toJson(),
         if (status != null) 'status': status!.toJson(),
       };
@@ -1132,7 +1129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (name != null) 'name': name!,
         if (placeId != null) 'placeId': placeId!,
@@ -1214,7 +1211,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accuracyMeters != null) 'accuracyMeters': accuracyMeters!,
         if (altitude != null) 'altitude': altitude!,
         if (heading != null) 'heading': heading!,
@@ -1258,8 +1255,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1272,7 +1269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1316,7 +1313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (photo != null) 'photo': photo!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -1338,7 +1335,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uploadUrl != null) 'uploadUrl': uploadUrl!,
       };
 }
diff --git a/generated/googleapis/lib/sts/v1.dart b/generated/googleapis/lib/sts/v1.dart
index 80c4175..a0637ea 100644
--- a/generated/googleapis/lib/sts/v1.dart
+++ b/generated/googleapis/lib/sts/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -245,7 +244,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audience != null) 'audience': audience!,
         if (grantType != null) 'grantType': grantType!,
         if (options != null) 'options': options!,
@@ -302,7 +301,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessToken != null) 'access_token': accessToken!,
         if (expiresIn != null) 'expires_in': expiresIn!,
         if (issuedTokenType != null) 'issued_token_type': issuedTokenType!,
diff --git a/generated/googleapis/lib/tagmanager/v1.dart b/generated/googleapis/lib/tagmanager/v1.dart
index ea6b5b6..33aa921 100644
--- a/generated/googleapis/lib/tagmanager/v1.dart
+++ b/generated/googleapis/lib/tagmanager/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2469,7 +2468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (name != null) 'name': name!,
@@ -2496,7 +2495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permission != null) 'permission': permission!,
       };
 }
@@ -2548,7 +2547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameter != null)
           'parameter': parameter!.map((value) => value.toJson()).toList(),
         if (type != null) 'type': type!,
@@ -2664,7 +2663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (domainName != null) 'domainName': domainName!,
@@ -2708,7 +2707,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerId != null) 'containerId': containerId!,
         if (permission != null) 'permission': permission!,
       };
@@ -2830,7 +2829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (container != null) 'container': container!.toJson(),
         if (containerId != null) 'containerId': containerId!,
@@ -2920,7 +2919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (containerVersionId != null)
@@ -2961,7 +2960,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (notes != null) 'notes': notes!,
         if (quickPreview != null) 'quickPreview': quickPreview!,
@@ -2988,7 +2987,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compilerError != null) 'compilerError': compilerError!,
         if (containerVersion != null)
           'containerVersion': containerVersion!.toJson(),
@@ -3101,7 +3100,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (authorizationCode != null) 'authorizationCode': authorizationCode!,
         if (authorizationTimestampMs != null)
@@ -3161,7 +3160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
@@ -3204,7 +3203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag != null) 'tag': tag!.map((value) => value.toJson()).toList(),
         if (trigger != null)
           'trigger': trigger!.map((value) => value.toJson()).toList(),
@@ -3229,7 +3228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userAccess != null)
           'userAccess': userAccess!.map((value) => value.toJson()).toList(),
       };
@@ -3251,7 +3250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accounts != null)
           'accounts': accounts!.map((value) => value.toJson()).toList(),
       };
@@ -3283,7 +3282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerVersion != null)
           'containerVersion':
               containerVersion!.map((value) => value.toJson()).toList(),
@@ -3309,7 +3308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containers != null)
           'containers': containers!.map((value) => value.toJson()).toList(),
       };
@@ -3331,7 +3330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environments != null)
           'environments': environments!.map((value) => value.toJson()).toList(),
       };
@@ -3353,7 +3352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folders != null)
           'folders': folders!.map((value) => value.toJson()).toList(),
       };
@@ -3375,7 +3374,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tags != null) 'tags': tags!.map((value) => value.toJson()).toList(),
       };
 }
@@ -3396,7 +3395,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (triggers != null)
           'triggers': triggers!.map((value) => value.toJson()).toList(),
       };
@@ -3418,7 +3417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (variables != null)
           'variables': variables!.map((value) => value.toJson()).toList(),
       };
@@ -3548,7 +3547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (disablingRuleId != null) 'disablingRuleId': disablingRuleId!,
@@ -3662,7 +3661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (list != null) 'list': list!.map((value) => value.toJson()).toList(),
         if (map != null) 'map': map!.map((value) => value.toJson()).toList(),
@@ -3691,7 +3690,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compilerError != null) 'compilerError': compilerError!,
         if (containerVersion != null)
           'containerVersion': containerVersion!.toJson(),
@@ -3761,7 +3760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (condition != null)
           'condition': condition!.map((value) => value.toJson()).toList(),
@@ -3794,7 +3793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stopOnSetupFailure != null)
           'stopOnSetupFailure': stopOnSetupFailure!,
         if (tagName != null) 'tagName': tagName!,
@@ -4013,7 +4012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (blockingRuleId != null) 'blockingRuleId': blockingRuleId!,
         if (blockingTriggerId != null) 'blockingTriggerId': blockingTriggerId!,
@@ -4062,7 +4061,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stopTeardownOnFailure != null)
           'stopTeardownOnFailure': stopTeardownOnFailure!,
         if (tagName != null) 'tagName': tagName!,
@@ -4398,7 +4397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (autoEventFilter != null)
           'autoEventFilter':
@@ -4500,7 +4499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountAccess != null) 'accountAccess': accountAccess!.toJson(),
         if (accountId != null) 'accountId': accountId!,
         if (containerAccess != null)
@@ -4635,7 +4634,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (disablingTriggerId != null)
diff --git a/generated/googleapis/lib/tagmanager/v2.dart b/generated/googleapis/lib/tagmanager/v2.dart
index 58e9b08..4120b9f 100644
--- a/generated/googleapis/lib/tagmanager/v2.dart
+++ b/generated/googleapis/lib/tagmanager/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3776,7 +3775,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
         if (name != null) 'name': name!,
@@ -3808,7 +3807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permission != null) 'permission': permission!,
       };
 }
@@ -3976,7 +3975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (name != null) 'name': name!,
@@ -4090,7 +4089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (clientId != null) 'clientId': clientId!,
         if (containerId != null) 'containerId': containerId!,
@@ -4157,7 +4156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameter != null)
           'parameter': parameter!.map((value) => value.toJson()).toList(),
         if (type != null) 'type': type!,
@@ -4251,7 +4250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (domainName != null) 'domainName': domainName!,
@@ -4297,7 +4296,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerId != null) 'containerId': containerId!,
         if (permission != null) 'permission': permission!,
       };
@@ -4449,7 +4448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (builtInVariable != null)
           'builtInVariable':
@@ -4571,7 +4570,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (containerVersionId != null)
@@ -4606,7 +4605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (builtInVariable != null)
           'builtInVariable':
               builtInVariable!.map((value) => value.toJson()).toList(),
@@ -4632,7 +4631,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (notes != null) 'notes': notes!,
       };
@@ -4675,7 +4674,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compilerError != null) 'compilerError': compilerError!,
         if (containerVersion != null)
           'containerVersion': containerVersion!.toJson(),
@@ -4754,7 +4753,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
@@ -4823,7 +4822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changeStatus != null) 'changeStatus': changeStatus!,
         if (client != null) 'client': client!.toJson(),
         if (folder != null) 'folder': folder!.toJson(),
@@ -4956,7 +4955,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (authorizationCode != null) 'authorizationCode': authorizationCode!,
         if (authorizationTimestamp != null)
@@ -5046,7 +5045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (fingerprint != null) 'fingerprint': fingerprint!,
@@ -5099,7 +5098,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tag != null) 'tag': tag!.map((value) => value.toJson()).toList(),
         if (trigger != null)
@@ -5157,7 +5156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (host != null) 'host': host!,
         if (isModified != null) 'isModified': isModified!,
         if (owner != null) 'owner': owner!,
@@ -5193,7 +5192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mergeConflict != null)
           'mergeConflict':
               mergeConflict!.map((value) => value.toJson()).toList(),
@@ -5225,7 +5224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null)
           'account': account!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5255,7 +5254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerVersionHeader != null)
           'containerVersionHeader':
               containerVersionHeader!.map((value) => value.toJson()).toList(),
@@ -5285,7 +5284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (container != null)
           'container': container!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5314,7 +5313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (builtInVariable != null)
           'builtInVariable':
               builtInVariable!.map((value) => value.toJson()).toList(),
@@ -5344,7 +5343,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null)
           'environment': environment!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5373,7 +5372,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folder != null)
           'folder': folder!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5402,7 +5401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tag != null) 'tag': tag!.map((value) => value.toJson()).toList(),
       };
@@ -5429,7 +5428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (template != null)
           'template': template!.map((value) => value.toJson()).toList(),
@@ -5458,7 +5457,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (trigger != null)
           'trigger': trigger!.map((value) => value.toJson()).toList(),
@@ -5487,7 +5486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (userPermission != null)
           'userPermission':
@@ -5517,7 +5516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (variable != null)
           'variable': variable!.map((value) => value.toJson()).toList(),
@@ -5546,7 +5545,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (workspace != null)
           'workspace': workspace!.map((value) => value.toJson()).toList(),
@@ -5574,7 +5573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (zone != null) 'zone': zone!.map((value) => value.toJson()).toList(),
       };
@@ -5609,7 +5608,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entityInBaseVersion != null)
           'entityInBaseVersion': entityInBaseVersion!.toJson(),
         if (entityInWorkspace != null)
@@ -5715,7 +5714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (list != null) 'list': list!.map((value) => value.toJson()).toList(),
         if (map != null) 'map': map!.map((value) => value.toJson()).toList(),
@@ -5744,7 +5743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compilerError != null) 'compilerError': compilerError!,
         if (containerVersion != null)
           'containerVersion': containerVersion!.toJson(),
@@ -5779,7 +5778,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compilerError != null) 'compilerError': compilerError!,
         if (containerVersion != null)
           'containerVersion': containerVersion!.toJson(),
@@ -5800,7 +5799,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
       };
 }
@@ -5823,7 +5822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (folder != null) 'folder': folder!.toJson(),
       };
 }
@@ -5845,7 +5844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag != null) 'tag': tag!.toJson(),
       };
 }
@@ -5868,7 +5867,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (template != null) 'template': template!.toJson(),
       };
 }
@@ -5891,7 +5890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (trigger != null) 'trigger': trigger!.toJson(),
       };
 }
@@ -5914,7 +5913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (variable != null) 'variable': variable!.toJson(),
       };
 }
@@ -5937,7 +5936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (zone != null) 'zone': zone!.toJson(),
       };
 }
@@ -5965,7 +5964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stopOnSetupFailure != null)
           'stopOnSetupFailure': stopOnSetupFailure!,
         if (tagName != null) 'tagName': tagName!,
@@ -5991,7 +5990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mergeConflict != null) 'mergeConflict': mergeConflict!,
         if (syncError != null) 'syncError': syncError!,
       };
@@ -6024,7 +6023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mergeConflict != null)
           'mergeConflict':
               mergeConflict!.map((value) => value.toJson()).toList(),
@@ -6287,7 +6286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (blockingRuleId != null) 'blockingRuleId': blockingRuleId!,
         if (blockingTriggerId != null) 'blockingTriggerId': blockingTriggerId!,
@@ -6345,7 +6344,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stopTeardownOnFailure != null)
           'stopTeardownOnFailure': stopTeardownOnFailure!,
         if (tagName != null) 'tagName': tagName!,
@@ -6721,7 +6720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (autoEventFilter != null)
           'autoEventFilter':
@@ -6827,7 +6826,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountAccess != null) 'accountAccess': accountAccess!.toJson(),
         if (accountId != null) 'accountId': accountId!,
         if (containerAccess != null)
@@ -6987,7 +6986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (disablingTriggerId != null)
@@ -7056,7 +7055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseConversionType != null)
           'caseConversionType': caseConversionType!,
         if (convertFalseToValue != null)
@@ -7133,7 +7132,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (containerId != null) 'containerId': containerId!,
         if (description != null) 'description': description!,
@@ -7231,7 +7230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (boundary != null) 'boundary': boundary!.toJson(),
         if (childContainer != null)
@@ -7278,7 +7277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null)
           'condition': condition!.map((value) => value.toJson()).toList(),
         if (customEvaluationTriggerId != null)
@@ -7305,7 +7304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nickname != null) 'nickname': nickname!,
         if (publicId != null) 'publicId': publicId!,
       };
@@ -7332,7 +7331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enable != null) 'enable': enable!,
         if (whitelistedTypeId != null) 'whitelistedTypeId': whitelistedTypeId!,
       };
diff --git a/generated/googleapis/lib/tasks/v1.dart b/generated/googleapis/lib/tasks/v1.dart
index e89daca..0c70598 100644
--- a/generated/googleapis/lib/tasks/v1.dart
+++ b/generated/googleapis/lib/tasks/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -727,7 +726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (link != null) 'link': link!,
         if (type != null) 'type': type!,
@@ -865,7 +864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completed != null) 'completed': completed!,
         if (deleted != null) 'deleted': deleted!,
         if (due != null) 'due': due!,
@@ -931,7 +930,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -976,7 +975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
@@ -1020,7 +1019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
diff --git a/generated/googleapis/lib/testing/v1.dart b/generated/googleapis/lib/testing/v1.dart
index 9986e6f..0d5228c 100644
--- a/generated/googleapis/lib/testing/v1.dart
+++ b/generated/googleapis/lib/testing/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -350,7 +349,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (googleAuto != null) 'googleAuto': googleAuto!.toJson(),
       };
 }
@@ -402,7 +401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidModelId != null) 'androidModelId': androidModelId!,
         if (androidVersionId != null) 'androidVersionId': androidVersionId!,
         if (locale != null) 'locale': locale!,
@@ -442,7 +441,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (models != null)
           'models': models!.map((value) => value.toJson()).toList(),
         if (runtimeConfiguration != null)
@@ -470,7 +469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidDevices != null)
           'androidDevices':
               androidDevices!.map((value) => value.toJson()).toList(),
@@ -578,7 +577,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appApk != null) 'appApk': appApk!.toJson(),
         if (appBundle != null) 'appBundle': appBundle!.toJson(),
         if (appPackageId != null) 'appPackageId': appPackageId!,
@@ -652,7 +651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidModelIds != null) 'androidModelIds': androidModelIds!,
         if (androidVersionIds != null) 'androidVersionIds': androidVersionIds!,
         if (locales != null) 'locales': locales!,
@@ -800,7 +799,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (brand != null) 'brand': brand!,
         if (codename != null) 'codename': codename!,
         if (form != null) 'form': form!,
@@ -909,7 +908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appApk != null) 'appApk': appApk!.toJson(),
         if (appBundle != null) 'appBundle': appBundle!.toJson(),
         if (appInitialActivity != null)
@@ -952,7 +951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locales != null)
           'locales': locales!.map((value) => value.toJson()).toList(),
         if (orientations != null)
@@ -1016,7 +1015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appApk != null) 'appApk': appApk!.toJson(),
         if (appBundle != null) 'appBundle': appBundle!.toJson(),
         if (appPackageId != null) 'appPackageId': appPackageId!,
@@ -1088,7 +1087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiLevel != null) 'apiLevel': apiLevel!,
         if (codeName != null) 'codeName': codeName!,
         if (distribution != null) 'distribution': distribution!.toJson(),
@@ -1121,7 +1120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null) 'location': location!.toJson(),
         if (packageName != null) 'packageName': packageName!,
       };
@@ -1141,7 +1140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apkManifest != null) 'apkManifest': apkManifest!.toJson(),
       };
 }
@@ -1200,7 +1199,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (applicationLabel != null) 'applicationLabel': applicationLabel!,
         if (intentFilters != null)
           'intentFilters':
@@ -1231,7 +1230,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bundleLocation != null) 'bundleLocation': bundleLocation!.toJson(),
       };
 }
@@ -1279,7 +1278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (testState != null) 'testState': testState!,
       };
 }
@@ -1308,7 +1307,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientInfoDetails != null)
           'clientInfoDetails':
               clientInfoDetails!.map((value) => value.toJson()).toList(),
@@ -1342,7 +1341,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -1388,7 +1387,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -1416,7 +1415,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (obbFile != null) 'obbFile': obbFile!.toJson(),
         if (regularFile != null) 'regularFile': regularFile!.toJson(),
       };
@@ -1455,7 +1454,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addedDate != null) 'addedDate': addedDate!.toJson(),
         if (block != null) 'block': block!,
         if (form != null) 'form': form!,
@@ -1478,7 +1477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipBlocks != null)
           'ipBlocks': ipBlocks!.map((value) => value.toJson()).toList(),
       };
@@ -1508,7 +1507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (marketShare != null) 'marketShare': marketShare!,
         if (measurementTime != null) 'measurementTime': measurementTime!,
       };
@@ -1535,7 +1534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidDevice != null) 'androidDevice': androidDevice!.toJson(),
         if (iosDevice != null) 'iosDevice': iosDevice!.toJson(),
       };
@@ -1570,7 +1569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidDeviceList != null)
           'androidDeviceList': androidDeviceList!.toJson(),
         if (androidMatrix != null) 'androidMatrix': androidMatrix!.toJson(),
@@ -1597,7 +1596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -1619,7 +1618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsPath != null) 'gcsPath': gcsPath!,
       };
 }
@@ -1638,7 +1637,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apkDetail != null) 'apkDetail': apkDetail!.toJson(),
       };
 }
@@ -1657,7 +1656,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A storage location within Google cloud storage (GCS).
@@ -1679,7 +1678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsPath != null) 'gcsPath': gcsPath!,
       };
 }
@@ -1715,7 +1714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionNames != null) 'actionNames': actionNames!,
         if (categoryNames != null) 'categoryNames': categoryNames!,
         if (mimeType != null) 'mimeType': mimeType!,
@@ -1769,7 +1768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iosModelId != null) 'iosModelId': iosModelId!,
         if (iosVersionId != null) 'iosVersionId': iosVersionId!,
         if (locale != null) 'locale': locale!,
@@ -1818,7 +1817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (models != null)
           'models': models!.map((value) => value.toJson()).toList(),
         if (runtimeConfiguration != null)
@@ -1860,7 +1859,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bundleId != null) 'bundleId': bundleId!,
         if (content != null) 'content': content!.toJson(),
         if (devicePath != null) 'devicePath': devicePath!,
@@ -1885,7 +1884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iosDevices != null)
           'iosDevices': iosDevices!.map((value) => value.toJson()).toList(),
       };
@@ -1973,7 +1972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceCapabilities != null)
           'deviceCapabilities': deviceCapabilities!,
         if (formFactor != null) 'formFactor': formFactor!,
@@ -2013,7 +2012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locales != null)
           'locales': locales!.map((value) => value.toJson()).toList(),
         if (orientations != null)
@@ -2059,7 +2058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appBundleId != null) 'appBundleId': appBundleId!,
         if (appIpa != null) 'appIpa': appIpa!.toJson(),
         if (scenarios != null) 'scenarios': scenarios!,
@@ -2115,7 +2114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalIpas != null)
           'additionalIpas':
               additionalIpas!.map((value) => value.toJson()).toList(),
@@ -2178,7 +2177,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (majorVersion != null) 'majorVersion': majorVersion!,
         if (minorVersion != null) 'minorVersion': minorVersion!,
@@ -2253,7 +2252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appBundleId != null) 'appBundleId': appBundleId!,
         if (testSpecialEntitlements != null)
           'testSpecialEntitlements': testSpecialEntitlements!,
@@ -2271,7 +2270,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A location/region designation for language.
@@ -2315,7 +2314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (region != null) 'region': region!,
@@ -2349,7 +2348,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (testTargetsForShard != null)
           'testTargetsForShard':
               testTargetsForShard!.map((value) => value.toJson()).toList(),
@@ -2382,7 +2381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (downRule != null) 'downRule': downRule!.toJson(),
         if (id != null) 'id': id!,
         if (upRule != null) 'upRule': upRule!.toJson(),
@@ -2403,7 +2402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configurations != null)
           'configurations':
               configurations!.map((value) => value.toJson()).toList(),
@@ -2436,7 +2435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (obb != null) 'obb': obb!.toJson(),
         if (obbFileName != null) 'obbFileName': obbFileName!,
       };
@@ -2475,7 +2474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
         if (tags != null) 'tags': tags!,
@@ -2510,7 +2509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidxOrchestratorVersion != null)
           'androidxOrchestratorVersion': androidxOrchestratorVersion!,
         if (orchestratorVersion != null)
@@ -2553,7 +2552,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!.toJson(),
         if (devicePath != null) 'devicePath': devicePath!,
       };
@@ -2600,7 +2599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (googleCloudStorage != null)
           'googleCloudStorage': googleCloudStorage!.toJson(),
         if (resultsUrl != null) 'resultsUrl': resultsUrl!,
@@ -2657,7 +2656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionType != null) 'actionType': actionType!,
         if (inputText != null) 'inputText': inputText!,
         if (resourceName != null) 'resourceName': resourceName!,
@@ -2691,7 +2690,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (launcherActivity != null)
           'launcherActivity': launcherActivity!.toJson(),
         if (startActivity != null) 'startActivity': startActivity!.toJson(),
@@ -2733,7 +2732,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numShards != null) 'numShards': numShards!,
         if (shardIndex != null) 'shardIndex': shardIndex!,
         if (testTargetsForShard != null)
@@ -2763,7 +2762,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (manualSharding != null) 'manualSharding': manualSharding!.toJson(),
         if (uniformSharding != null)
           'uniformSharding': uniformSharding!.toJson(),
@@ -2799,7 +2798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (categories != null) 'categories': categories!,
         if (uri != null) 'uri': uri!,
@@ -2820,7 +2819,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (durationSeconds != null) 'durationSeconds': durationSeconds!,
       };
 }
@@ -2854,7 +2853,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (progressMessages != null) 'progressMessages': progressMessages!,
       };
@@ -2903,7 +2902,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidDeviceCatalog != null)
           'androidDeviceCatalog': androidDeviceCatalog!.toJson(),
         if (deviceIpBlockCatalog != null)
@@ -3036,7 +3035,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!.toJson(),
         if (id != null) 'id': id!,
         if (matrixId != null) 'matrixId': matrixId!,
@@ -3291,7 +3290,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientInfo != null) 'clientInfo': clientInfo!.toJson(),
         if (environmentMatrix != null)
           'environmentMatrix': environmentMatrix!.toJson(),
@@ -3399,7 +3398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!.toJson(),
         if (additionalApks != null)
           'additionalApks':
@@ -3501,7 +3500,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidInstrumentationTest != null)
           'androidInstrumentationTest': androidInstrumentationTest!.toJson(),
         if (androidRoboTest != null)
@@ -3539,7 +3538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (testTargets != null) 'testTargets': testTargets!,
       };
 }
@@ -3577,7 +3576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionId != null) 'executionId': executionId!,
         if (historyId != null) 'historyId': historyId!,
         if (projectId != null) 'projectId': projectId!,
@@ -3607,7 +3606,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (historyId != null) 'historyId': historyId!,
         if (projectId != null) 'projectId': projectId!,
       };
@@ -3654,7 +3653,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executionId != null) 'executionId': executionId!,
         if (historyId != null) 'historyId': historyId!,
         if (projectId != null) 'projectId': projectId!,
@@ -3700,7 +3699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bandwidth != null) 'bandwidth': bandwidth!,
         if (burst != null) 'burst': burst!,
         if (delay != null) 'delay': delay!,
@@ -3732,7 +3731,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numShards != null) 'numShards': numShards!,
       };
 }
@@ -3762,7 +3761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tags != null) 'tags': tags!,
         if (version != null) 'version': version!,
       };
diff --git a/generated/googleapis/lib/texttospeech/v1.dart b/generated/googleapis/lib/texttospeech/v1.dart
index 88c76b6..1e5b97d 100644
--- a/generated/googleapis/lib/texttospeech/v1.dart
+++ b/generated/googleapis/lib/texttospeech/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -248,7 +247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioEncoding != null) 'audioEncoding': audioEncoding!,
         if (effectsProfileId != null) 'effectsProfileId': effectsProfileId!,
         if (pitch != null) 'pitch': pitch!,
@@ -274,7 +273,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (voices != null)
           'voices': voices!.map((value) => value.toJson()).toList(),
       };
@@ -307,7 +306,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ssml != null) 'ssml': ssml!,
         if (text != null) 'text': text!,
       };
@@ -347,7 +346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioConfig != null) 'audioConfig': audioConfig!.toJson(),
         if (input != null) 'input': input!.toJson(),
         if (voice != null) 'voice': voice!.toJson(),
@@ -379,7 +378,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioContent != null) 'audioContent': audioContent!,
       };
 }
@@ -430,7 +429,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCodes != null) 'languageCodes': languageCodes!,
         if (name != null) 'name': name!,
         if (naturalSampleRateHertz != null)
@@ -495,7 +494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (name != null) 'name': name!,
         if (ssmlGender != null) 'ssmlGender': ssmlGender!,
diff --git a/generated/googleapis/lib/tpu/v1.dart b/generated/googleapis/lib/tpu/v1.dart
index 128a649..be36088 100644
--- a/generated/googleapis/lib/tpu/v1.dart
+++ b/generated/googleapis/lib/tpu/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -869,7 +868,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
       };
@@ -889,7 +888,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response for ListAcceleratorTypes.
@@ -922,7 +921,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorTypes != null)
           'acceleratorTypes':
               acceleratorTypes!.map((value) => value.toJson()).toList(),
@@ -953,7 +952,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -990,7 +989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (nodes != null)
           'nodes': nodes!.map((value) => value.toJson()).toList(),
@@ -1020,7 +1019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1057,7 +1056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tensorflowVersions != null)
           'tensorflowVersions':
@@ -1103,32 +1102,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1156,7 +1153,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (port != null) 'port': port!,
       };
@@ -1326,13 +1323,12 @@
       ipAddress = _json['ipAddress'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1373,7 +1369,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acceleratorType != null) 'acceleratorType': acceleratorType!,
         if (cidrBlock != null) 'cidrBlock': cidrBlock!,
         if (createTime != null) 'createTime': createTime!,
@@ -1454,29 +1450,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1552,7 +1546,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (cancelRequested != null) 'cancelRequested': cancelRequested!,
         if (createTime != null) 'createTime': createTime!,
@@ -1576,7 +1570,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tensorflowVersion != null) 'tensorflowVersion': tensorflowVersion!,
       };
 }
@@ -1600,7 +1594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (preemptible != null) 'preemptible': preemptible!,
         if (reserved != null) 'reserved': reserved!,
       };
@@ -1614,7 +1608,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -1650,8 +1644,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1664,7 +1658,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1679,7 +1673,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A Symptom instance.
@@ -1721,7 +1715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (details != null) 'details': details!,
         if (symptomType != null) 'symptomType': symptomType!,
@@ -1748,7 +1742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (version != null) 'version': version!,
       };
diff --git a/generated/googleapis/lib/trafficdirector/v2.dart b/generated/googleapis/lib/trafficdirector/v2.dart
index edc5b88..8c784c3 100644
--- a/generated/googleapis/lib/trafficdirector/v2.dart
+++ b/generated/googleapis/lib/trafficdirector/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -111,7 +110,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pipe != null) 'pipe': pipe!.toJson(),
         if (socketAddress != null) 'socketAddress': socketAddress!.toJson(),
       };
@@ -136,13 +135,12 @@
 
   BuildVersion.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('version')) {
       version = SemanticVersion.fromJson(
@@ -150,7 +148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!,
         if (version != null) 'version': version!.toJson(),
       };
@@ -177,7 +175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (node != null) 'node': node!.toJson(),
         if (xdsConfig != null)
           'xdsConfig': xdsConfig!.map((value) => value.toJson()).toList(),
@@ -202,7 +200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodeMatchers != null)
           'nodeMatchers': nodeMatchers!.map((value) => value.toJson()).toList(),
       };
@@ -223,7 +221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null)
           'config': config!.map((value) => value.toJson()).toList(),
       };
@@ -284,7 +282,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dynamicActiveClusters != null)
           'dynamicActiveClusters':
               dynamicActiveClusters!.map((value) => value.toJson()).toList(),
@@ -321,7 +319,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exact != null) 'exact': exact!,
         if (range != null) 'range': range!.toJson(),
       };
@@ -347,7 +345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (end != null) 'end': end!,
         if (start != null) 'start': start!,
       };
@@ -375,13 +373,12 @@
 
   DynamicCluster.fromJson(core.Map _json) {
     if (_json.containsKey('cluster')) {
-      cluster =
-          (_json['cluster'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      cluster = (_json['cluster'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('lastUpdated')) {
       lastUpdated = _json['lastUpdated'] as core.String;
@@ -391,7 +388,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cluster != null) 'cluster': cluster!,
         if (lastUpdated != null) 'lastUpdated': lastUpdated!,
         if (versionInfo != null) 'versionInfo': versionInfo!,
@@ -454,7 +451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeState != null) 'activeState': activeState!.toJson(),
         if (drainingState != null) 'drainingState': drainingState!.toJson(),
         if (errorState != null) 'errorState': errorState!.toJson(),
@@ -487,20 +484,19 @@
       lastUpdated = _json['lastUpdated'] as core.String;
     }
     if (_json.containsKey('listener')) {
-      listener =
-          (_json['listener'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      listener = (_json['listener'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('versionInfo')) {
       versionInfo = _json['versionInfo'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastUpdated != null) 'lastUpdated': lastUpdated!,
         if (listener != null) 'listener': listener!,
         if (versionInfo != null) 'versionInfo': versionInfo!,
@@ -530,21 +526,20 @@
       lastUpdated = _json['lastUpdated'] as core.String;
     }
     if (_json.containsKey('routeConfig')) {
-      routeConfig = (_json['routeConfig'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      routeConfig =
+          (_json['routeConfig'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('versionInfo')) {
       versionInfo = _json['versionInfo'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastUpdated != null) 'lastUpdated': lastUpdated!,
         if (routeConfig != null) 'routeConfig': routeConfig!,
         if (versionInfo != null) 'versionInfo': versionInfo!,
@@ -581,8 +576,8 @@
     }
     if (_json.containsKey('scopedRouteConfigs')) {
       scopedRouteConfigs = (_json['scopedRouteConfigs'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -595,7 +590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastUpdated != null) 'lastUpdated': lastUpdated!,
         if (name != null) 'name': name!,
         if (scopedRouteConfigs != null)
@@ -656,7 +651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (disabled != null) 'disabled': disabled!,
         if (name != null) 'name': name!,
@@ -699,7 +694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxProgramSize != null) 'maxProgramSize': maxProgramSize!,
       };
 }
@@ -728,8 +723,8 @@
     }
     if (_json.containsKey('scopedRouteConfigs')) {
       scopedRouteConfigs = (_json['scopedRouteConfigs'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -739,7 +734,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastUpdated != null) 'lastUpdated': lastUpdated!,
         if (name != null) 'name': name!,
         if (scopedRouteConfigs != null)
@@ -762,7 +757,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (oneOf != null) 'oneOf': oneOf!.toJson(),
       };
 }
@@ -806,7 +801,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dynamicListeners != null)
           'dynamicListeners':
               dynamicListeners!.map((value) => value.toJson()).toList(),
@@ -849,7 +844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (region != null) 'region': region!,
         if (subZone != null) 'subZone': subZone!,
         if (zone != null) 'zone': zone!,
@@ -964,13 +959,12 @@
           _json['locality'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('userAgentBuildVersion')) {
       userAgentBuildVersion = BuildVersion.fromJson(
@@ -985,7 +979,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buildVersion != null) 'buildVersion': buildVersion!,
         if (clientFeatures != null) 'clientFeatures': clientFeatures!,
         if (cluster != null) 'cluster': cluster!,
@@ -1029,7 +1023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nodeId != null) 'nodeId': nodeId!.toJson(),
         if (nodeMetadatas != null)
           'nodeMetadatas':
@@ -1045,7 +1039,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Specifies the segment in a path to retrieve value from Struct.
@@ -1061,7 +1055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
       };
 }
@@ -1111,7 +1105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterConfig != null) 'clusterConfig': clusterConfig!.toJson(),
         if (listenerConfig != null) 'listenerConfig': listenerConfig!.toJson(),
         if (routeConfig != null) 'routeConfig': routeConfig!.toJson(),
@@ -1145,7 +1139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mode != null) 'mode': mode!,
         if (path != null) 'path': path!,
       };
@@ -1173,7 +1167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (googleRe2 != null) 'googleRe2': googleRe2!.toJson(),
         if (regex != null) 'regex': regex!,
       };
@@ -1211,7 +1205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dynamicRouteConfigs != null)
           'dynamicRouteConfigs':
               dynamicRouteConfigs!.map((value) => value.toJson()).toList(),
@@ -1256,7 +1250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dynamicScopedRouteConfigs != null)
           'dynamicScopedRouteConfigs': dynamicScopedRouteConfigs!
               .map((value) => value.toJson())
@@ -1290,7 +1284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (majorNumber != null) 'majorNumber': majorNumber!,
         if (minorNumber != null) 'minorNumber': minorNumber!,
         if (patch != null) 'patch': patch!,
@@ -1363,7 +1357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (ipv4Compat != null) 'ipv4Compat': ipv4Compat!,
         if (namedPort != null) 'namedPort': namedPort!,
@@ -1388,20 +1382,19 @@
 
   StaticCluster.fromJson(core.Map _json) {
     if (_json.containsKey('cluster')) {
-      cluster =
-          (_json['cluster'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      cluster = (_json['cluster'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('lastUpdated')) {
       lastUpdated = _json['lastUpdated'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cluster != null) 'cluster': cluster!,
         if (lastUpdated != null) 'lastUpdated': lastUpdated!,
       };
@@ -1425,17 +1418,16 @@
       lastUpdated = _json['lastUpdated'] as core.String;
     }
     if (_json.containsKey('listener')) {
-      listener =
-          (_json['listener'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      listener = (_json['listener'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastUpdated != null) 'lastUpdated': lastUpdated!,
         if (listener != null) 'listener': listener!,
       };
@@ -1458,18 +1450,17 @@
       lastUpdated = _json['lastUpdated'] as core.String;
     }
     if (_json.containsKey('routeConfig')) {
-      routeConfig = (_json['routeConfig'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      routeConfig =
+          (_json['routeConfig'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lastUpdated != null) 'lastUpdated': lastUpdated!,
         if (routeConfig != null) 'routeConfig': routeConfig!,
       };
@@ -1539,7 +1530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exact != null) 'exact': exact!,
         if (ignoreCase != null) 'ignoreCase': ignoreCase!,
         if (prefix != null) 'prefix': prefix!,
@@ -1587,7 +1578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (path != null) 'path': path!.map((value) => value.toJson()).toList(),
         if (value != null) 'value': value!.toJson(),
       };
@@ -1614,21 +1605,21 @@
       details = _json['details'] as core.String;
     }
     if (_json.containsKey('failedConfiguration')) {
-      failedConfiguration = (_json['failedConfiguration'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      failedConfiguration =
+          (_json['failedConfiguration'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('lastUpdateAttempt')) {
       lastUpdateAttempt = _json['lastUpdateAttempt'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!,
         if (failedConfiguration != null)
           'failedConfiguration': failedConfiguration!,
@@ -1695,7 +1686,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolMatch != null) 'boolMatch': boolMatch!,
         if (doubleMatch != null) 'doubleMatch': doubleMatch!.toJson(),
         if (listMatch != null) 'listMatch': listMatch!.toJson(),
diff --git a/generated/googleapis/lib/translate/v3.dart b/generated/googleapis/lib/translate/v3.dart
index 1bafa9c..b7fce90 100644
--- a/generated/googleapis/lib/translate/v3.dart
+++ b/generated/googleapis/lib/translate/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1055,15 +1054,14 @@
 
   BatchTranslateTextRequest.fromJson(core.Map _json) {
     if (_json.containsKey('glossaries')) {
-      glossaries = (_json['glossaries'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              TranslateTextGlossaryConfig.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      glossaries =
+          (_json['glossaries'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          TranslateTextGlossaryConfig.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('inputConfigs')) {
       inputConfigs = (_json['inputConfigs'] as core.List)
@@ -1072,22 +1070,20 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('models')) {
-      models =
-          (_json['models'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      models = (_json['models'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('outputConfig')) {
       outputConfig = OutputConfig.fromJson(
@@ -1103,7 +1099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (glossaries != null)
           'glossaries':
               glossaries!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -1127,7 +1123,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The request message for language detection.
@@ -1172,13 +1168,12 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -1188,7 +1183,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (labels != null) 'labels': labels!,
         if (mimeType != null) 'mimeType': mimeType!,
@@ -1214,7 +1209,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languages != null)
           'languages': languages!.map((value) => value.toJson()).toList(),
       };
@@ -1240,7 +1235,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -1260,7 +1255,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The Google Cloud Storage location for the output content.
@@ -1283,7 +1278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputUriPrefix != null) 'outputUriPrefix': outputUriPrefix!,
       };
 }
@@ -1305,7 +1300,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputUri != null) 'inputUri': inputUri!,
       };
 }
@@ -1377,7 +1372,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (entryCount != null) 'entryCount': entryCount!,
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
@@ -1418,7 +1413,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
       };
 }
@@ -1464,7 +1459,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -1497,7 +1492,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sourceLanguageCode != null)
           'sourceLanguageCode': sourceLanguageCode!,
         if (targetLanguageCode != null)
@@ -1523,7 +1518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCodes != null) 'languageCodes': languageCodes!,
       };
 }
@@ -1554,7 +1549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (glossaries != null)
           'glossaries': glossaries!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1583,7 +1578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1612,7 +1607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1656,32 +1651,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1744,29 +1737,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1837,7 +1828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
       };
 }
@@ -1875,8 +1866,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1889,7 +1880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1933,7 +1924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (languageCode != null) 'languageCode': languageCode!,
         if (supportSource != null) 'supportSource': supportSource!,
@@ -1960,7 +1951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languages != null)
           'languages': languages!.map((value) => value.toJson()).toList(),
       };
@@ -1995,7 +1986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (glossary != null) 'glossary': glossary!,
         if (ignoreCase != null) 'ignoreCase': ignoreCase!,
       };
@@ -2082,13 +2073,12 @@
           _json['glossaryConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -2104,7 +2094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contents != null) 'contents': contents!,
         if (glossaryConfig != null) 'glossaryConfig': glossaryConfig!.toJson(),
         if (labels != null) 'labels': labels!,
@@ -2146,7 +2136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (glossaryTranslations != null)
           'glossaryTranslations':
               glossaryTranslations!.map((value) => value.toJson()).toList(),
@@ -2198,7 +2188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguageCode != null)
           'detectedLanguageCode': detectedLanguageCode!,
         if (glossaryConfig != null) 'glossaryConfig': glossaryConfig!.toJson(),
@@ -2224,7 +2214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (timeout != null) 'timeout': timeout!,
       };
 }
diff --git a/generated/googleapis/lib/vault/v1.dart b/generated/googleapis/lib/vault/v1.dart
index a0142ec..3c3c005 100644
--- a/generated/googleapis/lib/vault/v1.dart
+++ b/generated/googleapis/lib/vault/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1616,7 +1615,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!.toJson(),
         if (count != null) 'count': count!,
       };
@@ -1651,7 +1650,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!.toJson(),
         if (errorType != null) 'errorType': errorType!,
       };
@@ -1672,7 +1671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (emails != null) 'emails': emails!,
       };
 }
@@ -1701,7 +1700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!.toJson(),
         if (status != null) 'status': status!.toJson(),
       };
@@ -1734,7 +1733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountIds != null) 'accountIds': accountIds!,
         if (emails != null) 'emails': emails!,
       };
@@ -1756,7 +1755,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -1795,7 +1794,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ccMe != null) 'ccMe': ccMe!,
         if (matterPermission != null)
           'matterPermission': matterPermission!.toJson(),
@@ -1811,7 +1810,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Close a matter by ID.
@@ -1822,7 +1821,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response to a CloseMatterRequest.
@@ -1839,7 +1838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matter != null) 'matter': matter!.toJson(),
       };
 }
@@ -1880,7 +1879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketName != null) 'bucketName': bucketName!,
         if (md5Hash != null) 'md5Hash': md5Hash!,
         if (objectName != null) 'objectName': objectName!,
@@ -1906,7 +1905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (files != null)
           'files': files!.map((value) => value.toJson()).toList(),
       };
@@ -1964,7 +1963,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driveQuery != null) 'driveQuery': driveQuery!.toJson(),
         if (groupsQuery != null) 'groupsQuery': groupsQuery!.toJson(),
         if (hangoutsChatQuery != null)
@@ -2008,7 +2007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (matterId != null) 'matterId': matterId!,
         if (query != null) 'query': query!.toJson(),
@@ -2042,7 +2041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (query != null) 'query': query!.toJson(),
         if (view != null) 'view': view!,
       };
@@ -2077,7 +2076,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupsCountResult != null)
           'groupsCountResult': groupsCountResult!.toJson(),
         if (mailCountResult != null)
@@ -2100,7 +2099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeAccessInfo != null) 'includeAccessInfo': includeAccessInfo!,
       };
 }
@@ -2132,7 +2131,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeSharedDrives != null)
           'includeSharedDrives': includeSharedDrives!,
         if (includeTeamDrives != null) 'includeTeamDrives': includeTeamDrives!,
@@ -2154,7 +2153,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An export
@@ -2248,7 +2247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudStorageSink != null)
           'cloudStorageSink': cloudStorageSink!.toJson(),
         if (createTime != null) 'createTime': createTime!,
@@ -2317,7 +2316,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (driveOptions != null) 'driveOptions': driveOptions!.toJson(),
         if (groupsOptions != null) 'groupsOptions': groupsOptions!.toJson(),
         if (hangoutsChatOptions != null)
@@ -2353,7 +2352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exportedArtifactCount != null)
           'exportedArtifactCount': exportedArtifactCount!,
         if (sizeInBytes != null) 'sizeInBytes': sizeInBytes!,
@@ -2411,7 +2410,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountCountErrors != null)
           'accountCountErrors':
               accountCountErrors!.map((value) => value.toJson()).toList(),
@@ -2444,7 +2443,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exportFormat != null) 'exportFormat': exportFormat!,
       };
 }
@@ -2466,7 +2465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exportFormat != null) 'exportFormat': exportFormat!,
       };
 }
@@ -2486,7 +2485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (roomId != null) 'roomId': roomId!,
       };
 }
@@ -2504,7 +2503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeRooms != null) 'includeRooms': includeRooms!,
       };
 }
@@ -2557,7 +2556,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (email != null) 'email': email!,
         if (firstName != null) 'firstName': firstName!,
@@ -2585,7 +2584,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeSharedDriveFiles != null)
           'includeSharedDriveFiles': includeSharedDriveFiles!,
         if (includeTeamDriveFiles != null)
@@ -2624,7 +2623,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
         if (terms != null) 'terms': terms!,
@@ -2644,7 +2643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeRooms != null) 'includeRooms': includeRooms!,
       };
 }
@@ -2680,7 +2679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
         if (terms != null) 'terms': terms!,
@@ -2710,7 +2709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (holdTime != null) 'holdTime': holdTime!,
         if (orgUnitId != null) 'orgUnitId': orgUnitId!,
       };
@@ -2733,7 +2732,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coveredData != null) 'coveredData': coveredData!,
       };
 }
@@ -2812,7 +2811,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accounts != null)
           'accounts': accounts!.map((value) => value.toJson()).toList(),
         if (corpus != null) 'corpus': corpus!,
@@ -2846,7 +2845,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exports != null)
           'exports': exports!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2869,7 +2868,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accounts != null)
           'accounts': accounts!.map((value) => value.toJson()).toList(),
       };
@@ -2899,7 +2898,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (holds != null)
           'holds': holds!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2928,7 +2927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matters != null)
           'matters': matters!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2957,7 +2956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -2988,7 +2987,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (savedQueries != null)
           'savedQueries': savedQueries!.map((value) => value.toJson()).toList(),
@@ -3044,7 +3043,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountCountErrors != null)
           'accountCountErrors':
               accountCountErrors!.map((value) => value.toJson()).toList(),
@@ -3084,7 +3083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exportFormat != null) 'exportFormat': exportFormat!,
         if (showConfidentialModeContent != null)
           'showConfidentialModeContent': showConfidentialModeContent!,
@@ -3104,7 +3103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludeDrafts != null) 'excludeDrafts': excludeDrafts!,
       };
 }
@@ -3159,7 +3158,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (matterId != null) 'matterId': matterId!,
         if (matterPermissions != null)
@@ -3196,7 +3195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (role != null) 'role': role!,
       };
@@ -3256,29 +3255,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -3300,7 +3297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (orgUnitId != null) 'orgUnitId': orgUnitId!,
       };
 }
@@ -3488,7 +3485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountInfo != null) 'accountInfo': accountInfo!.toJson(),
         if (corpus != null) 'corpus': corpus!,
         if (dataScope != null) 'dataScope': dataScope!,
@@ -3527,7 +3524,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountIds != null) 'accountIds': accountIds!,
       };
 }
@@ -3550,7 +3547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (statuses != null)
           'statuses': statuses!.map((value) => value.toJson()).toList(),
       };
@@ -3569,7 +3566,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
       };
 }
@@ -3582,7 +3579,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response to a ReopenMatterRequest.
@@ -3599,7 +3596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (matter != null) 'matter': matter!.toJson(),
       };
 }
@@ -3650,7 +3647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (displayName != null) 'displayName': displayName!,
         if (matterId != null) 'matterId': matterId!,
@@ -3674,7 +3671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sharedDriveIds != null) 'sharedDriveIds': sharedDriveIds!,
       };
 }
@@ -3712,8 +3709,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3726,7 +3723,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -3748,7 +3745,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (teamDriveIds != null) 'teamDriveIds': teamDriveIds!,
       };
 }
@@ -3761,7 +3758,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// User's information.
@@ -3783,7 +3780,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (email != null) 'email': email!,
       };
@@ -3806,7 +3803,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exportFormat != null) 'exportFormat': exportFormat!,
       };
 }
@@ -3826,7 +3823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coveredData != null) 'coveredData': coveredData!,
       };
 }
diff --git a/generated/googleapis/lib/vectortile/v1.dart b/generated/googleapis/lib/vectortile/v1.dart
index aac15b1..ea7df3c 100644
--- a/generated/googleapis/lib/vectortile/v1.dart
+++ b/generated/googleapis/lib/vectortile/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -486,7 +485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basemapZOrder != null) 'basemapZOrder': basemapZOrder!.toJson(),
         if (hasExternalEdges != null) 'hasExternalEdges': hasExternalEdges!,
         if (internalEdges != null) 'internalEdges': internalEdges!,
@@ -530,7 +529,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (zGrade != null) 'zGrade': zGrade!,
         if (zPlane != null) 'zPlane': zPlane!,
         if (zWithinGrade != null) 'zWithinGrade': zWithinGrade!,
@@ -573,7 +572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (area != null) 'area': area!.toJson(),
         if (maxZ != null) 'maxZ': maxZ!,
         if (minZ != null) 'minZ': minZ!,
@@ -674,7 +673,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (geometry != null) 'geometry': geometry!.toJson(),
         if (placeId != null) 'placeId': placeId!,
@@ -759,7 +758,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coordinates != null) 'coordinates': coordinates!.toJson(),
         if (features != null)
           'features': features!.map((value) => value.toJson()).toList(),
@@ -810,7 +809,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (altitudeMultiplier != null)
           'altitudeMultiplier': altitudeMultiplier!,
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
@@ -876,7 +875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (areas != null)
           'areas': areas!.map((value) => value.toJson()).toList(),
         if (extrudedAreas != null)
@@ -935,7 +934,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basemapZOrder != null) 'basemapZOrder': basemapZOrder!.toJson(),
         if (vertexOffsets != null) 'vertexOffsets': vertexOffsets!.toJson(),
         if (zOrder != null) 'zOrder': zOrder!,
@@ -967,7 +966,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (strips != null)
           'strips': strips!.map((value) => value.toJson()).toList(),
         if (vertexOffsets != null) 'vertexOffsets': vertexOffsets!.toJson(),
@@ -990,7 +989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
       };
 }
@@ -1024,7 +1023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (relatedFeatureIndex != null)
           'relatedFeatureIndex': relatedFeatureIndex!,
         if (relationType != null) 'relationType': relationType!,
@@ -1046,7 +1045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isPrivate != null) 'isPrivate': isPrivate!,
       };
 }
@@ -1074,7 +1073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (altitudeDiffs != null) 'altitudeDiffs': altitudeDiffs!,
       };
 }
@@ -1155,7 +1154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (altitudeMultiplier != null)
           'altitudeMultiplier': altitudeMultiplier!,
         if (columnCount != null) 'columnCount': columnCount!,
@@ -1178,7 +1177,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (roadInfo != null) 'roadInfo': roadInfo!.toJson(),
       };
 }
@@ -1224,7 +1223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (coordinates != null) 'coordinates': coordinates!.toJson(),
         if (firstDerivative != null)
           'firstDerivative': firstDerivative!.toJson(),
@@ -1279,7 +1278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
         if (zoom != null) 'zoom': zoom!,
@@ -1308,7 +1307,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vertexIndices != null) 'vertexIndices': vertexIndices!,
       };
 }
@@ -1341,7 +1340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (xOffsets != null) 'xOffsets': xOffsets!,
         if (yOffsets != null) 'yOffsets': yOffsets!,
       };
@@ -1381,7 +1380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (xOffsets != null) 'xOffsets': xOffsets!,
         if (yOffsets != null) 'yOffsets': yOffsets!,
         if (zOffsets != null) 'zOffsets': zOffsets!,
diff --git a/generated/googleapis/lib/verifiedaccess/v1.dart b/generated/googleapis/lib/verifiedaccess/v1.dart
index ed07383..6e43a12 100644
--- a/generated/googleapis/lib/verifiedaccess/v1.dart
+++ b/generated/googleapis/lib/verifiedaccess/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -157,7 +156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternativeChallenge != null)
           'alternativeChallenge': alternativeChallenge!.toJson(),
         if (challenge != null) 'challenge': challenge!.toJson(),
@@ -178,7 +177,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The wrapper message of any data and its signature.
@@ -212,7 +211,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (data != null) 'data': data!,
         if (signature != null) 'signature': signature!,
       };
@@ -243,7 +242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (challengeResponse != null)
           'challengeResponse': challengeResponse!.toJson(),
         if (expectedIdentity != null) 'expectedIdentity': expectedIdentity!,
@@ -294,7 +293,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceEnrollmentId != null)
           'deviceEnrollmentId': deviceEnrollmentId!,
         if (devicePermanentId != null) 'devicePermanentId': devicePermanentId!,
diff --git a/generated/googleapis/lib/videointelligence/v1.dart b/generated/googleapis/lib/videointelligence/v1.dart
index e1645f6..e62b41d 100644
--- a/generated/googleapis/lib/videointelligence/v1.dart
+++ b/generated/googleapis/lib/videointelligence/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -519,7 +518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationProgress != null)
           'annotationProgress':
               annotationProgress!.map((value) => value.toJson()).toList(),
@@ -608,7 +607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (features != null) 'features': features!,
         if (inputContent != null) 'inputContent': inputContent!,
         if (inputUri != null) 'inputUri': inputUri!,
@@ -639,7 +638,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationResults != null)
           'annotationResults':
               annotationResults!.map((value) => value.toJson()).toList(),
@@ -677,7 +676,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
@@ -716,7 +715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
         if (point != null) 'point': point!.toJson(),
@@ -751,7 +750,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (entityId != null) 'entityId': entityId!,
         if (languageCode != null) 'languageCode': languageCode!,
@@ -785,7 +784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
         if (version != null) 'version': version!,
@@ -809,7 +808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (model != null) 'model': model!,
       };
 }
@@ -841,7 +840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pornographyLikelihood != null)
           'pornographyLikelihood': pornographyLikelihood!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -889,7 +888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
         if (segments != null)
@@ -934,7 +933,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (thumbnail != null) 'thumbnail': thumbnail!,
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
@@ -973,7 +972,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeAttributes != null) 'includeAttributes': includeAttributes!,
         if (includeBoundingBoxes != null)
           'includeBoundingBoxes': includeBoundingBoxes!,
@@ -1011,7 +1010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedBoundingBoxes != null)
           'normalizedBoundingBoxes':
               normalizedBoundingBoxes!.map((value) => value.toJson()).toList(),
@@ -1033,7 +1032,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segment != null) 'segment': segment!.toJson(),
       };
 }
@@ -1092,7 +1091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoryEntities != null)
           'categoryEntities':
               categoryEntities!.map((value) => value.toJson()).toList(),
@@ -1171,7 +1170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frameConfidenceThreshold != null)
           'frameConfidenceThreshold': frameConfidenceThreshold!,
         if (labelDetectionMode != null)
@@ -1205,7 +1204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
       };
@@ -1233,7 +1232,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (segment != null) 'segment': segment!.toJson(),
       };
@@ -1281,7 +1280,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!.toJson(),
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
@@ -1324,7 +1323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottom != null) 'bottom': bottom!,
         if (left != null) 'left': left!,
         if (right != null) 'right': right!,
@@ -1358,7 +1357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vertices != null)
           'vertices': vertices!.map((value) => value.toJson()).toList(),
       };
@@ -1386,7 +1385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -1454,7 +1453,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (entity != null) 'entity': entity!.toJson(),
         if (frames != null)
@@ -1481,7 +1480,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (model != null) 'model': model!,
       };
 }
@@ -1510,7 +1509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedBoundingBox != null)
           'normalizedBoundingBox': normalizedBoundingBox!.toJson(),
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -1541,7 +1540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
         if (version != null) 'version': version!,
@@ -1580,7 +1579,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeAttributes != null) 'includeAttributes': includeAttributes!,
         if (includeBoundingBoxes != null)
           'includeBoundingBoxes': includeBoundingBoxes!,
@@ -1606,7 +1605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (model != null) 'model': model!,
       };
 }
@@ -1636,7 +1635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (phrases != null) 'phrases': phrases!,
       };
 }
@@ -1684,7 +1683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (transcript != null) 'transcript': transcript!,
         if (words != null)
@@ -1727,7 +1726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternatives != null)
           'alternatives': alternatives!.map((value) => value.toJson()).toList(),
         if (languageCode != null) 'languageCode': languageCode!,
@@ -1858,7 +1857,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioTracks != null) 'audioTracks': audioTracks!,
         if (diarizationSpeakerCount != null)
           'diarizationSpeakerCount': diarizationSpeakerCount!,
@@ -1909,7 +1908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
         if (text != null) 'text': text!,
@@ -1946,7 +1945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageHints != null) 'languageHints': languageHints!,
         if (model != null) 'model': model!,
       };
@@ -1977,7 +1976,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rotatedBoundingBox != null)
           'rotatedBoundingBox': rotatedBoundingBox!.toJson(),
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -2017,7 +2016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
@@ -2075,7 +2074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
         if (landmarks != null)
@@ -2131,7 +2130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
         if (confidence != null) 'confidence': confidence!,
@@ -2203,7 +2202,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feature != null) 'feature': feature!,
         if (inputUri != null) 'inputUri': inputUri!,
         if (progressPercent != null) 'progressPercent': progressPercent!,
@@ -2423,7 +2422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (explicitAnnotation != null)
           'explicitAnnotation': explicitAnnotation!.toJson(),
@@ -2570,7 +2569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (explicitContentDetectionConfig != null)
           'explicitContentDetectionConfig':
               explicitContentDetectionConfig!.toJson(),
@@ -2614,7 +2613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTimeOffset != null) 'endTimeOffset': endTimeOffset!,
         if (startTimeOffset != null) 'startTimeOffset': startTimeOffset!,
       };
@@ -2684,7 +2683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (endTime != null) 'endTime': endTime!,
         if (speakerTag != null) 'speakerTag': speakerTag!,
@@ -2716,7 +2715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationProgress != null)
           'annotationProgress':
               annotationProgress!.map((value) => value.toJson()).toList(),
@@ -2746,7 +2745,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationResults != null)
           'annotationResults':
               annotationResults!.map((value) => value.toJson()).toList(),
@@ -2785,7 +2784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
@@ -2824,7 +2823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
         if (point != null) 'point': point!.toJson(),
@@ -2859,7 +2858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (entityId != null) 'entityId': entityId!,
         if (languageCode != null) 'languageCode': languageCode!,
@@ -2893,7 +2892,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
         if (version != null) 'version': version!,
@@ -2928,7 +2927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pornographyLikelihood != null)
           'pornographyLikelihood': pornographyLikelihood!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -2976,7 +2975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
         if (segments != null)
@@ -3021,7 +3020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (thumbnail != null) 'thumbnail': thumbnail!,
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
@@ -3060,7 +3059,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedBoundingBoxes != null)
           'normalizedBoundingBoxes':
               normalizedBoundingBoxes!.map((value) => value.toJson()).toList(),
@@ -3082,7 +3081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segment != null) 'segment': segment!.toJson(),
       };
 }
@@ -3141,7 +3140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoryEntities != null)
           'categoryEntities':
               categoryEntities!.map((value) => value.toJson()).toList(),
@@ -3176,7 +3175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
       };
@@ -3204,7 +3203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (segment != null) 'segment': segment!.toJson(),
       };
@@ -3252,7 +3251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!.toJson(),
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
@@ -3296,7 +3295,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottom != null) 'bottom': bottom!,
         if (left != null) 'left': left!,
         if (right != null) 'right': right!,
@@ -3330,7 +3329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vertices != null)
           'vertices': vertices!.map((value) => value.toJson()).toList(),
       };
@@ -3358,7 +3357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -3426,7 +3425,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (entity != null) 'entity': entity!.toJson(),
         if (frames != null)
@@ -3463,7 +3462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedBoundingBox != null)
           'normalizedBoundingBox': normalizedBoundingBox!.toJson(),
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -3494,7 +3493,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
         if (version != null) 'version': version!,
@@ -3544,7 +3543,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (transcript != null) 'transcript': transcript!,
         if (words != null)
@@ -3588,7 +3587,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternatives != null)
           'alternatives': alternatives!.map((value) => value.toJson()).toList(),
         if (languageCode != null) 'languageCode': languageCode!,
@@ -3627,7 +3626,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
         if (text != null) 'text': text!,
@@ -3660,7 +3659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rotatedBoundingBox != null)
           'rotatedBoundingBox': rotatedBoundingBox!.toJson(),
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -3700,7 +3699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
@@ -3760,7 +3759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
         if (landmarks != null)
@@ -3816,7 +3815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
         if (confidence != null) 'confidence': confidence!,
@@ -3888,7 +3887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feature != null) 'feature': feature!,
         if (inputUri != null) 'inputUri': inputUri!,
         if (progressPercent != null) 'progressPercent': progressPercent!,
@@ -4113,7 +4112,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (explicitAnnotation != null)
           'explicitAnnotation': explicitAnnotation!.toJson(),
@@ -4186,7 +4185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTimeOffset != null) 'endTimeOffset': endTimeOffset!,
         if (startTimeOffset != null) 'startTimeOffset': startTimeOffset!,
       };
@@ -4256,7 +4255,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (endTime != null) 'endTime': endTime!,
         if (speakerTag != null) 'speakerTag': speakerTag!,
@@ -4288,7 +4287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationProgress != null)
           'annotationProgress':
               annotationProgress!.map((value) => value.toJson()).toList(),
@@ -4318,7 +4317,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationResults != null)
           'annotationResults':
               annotationResults!.map((value) => value.toJson()).toList(),
@@ -4357,7 +4356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
@@ -4397,7 +4396,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
         if (point != null) 'point': point!.toJson(),
@@ -4432,7 +4431,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (entityId != null) 'entityId': entityId!,
         if (languageCode != null) 'languageCode': languageCode!,
@@ -4467,7 +4466,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
         if (version != null) 'version': version!,
@@ -4502,7 +4501,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pornographyLikelihood != null)
           'pornographyLikelihood': pornographyLikelihood!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -4550,7 +4549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
         if (segments != null)
@@ -4595,7 +4594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (thumbnail != null) 'thumbnail': thumbnail!,
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
@@ -4634,7 +4633,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedBoundingBoxes != null)
           'normalizedBoundingBoxes':
               normalizedBoundingBoxes!.map((value) => value.toJson()).toList(),
@@ -4656,7 +4655,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segment != null) 'segment': segment!.toJson(),
       };
 }
@@ -4716,7 +4715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoryEntities != null)
           'categoryEntities':
               categoryEntities!.map((value) => value.toJson()).toList(),
@@ -4751,7 +4750,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
       };
@@ -4779,7 +4778,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (segment != null) 'segment': segment!.toJson(),
       };
@@ -4827,7 +4826,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!.toJson(),
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
@@ -4871,7 +4870,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottom != null) 'bottom': bottom!,
         if (left != null) 'left': left!,
         if (right != null) 'right': right!,
@@ -4905,7 +4904,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vertices != null)
           'vertices': vertices!.map((value) => value.toJson()).toList(),
       };
@@ -4934,7 +4933,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -5003,7 +5002,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (entity != null) 'entity': entity!.toJson(),
         if (frames != null)
@@ -5040,7 +5039,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedBoundingBox != null)
           'normalizedBoundingBox': normalizedBoundingBox!.toJson(),
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -5071,7 +5070,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
         if (version != null) 'version': version!,
@@ -5121,7 +5120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (transcript != null) 'transcript': transcript!,
         if (words != null)
@@ -5165,7 +5164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternatives != null)
           'alternatives': alternatives!.map((value) => value.toJson()).toList(),
         if (languageCode != null) 'languageCode': languageCode!,
@@ -5204,7 +5203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
         if (text != null) 'text': text!,
@@ -5238,7 +5237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rotatedBoundingBox != null)
           'rotatedBoundingBox': rotatedBoundingBox!.toJson(),
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -5278,7 +5277,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
@@ -5338,7 +5337,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
         if (landmarks != null)
@@ -5394,7 +5393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
         if (confidence != null) 'confidence': confidence!,
@@ -5466,7 +5465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feature != null) 'feature': feature!,
         if (inputUri != null) 'inputUri': inputUri!,
         if (progressPercent != null) 'progressPercent': progressPercent!,
@@ -5694,7 +5693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (explicitAnnotation != null)
           'explicitAnnotation': explicitAnnotation!.toJson(),
@@ -5767,7 +5766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTimeOffset != null) 'endTimeOffset': endTimeOffset!,
         if (startTimeOffset != null) 'startTimeOffset': startTimeOffset!,
       };
@@ -5837,7 +5836,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (endTime != null) 'endTime': endTime!,
         if (speakerTag != null) 'speakerTag': speakerTag!,
@@ -5869,7 +5868,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationProgress != null)
           'annotationProgress':
               annotationProgress!.map((value) => value.toJson()).toList(),
@@ -5899,7 +5898,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationResults != null)
           'annotationResults':
               annotationResults!.map((value) => value.toJson()).toList(),
@@ -5938,7 +5937,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
@@ -5978,7 +5977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
         if (point != null) 'point': point!.toJson(),
@@ -6013,7 +6012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (entityId != null) 'entityId': entityId!,
         if (languageCode != null) 'languageCode': languageCode!,
@@ -6048,7 +6047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
         if (version != null) 'version': version!,
@@ -6083,7 +6082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pornographyLikelihood != null)
           'pornographyLikelihood': pornographyLikelihood!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -6131,7 +6130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
         if (segments != null)
@@ -6176,7 +6175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (thumbnail != null) 'thumbnail': thumbnail!,
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
@@ -6215,7 +6214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedBoundingBoxes != null)
           'normalizedBoundingBoxes':
               normalizedBoundingBoxes!.map((value) => value.toJson()).toList(),
@@ -6237,7 +6236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segment != null) 'segment': segment!.toJson(),
       };
 }
@@ -6297,7 +6296,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoryEntities != null)
           'categoryEntities':
               categoryEntities!.map((value) => value.toJson()).toList(),
@@ -6332,7 +6331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
       };
@@ -6360,7 +6359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (segment != null) 'segment': segment!.toJson(),
       };
@@ -6408,7 +6407,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!.toJson(),
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
@@ -6452,7 +6451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottom != null) 'bottom': bottom!,
         if (left != null) 'left': left!,
         if (right != null) 'right': right!,
@@ -6486,7 +6485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vertices != null)
           'vertices': vertices!.map((value) => value.toJson()).toList(),
       };
@@ -6515,7 +6514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -6584,7 +6583,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (entity != null) 'entity': entity!.toJson(),
         if (frames != null)
@@ -6621,7 +6620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedBoundingBox != null)
           'normalizedBoundingBox': normalizedBoundingBox!.toJson(),
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -6652,7 +6651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
         if (version != null) 'version': version!,
@@ -6702,7 +6701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (transcript != null) 'transcript': transcript!,
         if (words != null)
@@ -6746,7 +6745,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternatives != null)
           'alternatives': alternatives!.map((value) => value.toJson()).toList(),
         if (languageCode != null) 'languageCode': languageCode!,
@@ -6785,7 +6784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
         if (text != null) 'text': text!,
@@ -6819,7 +6818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rotatedBoundingBox != null)
           'rotatedBoundingBox': rotatedBoundingBox!.toJson(),
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -6859,7 +6858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
@@ -6919,7 +6918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
         if (landmarks != null)
@@ -6975,7 +6974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
         if (confidence != null) 'confidence': confidence!,
@@ -7047,7 +7046,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feature != null) 'feature': feature!,
         if (inputUri != null) 'inputUri': inputUri!,
         if (progressPercent != null) 'progressPercent': progressPercent!,
@@ -7275,7 +7274,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (explicitAnnotation != null)
           'explicitAnnotation': explicitAnnotation!.toJson(),
@@ -7348,7 +7347,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTimeOffset != null) 'endTimeOffset': endTimeOffset!,
         if (startTimeOffset != null) 'startTimeOffset': startTimeOffset!,
       };
@@ -7418,7 +7417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (endTime != null) 'endTime': endTime!,
         if (speakerTag != null) 'speakerTag': speakerTag!,
@@ -7450,7 +7449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationProgress != null)
           'annotationProgress':
               annotationProgress!.map((value) => value.toJson()).toList(),
@@ -7480,7 +7479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationResults != null)
           'annotationResults':
               annotationResults!.map((value) => value.toJson()).toList(),
@@ -7517,7 +7516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -7550,7 +7549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (celebrityTracks != null)
           'celebrityTracks':
               celebrityTracks!.map((value) => value.toJson()).toList(),
@@ -7587,7 +7586,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (celebrities != null)
           'celebrities': celebrities!.map((value) => value.toJson()).toList(),
         if (faceTrack != null) 'faceTrack': faceTrack!.toJson(),
@@ -7626,7 +7625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
@@ -7666,7 +7665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
         if (point != null) 'point': point!.toJson(),
@@ -7701,7 +7700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (entityId != null) 'entityId': entityId!,
         if (languageCode != null) 'languageCode': languageCode!,
@@ -7736,7 +7735,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
         if (version != null) 'version': version!,
@@ -7771,7 +7770,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pornographyLikelihood != null)
           'pornographyLikelihood': pornographyLikelihood!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -7819,7 +7818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
         if (segments != null)
@@ -7864,7 +7863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (thumbnail != null) 'thumbnail': thumbnail!,
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
@@ -7903,7 +7902,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedBoundingBoxes != null)
           'normalizedBoundingBoxes':
               normalizedBoundingBoxes!.map((value) => value.toJson()).toList(),
@@ -7925,7 +7924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segment != null) 'segment': segment!.toJson(),
       };
 }
@@ -7985,7 +7984,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoryEntities != null)
           'categoryEntities':
               categoryEntities!.map((value) => value.toJson()).toList(),
@@ -8020,7 +8019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
       };
@@ -8048,7 +8047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (segment != null) 'segment': segment!.toJson(),
       };
@@ -8096,7 +8095,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!.toJson(),
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
@@ -8140,7 +8139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottom != null) 'bottom': bottom!,
         if (left != null) 'left': left!,
         if (right != null) 'right': right!,
@@ -8174,7 +8173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vertices != null)
           'vertices': vertices!.map((value) => value.toJson()).toList(),
       };
@@ -8203,7 +8202,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -8272,7 +8271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (entity != null) 'entity': entity!.toJson(),
         if (frames != null)
@@ -8309,7 +8308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedBoundingBox != null)
           'normalizedBoundingBox': normalizedBoundingBox!.toJson(),
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -8340,7 +8339,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tracks != null)
           'tracks': tracks!.map((value) => value.toJson()).toList(),
         if (version != null) 'version': version!,
@@ -8370,7 +8369,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (celebrity != null) 'celebrity': celebrity!.toJson(),
         if (confidence != null) 'confidence': confidence!,
       };
@@ -8419,7 +8418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (transcript != null) 'transcript': transcript!,
         if (words != null)
@@ -8463,7 +8462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alternatives != null)
           'alternatives': alternatives!.map((value) => value.toJson()).toList(),
         if (languageCode != null) 'languageCode': languageCode!,
@@ -8510,7 +8509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationResults != null)
           'annotationResults': annotationResults!.toJson(),
         if (annotationResultsUri != null)
@@ -8581,7 +8580,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (explicitAnnotation != null)
           'explicitAnnotation': explicitAnnotation!.toJson(),
         if (frameTimestamp != null) 'frameTimestamp': frameTimestamp!,
@@ -8629,7 +8628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (segments != null)
           'segments': segments!.map((value) => value.toJson()).toList(),
         if (text != null) 'text': text!,
@@ -8663,7 +8662,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rotatedBoundingBox != null)
           'rotatedBoundingBox': rotatedBoundingBox!.toJson(),
         if (timeOffset != null) 'timeOffset': timeOffset!,
@@ -8703,7 +8702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (frames != null)
           'frames': frames!.map((value) => value.toJson()).toList(),
@@ -8763,7 +8762,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
         if (landmarks != null)
@@ -8819,7 +8818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null)
           'attributes': attributes!.map((value) => value.toJson()).toList(),
         if (confidence != null) 'confidence': confidence!,
@@ -8892,7 +8891,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feature != null) 'feature': feature!,
         if (inputUri != null) 'inputUri': inputUri!,
         if (progressPercent != null) 'progressPercent': progressPercent!,
@@ -9130,7 +9129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (celebrityRecognitionAnnotations != null)
           'celebrityRecognitionAnnotations':
               celebrityRecognitionAnnotations!.toJson(),
@@ -9206,7 +9205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTimeOffset != null) 'endTimeOffset': endTimeOffset!,
         if (startTimeOffset != null) 'startTimeOffset': startTimeOffset!,
       };
@@ -9276,7 +9275,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (endTime != null) 'endTime': endTime!,
         if (speakerTag != null) 'speakerTag': speakerTag!,
@@ -9293,7 +9292,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Operations.ListOperations.
@@ -9319,7 +9318,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -9380,29 +9379,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -9425,7 +9422,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -9461,8 +9458,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -9475,7 +9472,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/vision/v1.dart b/generated/googleapis/lib/vision/v1.dart
index 78d54cc..8318bc4 100644
--- a/generated/googleapis/lib/vision/v1.dart
+++ b/generated/googleapis/lib/vision/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2061,7 +2060,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (product != null) 'product': product!,
       };
 }
@@ -2116,7 +2115,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (features != null)
           'features': features!.map((value) => value.toJson()).toList(),
         if (imageContext != null) 'imageContext': imageContext!.toJson(),
@@ -2168,7 +2167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (responses != null)
@@ -2208,7 +2207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (features != null)
           'features': features!.map((value) => value.toJson()).toList(),
         if (image != null) 'image': image!.toJson(),
@@ -2346,7 +2345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (cropHintsAnnotation != null)
           'cropHintsAnnotation': cropHintsAnnotation!.toJson(),
@@ -2425,7 +2424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (features != null)
           'features': features!.map((value) => value.toJson()).toList(),
         if (imageContext != null) 'imageContext': imageContext!.toJson(),
@@ -2448,7 +2447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
 }
@@ -2486,7 +2485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parent != null) 'parent': parent!,
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
@@ -2511,7 +2510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -2557,7 +2556,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
         if (parent != null) 'parent': parent!,
         if (requests != null)
@@ -2579,7 +2578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
 }
@@ -2618,7 +2617,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parent != null) 'parent': parent!,
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
@@ -2642,7 +2641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -2679,7 +2678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parent != null) 'parent': parent!,
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
@@ -2702,7 +2701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -2748,7 +2747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (state != null) 'state': state!,
         if (submitTime != null) 'submitTime': submitTime!,
@@ -2814,7 +2813,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockType != null) 'blockType': blockType!,
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
@@ -2849,7 +2848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedVertices != null)
           'normalizedVertices':
               normalizedVertices!.map((value) => value.toJson()).toList(),
@@ -2866,7 +2865,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a color in the RGBA color space.
@@ -2957,7 +2956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alpha != null) 'alpha': alpha!,
         if (blue != null) 'blue': blue!,
         if (green != null) 'green': green!,
@@ -2996,7 +2995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (pixelFraction != null) 'pixelFraction': pixelFraction!,
         if (score != null) 'score': score!,
@@ -3034,7 +3033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (importanceFraction != null)
@@ -3058,7 +3057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cropHints != null)
           'cropHints': cropHints!.map((value) => value.toJson()).toList(),
       };
@@ -3085,7 +3084,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aspectRatios != null) 'aspectRatios': aspectRatios!,
       };
 }
@@ -3117,7 +3116,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isPrefix != null) 'isPrefix': isPrefix!,
         if (type != null) 'type': type!,
       };
@@ -3147,7 +3146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -3169,7 +3168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colors != null)
           'colors': colors!.map((value) => value.toJson()).toList(),
       };
@@ -3189,7 +3188,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Set of detected entity features.
@@ -3284,7 +3283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (description != null) 'description': description!,
@@ -3479,7 +3478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angerLikelihood != null) 'angerLikelihood': angerLikelihood!,
         if (blurredLikelihood != null) 'blurredLikelihood': blurredLikelihood!,
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
@@ -3558,7 +3557,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxResults != null) 'maxResults': maxResults!,
         if (model != null) 'model': model!,
         if (type != null) 'type': type!,
@@ -3593,7 +3592,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -3614,7 +3613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -3663,7 +3662,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (responses != null)
@@ -3815,7 +3814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (cropHintsAnnotation != null)
           'cropHintsAnnotation': cropHintsAnnotation!.toJson(),
@@ -3865,7 +3864,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
 }
@@ -3889,7 +3888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -3955,7 +3954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockType != null) 'blockType': blockType!,
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
@@ -3992,7 +3991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedVertices != null)
           'normalizedVertices':
               normalizedVertices!.map((value) => value.toJson()).toList(),
@@ -4032,7 +4031,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (pixelFraction != null) 'pixelFraction': pixelFraction!,
         if (score != null) 'score': score!,
@@ -4070,7 +4069,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (importanceFraction != null)
@@ -4095,7 +4094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cropHints != null)
           'cropHints': cropHints!.map((value) => value.toJson()).toList(),
       };
@@ -4118,7 +4117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colors != null)
           'colors': colors!.map((value) => value.toJson()).toList(),
       };
@@ -4218,7 +4217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (description != null) 'description': description!,
@@ -4414,7 +4413,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angerLikelihood != null) 'angerLikelihood': angerLikelihood!,
         if (blurredLikelihood != null) 'blurredLikelihood': blurredLikelihood!,
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
@@ -4498,7 +4497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (position != null) 'position': position!.toJson(),
         if (type != null) 'type': type!,
       };
@@ -4532,7 +4531,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -4553,7 +4552,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -4579,7 +4578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageNumber != null) 'pageNumber': pageNumber!,
         if (uri != null) 'uri': uri!,
       };
@@ -4600,7 +4599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dominantColors != null) 'dominantColors': dominantColors!.toJson(),
       };
 }
@@ -4645,7 +4644,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
         if (mimeType != null) 'mimeType': mimeType!,
@@ -4697,7 +4696,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (languageCode != null) 'languageCode': languageCode!,
         if (mid != null) 'mid': mid!,
@@ -4720,7 +4719,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latLng != null) 'latLng': latLng!.toJson(),
       };
 }
@@ -4747,7 +4746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -4784,7 +4783,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
         if (updateTime != null) 'updateTime': updateTime!,
@@ -4819,7 +4818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchSize != null) 'batchSize': batchSize!,
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
       };
@@ -4875,7 +4874,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blocks != null)
           'blocks': blocks!.map((value) => value.toJson()).toList(),
         if (confidence != null) 'confidence': confidence!,
@@ -4932,7 +4931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -4969,7 +4968,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
         if (z != null) 'z': z!,
@@ -5040,7 +5039,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -5074,7 +5073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -5122,7 +5121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexTime != null) 'indexTime': indexTime!,
         if (productGroupedResults != null)
           'productGroupedResults':
@@ -5169,7 +5168,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (objectAnnotations != null)
           'objectAnnotations':
@@ -5216,7 +5215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (mid != null) 'mid': mid!,
         if (name != null) 'name': name!,
@@ -5253,7 +5252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (image != null) 'image': image!,
         if (product != null) 'product': product!.toJson(),
         if (score != null) 'score': score!,
@@ -5285,7 +5284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (uint64Value != null) 'uint64Value': uint64Value!,
         if (value != null) 'value': value!,
@@ -5375,7 +5374,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adult != null) 'adult': adult!,
         if (medical != null) 'medical': medical!,
         if (racy != null) 'racy': racy!,
@@ -5427,7 +5426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -5465,7 +5464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pages != null)
           'pages': pages!.map((value) => value.toJson()).toList(),
         if (text != null) 'text': text!,
@@ -5500,7 +5499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isPrefix != null) 'isPrefix': isPrefix!,
         if (type != null) 'type': type!,
       };
@@ -5531,7 +5530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -5565,7 +5564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedBreak != null) 'detectedBreak': detectedBreak!.toJson(),
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -5594,7 +5593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -5677,7 +5676,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bestGuessLabels != null)
           'bestGuessLabels':
               bestGuessLabels!.map((value) => value.toJson()).toList(),
@@ -5725,7 +5724,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (entityId != null) 'entityId': entityId!,
         if (score != null) 'score': score!,
@@ -5751,7 +5750,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (score != null) 'score': score!,
         if (url != null) 'url': url!,
       };
@@ -5779,7 +5778,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -5836,7 +5835,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullMatchingImages != null)
           'fullMatchingImages':
               fullMatchingImages!.map((value) => value.toJson()).toList(),
@@ -5898,7 +5897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -5951,7 +5950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (responses != null)
@@ -6103,7 +6102,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (cropHintsAnnotation != null)
           'cropHintsAnnotation': cropHintsAnnotation!.toJson(),
@@ -6153,7 +6152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
 }
@@ -6177,7 +6176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -6243,7 +6242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockType != null) 'blockType': blockType!,
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
@@ -6280,7 +6279,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedVertices != null)
           'normalizedVertices':
               normalizedVertices!.map((value) => value.toJson()).toList(),
@@ -6320,7 +6319,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (pixelFraction != null) 'pixelFraction': pixelFraction!,
         if (score != null) 'score': score!,
@@ -6358,7 +6357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (importanceFraction != null)
@@ -6383,7 +6382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cropHints != null)
           'cropHints': cropHints!.map((value) => value.toJson()).toList(),
       };
@@ -6406,7 +6405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colors != null)
           'colors': colors!.map((value) => value.toJson()).toList(),
       };
@@ -6506,7 +6505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (description != null) 'description': description!,
@@ -6702,7 +6701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angerLikelihood != null) 'angerLikelihood': angerLikelihood!,
         if (blurredLikelihood != null) 'blurredLikelihood': blurredLikelihood!,
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
@@ -6786,7 +6785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (position != null) 'position': position!.toJson(),
         if (type != null) 'type': type!,
       };
@@ -6820,7 +6819,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -6841,7 +6840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -6867,7 +6866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageNumber != null) 'pageNumber': pageNumber!,
         if (uri != null) 'uri': uri!,
       };
@@ -6888,7 +6887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dominantColors != null) 'dominantColors': dominantColors!.toJson(),
       };
 }
@@ -6933,7 +6932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
         if (mimeType != null) 'mimeType': mimeType!,
@@ -6985,7 +6984,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (languageCode != null) 'languageCode': languageCode!,
         if (mid != null) 'mid': mid!,
@@ -7008,7 +7007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latLng != null) 'latLng': latLng!.toJson(),
       };
 }
@@ -7035,7 +7034,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -7072,7 +7071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
         if (updateTime != null) 'updateTime': updateTime!,
@@ -7107,7 +7106,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchSize != null) 'batchSize': batchSize!,
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
       };
@@ -7163,7 +7162,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blocks != null)
           'blocks': blocks!.map((value) => value.toJson()).toList(),
         if (confidence != null) 'confidence': confidence!,
@@ -7220,7 +7219,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -7257,7 +7256,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
         if (z != null) 'z': z!,
@@ -7328,7 +7327,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -7362,7 +7361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -7410,7 +7409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexTime != null) 'indexTime': indexTime!,
         if (productGroupedResults != null)
           'productGroupedResults':
@@ -7457,7 +7456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (objectAnnotations != null)
           'objectAnnotations':
@@ -7504,7 +7503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (mid != null) 'mid': mid!,
         if (name != null) 'name': name!,
@@ -7541,7 +7540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (image != null) 'image': image!,
         if (product != null) 'product': product!.toJson(),
         if (score != null) 'score': score!,
@@ -7573,7 +7572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (uint64Value != null) 'uint64Value': uint64Value!,
         if (value != null) 'value': value!,
@@ -7663,7 +7662,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adult != null) 'adult': adult!,
         if (medical != null) 'medical': medical!,
         if (racy != null) 'racy': racy!,
@@ -7715,7 +7714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -7753,7 +7752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pages != null)
           'pages': pages!.map((value) => value.toJson()).toList(),
         if (text != null) 'text': text!,
@@ -7788,7 +7787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isPrefix != null) 'isPrefix': isPrefix!,
         if (type != null) 'type': type!,
       };
@@ -7819,7 +7818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -7853,7 +7852,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedBreak != null) 'detectedBreak': detectedBreak!.toJson(),
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -7882,7 +7881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -7965,7 +7964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bestGuessLabels != null)
           'bestGuessLabels':
               bestGuessLabels!.map((value) => value.toJson()).toList(),
@@ -8013,7 +8012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (entityId != null) 'entityId': entityId!,
         if (score != null) 'score': score!,
@@ -8039,7 +8038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (score != null) 'score': score!,
         if (url != null) 'url': url!,
       };
@@ -8067,7 +8066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -8124,7 +8123,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullMatchingImages != null)
           'fullMatchingImages':
               fullMatchingImages!.map((value) => value.toJson()).toList(),
@@ -8186,7 +8185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -8239,7 +8238,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (responses != null)
@@ -8391,7 +8390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (cropHintsAnnotation != null)
           'cropHintsAnnotation': cropHintsAnnotation!.toJson(),
@@ -8441,7 +8440,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
 }
@@ -8465,7 +8464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -8511,7 +8510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (state != null) 'state': state!,
         if (submitTime != null) 'submitTime': submitTime!,
@@ -8578,7 +8577,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockType != null) 'blockType': blockType!,
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
@@ -8615,7 +8614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedVertices != null)
           'normalizedVertices':
               normalizedVertices!.map((value) => value.toJson()).toList(),
@@ -8655,7 +8654,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (pixelFraction != null) 'pixelFraction': pixelFraction!,
         if (score != null) 'score': score!,
@@ -8693,7 +8692,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (importanceFraction != null)
@@ -8718,7 +8717,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cropHints != null)
           'cropHints': cropHints!.map((value) => value.toJson()).toList(),
       };
@@ -8741,7 +8740,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colors != null)
           'colors': colors!.map((value) => value.toJson()).toList(),
       };
@@ -8841,7 +8840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (description != null) 'description': description!,
@@ -9037,7 +9036,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angerLikelihood != null) 'angerLikelihood': angerLikelihood!,
         if (blurredLikelihood != null) 'blurredLikelihood': blurredLikelihood!,
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
@@ -9121,7 +9120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (position != null) 'position': position!.toJson(),
         if (type != null) 'type': type!,
       };
@@ -9155,7 +9154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -9176,7 +9175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -9202,7 +9201,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageNumber != null) 'pageNumber': pageNumber!,
         if (uri != null) 'uri': uri!,
       };
@@ -9223,7 +9222,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dominantColors != null) 'dominantColors': dominantColors!.toJson(),
       };
 }
@@ -9262,7 +9261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (referenceImages != null)
           'referenceImages':
               referenceImages!.map((value) => value.toJson()).toList(),
@@ -9311,7 +9310,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
         if (mimeType != null) 'mimeType': mimeType!,
@@ -9363,7 +9362,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (languageCode != null) 'languageCode': languageCode!,
         if (mid != null) 'mid': mid!,
@@ -9386,7 +9385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latLng != null) 'latLng': latLng!.toJson(),
       };
 }
@@ -9413,7 +9412,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -9450,7 +9449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
         if (updateTime != null) 'updateTime': updateTime!,
@@ -9485,7 +9484,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchSize != null) 'batchSize': batchSize!,
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
       };
@@ -9541,7 +9540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blocks != null)
           'blocks': blocks!.map((value) => value.toJson()).toList(),
         if (confidence != null) 'confidence': confidence!,
@@ -9598,7 +9597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -9635,7 +9634,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
         if (z != null) 'z': z!,
@@ -9706,7 +9705,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -9740,7 +9739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -9788,7 +9787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexTime != null) 'indexTime': indexTime!,
         if (productGroupedResults != null)
           'productGroupedResults':
@@ -9835,7 +9834,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (objectAnnotations != null)
           'objectAnnotations':
@@ -9882,7 +9881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (mid != null) 'mid': mid!,
         if (name != null) 'name': name!,
@@ -9919,7 +9918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (image != null) 'image': image!,
         if (product != null) 'product': product!.toJson(),
         if (score != null) 'score': score!,
@@ -9951,7 +9950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (uint64Value != null) 'uint64Value': uint64Value!,
         if (value != null) 'value': value!,
@@ -10004,7 +10003,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPolys != null)
           'boundingPolys':
               boundingPolys!.map((value) => value.toJson()).toList(),
@@ -10096,7 +10095,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adult != null) 'adult': adult!,
         if (medical != null) 'medical': medical!,
         if (racy != null) 'racy': racy!,
@@ -10148,7 +10147,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -10186,7 +10185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pages != null)
           'pages': pages!.map((value) => value.toJson()).toList(),
         if (text != null) 'text': text!,
@@ -10221,7 +10220,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isPrefix != null) 'isPrefix': isPrefix!,
         if (type != null) 'type': type!,
       };
@@ -10252,7 +10251,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -10286,7 +10285,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedBreak != null) 'detectedBreak': detectedBreak!.toJson(),
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -10315,7 +10314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -10398,7 +10397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bestGuessLabels != null)
           'bestGuessLabels':
               bestGuessLabels!.map((value) => value.toJson()).toList(),
@@ -10446,7 +10445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (entityId != null) 'entityId': entityId!,
         if (score != null) 'score': score!,
@@ -10472,7 +10471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (score != null) 'score': score!,
         if (url != null) 'url': url!,
       };
@@ -10500,7 +10499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -10557,7 +10556,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullMatchingImages != null)
           'fullMatchingImages':
               fullMatchingImages!.map((value) => value.toJson()).toList(),
@@ -10619,7 +10618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -10672,7 +10671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (responses != null)
@@ -10824,7 +10823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (cropHintsAnnotation != null)
           'cropHintsAnnotation': cropHintsAnnotation!.toJson(),
@@ -10874,7 +10873,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
 }
@@ -10898,7 +10897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -10919,7 +10918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
 }
@@ -10943,7 +10942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -10989,7 +10988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (state != null) 'state': state!,
         if (submitTime != null) 'submitTime': submitTime!,
@@ -11056,7 +11055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockType != null) 'blockType': blockType!,
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
@@ -11093,7 +11092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedVertices != null)
           'normalizedVertices':
               normalizedVertices!.map((value) => value.toJson()).toList(),
@@ -11129,7 +11128,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -11167,7 +11166,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (color != null) 'color': color!.toJson(),
         if (pixelFraction != null) 'pixelFraction': pixelFraction!,
         if (score != null) 'score': score!,
@@ -11205,7 +11204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (importanceFraction != null)
@@ -11230,7 +11229,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cropHints != null)
           'cropHints': cropHints!.map((value) => value.toJson()).toList(),
       };
@@ -11253,7 +11252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colors != null)
           'colors': colors!.map((value) => value.toJson()).toList(),
       };
@@ -11353,7 +11352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (description != null) 'description': description!,
@@ -11563,7 +11562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (angerLikelihood != null) 'angerLikelihood': angerLikelihood!,
         if (blurredLikelihood != null) 'blurredLikelihood': blurredLikelihood!,
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
@@ -11650,7 +11649,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (position != null) 'position': position!.toJson(),
         if (type != null) 'type': type!,
       };
@@ -11678,7 +11677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (celebrity != null) 'celebrity': celebrity!.toJson(),
         if (confidence != null) 'confidence': confidence!,
       };
@@ -11712,7 +11711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -11733,7 +11732,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -11759,7 +11758,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageNumber != null) 'pageNumber': pageNumber!,
         if (uri != null) 'uri': uri!,
       };
@@ -11780,7 +11779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dominantColors != null) 'dominantColors': dominantColors!.toJson(),
       };
 }
@@ -11819,7 +11818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (referenceImages != null)
           'referenceImages':
               referenceImages!.map((value) => value.toJson()).toList(),
@@ -11868,7 +11867,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
         if (mimeType != null) 'mimeType': mimeType!,
@@ -11920,7 +11919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (languageCode != null) 'languageCode': languageCode!,
         if (mid != null) 'mid': mid!,
@@ -11943,7 +11942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latLng != null) 'latLng': latLng!.toJson(),
       };
 }
@@ -11970,7 +11969,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -12007,7 +12006,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
         if (updateTime != null) 'updateTime': updateTime!,
@@ -12042,7 +12041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchSize != null) 'batchSize': batchSize!,
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
       };
@@ -12098,7 +12097,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blocks != null)
           'blocks': blocks!.map((value) => value.toJson()).toList(),
         if (confidence != null) 'confidence': confidence!,
@@ -12155,7 +12154,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -12192,7 +12191,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
         if (z != null) 'z': z!,
@@ -12263,7 +12262,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -12297,7 +12296,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -12345,7 +12344,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexTime != null) 'indexTime': indexTime!,
         if (productGroupedResults != null)
           'productGroupedResults':
@@ -12392,7 +12391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (objectAnnotations != null)
           'objectAnnotations':
@@ -12439,7 +12438,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (mid != null) 'mid': mid!,
         if (name != null) 'name': name!,
@@ -12476,7 +12475,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (image != null) 'image': image!,
         if (product != null) 'product': product!.toJson(),
         if (score != null) 'score': score!,
@@ -12508,7 +12507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (uint64Value != null) 'uint64Value': uint64Value!,
         if (value != null) 'value': value!,
@@ -12561,7 +12560,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPolys != null)
           'boundingPolys':
               boundingPolys!.map((value) => value.toJson()).toList(),
@@ -12653,7 +12652,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adult != null) 'adult': adult!,
         if (medical != null) 'medical': medical!,
         if (racy != null) 'racy': racy!,
@@ -12705,7 +12704,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -12743,7 +12742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pages != null)
           'pages': pages!.map((value) => value.toJson()).toList(),
         if (text != null) 'text': text!,
@@ -12778,7 +12777,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isPrefix != null) 'isPrefix': isPrefix!,
         if (type != null) 'type': type!,
       };
@@ -12809,7 +12808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -12843,7 +12842,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedBreak != null) 'detectedBreak': detectedBreak!.toJson(),
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -12872,7 +12871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -12955,7 +12954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bestGuessLabels != null)
           'bestGuessLabels':
               bestGuessLabels!.map((value) => value.toJson()).toList(),
@@ -13003,7 +13002,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (entityId != null) 'entityId': entityId!,
         if (score != null) 'score': score!,
@@ -13029,7 +13028,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (score != null) 'score': score!,
         if (url != null) 'url': url!,
       };
@@ -13057,7 +13056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -13114,7 +13113,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullMatchingImages != null)
           'fullMatchingImages':
               fullMatchingImages!.map((value) => value.toJson()).toList(),
@@ -13176,7 +13175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -13217,7 +13216,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (objectAnnotations != null)
           'objectAnnotations':
@@ -13261,7 +13260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (source != null) 'source': source!.toJson(),
       };
@@ -13288,7 +13287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageNumber != null) 'pageNumber': pageNumber!,
         if (uri != null) 'uri': uri!,
       };
@@ -13353,7 +13352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cropHintsParams != null)
           'cropHintsParams': cropHintsParams!.toJson(),
         if (languageHints != null) 'languageHints': languageHints!,
@@ -13381,7 +13380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dominantColors != null) 'dominantColors': dominantColors!.toJson(),
       };
 }
@@ -13422,7 +13421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsImageUri != null) 'gcsImageUri': gcsImageUri!,
         if (imageUri != null) 'imageUri': imageUri!,
       };
@@ -13475,7 +13474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (csvFileUri != null) 'csvFileUri': csvFileUri!,
       };
 }
@@ -13495,7 +13494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
       };
 }
@@ -13516,7 +13515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
       };
 }
@@ -13554,7 +13553,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (referenceImages != null)
           'referenceImages':
               referenceImages!.map((value) => value.toJson()).toList(),
@@ -13603,7 +13602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
         if (mimeType != null) 'mimeType': mimeType!,
@@ -13633,7 +13632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -13698,7 +13697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (position != null) 'position': position!.toJson(),
         if (type != null) 'type': type!,
       };
@@ -13731,7 +13730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
       };
@@ -13758,7 +13757,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxLatLng != null) 'maxLatLng': maxLatLng!.toJson(),
         if (minLatLng != null) 'minLatLng': minLatLng!.toJson(),
       };
@@ -13786,7 +13785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -13816,7 +13815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (productSets != null)
           'productSets': productSets!.map((value) => value.toJson()).toList(),
@@ -13846,7 +13845,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (products != null)
           'products': products!.map((value) => value.toJson()).toList(),
@@ -13876,7 +13875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (products != null)
           'products': products!.map((value) => value.toJson()).toList(),
@@ -13913,7 +13912,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (pageSize != null) 'pageSize': pageSize!,
         if (referenceImages != null)
@@ -13967,7 +13966,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (languageCode != null) 'languageCode': languageCode!,
         if (mid != null) 'mid': mid!,
@@ -13990,7 +13989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (latLng != null) 'latLng': latLng!.toJson(),
       };
 }
@@ -14017,7 +14016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -14059,7 +14058,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (mid != null) 'mid': mid!,
         if (name != null) 'name': name!,
@@ -14121,29 +14120,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -14183,7 +14180,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
         if (updateTime != null) 'updateTime': updateTime!,
@@ -14218,7 +14215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (batchSize != null) 'batchSize': batchSize!,
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
       };
@@ -14273,7 +14270,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blocks != null)
           'blocks': blocks!.map((value) => value.toJson()).toList(),
         if (confidence != null) 'confidence': confidence!,
@@ -14329,7 +14326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -14366,7 +14363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
         if (z != null) 'z': z!,
@@ -14436,7 +14433,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -14502,7 +14499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (filter != null) 'filter': filter!,
         if (productCategories != null) 'productCategories': productCategories!,
@@ -14548,7 +14545,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexTime != null) 'indexTime': indexTime!,
         if (productGroupedResults != null)
           'productGroupedResults':
@@ -14610,7 +14607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (indexError != null) 'indexError': indexError!.toJson(),
         if (indexTime != null) 'indexTime': indexTime!,
@@ -14634,7 +14631,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (productSetId != null) 'productSetId': productSetId!,
       };
 }
@@ -14664,7 +14661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (uint64Value != null) 'uint64Value': uint64Value!,
         if (value != null) 'value': value!,
@@ -14701,7 +14698,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deleteOrphanProducts != null)
           'deleteOrphanProducts': deleteOrphanProducts!,
         if (force != null) 'force': force!,
@@ -14755,7 +14752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPolys != null)
           'boundingPolys':
               boundingPolys!.map((value) => value.toJson()).toList(),
@@ -14781,7 +14778,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (product != null) 'product': product!,
       };
 }
@@ -14814,7 +14811,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (image != null) 'image': image!,
         if (product != null) 'product': product!.toJson(),
         if (score != null) 'score': score!,
@@ -14904,7 +14901,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adult != null) 'adult': adult!,
         if (medical != null) 'medical': medical!,
         if (racy != null) 'racy': racy!,
@@ -14946,8 +14943,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -14960,7 +14957,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -15010,7 +15007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
@@ -15047,7 +15044,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pages != null)
           'pages': pages!.map((value) => value.toJson()).toList(),
         if (text != null) 'text': text!,
@@ -15074,7 +15071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableTextDetectionConfidenceScore != null)
           'enableTextDetectionConfidenceScore':
               enableTextDetectionConfidenceScore!,
@@ -15104,7 +15101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedBreak != null) 'detectedBreak': detectedBreak!.toJson(),
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -15133,7 +15130,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -15207,7 +15204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bestGuessLabels != null)
           'bestGuessLabels':
               bestGuessLabels!.map((value) => value.toJson()).toList(),
@@ -15241,7 +15238,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeGeoResults != null) 'includeGeoResults': includeGeoResults!,
       };
 }
@@ -15273,7 +15270,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (entityId != null) 'entityId': entityId!,
         if (score != null) 'score': score!,
@@ -15299,7 +15296,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (score != null) 'score': score!,
         if (url != null) 'url': url!,
       };
@@ -15327,7 +15324,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -15381,7 +15378,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullMatchingImages != null)
           'fullMatchingImages':
               fullMatchingImages!.map((value) => value.toJson()).toList(),
@@ -15442,7 +15439,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBox != null) 'boundingBox': boundingBox!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (property != null) 'property': property!.toJson(),
diff --git a/generated/googleapis/lib/webfonts/v1.dart b/generated/googleapis/lib/webfonts/v1.dart
index 8ad2857..23350fa 100644
--- a/generated/googleapis/lib/webfonts/v1.dart
+++ b/generated/googleapis/lib/webfonts/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -138,12 +137,12 @@
       family = _json['family'] as core.String;
     }
     if (_json.containsKey('files')) {
-      files = (_json['files'] as core.Map).cast<core.String, core.String>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      files = (_json['files'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -166,7 +165,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (family != null) 'family': family!,
         if (files != null) 'files': files!,
@@ -201,7 +200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
diff --git a/generated/googleapis/lib/webmasters/v3.dart b/generated/googleapis/lib/webmasters/v3.dart
index 3b31e37..60e6324 100644
--- a/generated/googleapis/lib/webmasters/v3.dart
+++ b/generated/googleapis/lib/webmasters/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -461,7 +460,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clicks != null) 'clicks': clicks!,
         if (ctr != null) 'ctr': ctr!,
         if (impressions != null) 'impressions': impressions!,
@@ -489,7 +488,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimension != null) 'dimension': dimension!,
         if (expression != null) 'expression': expression!,
         if (operator != null) 'operator': operator!,
@@ -514,7 +513,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filters != null)
           'filters': filters!.map((value) => value.toJson()).toList(),
         if (groupType != null) 'groupType': groupType!,
@@ -635,7 +634,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregationType != null) 'aggregationType': aggregationType!,
         if (dataState != null) 'dataState': dataState!,
         if (dimensionFilterGroups != null)
@@ -675,7 +674,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responseAggregationType != null)
           'responseAggregationType': responseAggregationType!,
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
@@ -698,7 +697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sitemap != null)
           'sitemap': sitemap!.map((value) => value.toJson()).toList(),
       };
@@ -722,7 +721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (siteEntry != null)
           'siteEntry': siteEntry!.map((value) => value.toJson()).toList(),
       };
@@ -749,7 +748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissionLevel != null) 'permissionLevel': permissionLevel!,
         if (siteUrl != null) 'siteUrl': siteUrl!,
       };
@@ -832,7 +831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contents != null)
           'contents': contents!.map((value) => value.toJson()).toList(),
         if (errors != null) 'errors': errors!,
@@ -876,7 +875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indexed != null) 'indexed': indexed!,
         if (submitted != null) 'submitted': submitted!,
         if (type != null) 'type': type!,
diff --git a/generated/googleapis/lib/webrisk/v1.dart b/generated/googleapis/lib/webrisk/v1.dart
index 1b61637..9ef62be 100644
--- a/generated/googleapis/lib/webrisk/v1.dart
+++ b/generated/googleapis/lib/webrisk/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -651,7 +650,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additions != null) 'additions': additions!.toJson(),
         if (checksum != null) 'checksum': checksum!.toJson(),
         if (newVersionToken != null) 'newVersionToken': newVersionToken!,
@@ -683,7 +682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sha256 != null) 'sha256': sha256!,
       };
 }
@@ -726,7 +725,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (prefixSize != null) 'prefixSize': prefixSize!,
         if (rawHashes != null) 'rawHashes': rawHashes!,
       };
@@ -747,7 +746,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (indices != null) 'indices': indices!,
       };
 }
@@ -800,7 +799,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encodedData != null) 'encodedData': encodedData!,
         if (entryCount != null) 'entryCount': entryCount!,
         if (firstValue != null) 'firstValue': firstValue!,
@@ -833,7 +832,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (negativeExpireTime != null)
           'negativeExpireTime': negativeExpireTime!,
         if (threats != null)
@@ -882,7 +881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expireTime != null) 'expireTime': expireTime!,
         if (hash != null) 'hash': hash!,
         if (threatTypes != null) 'threatTypes': threatTypes!,
@@ -904,7 +903,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (threat != null) 'threat': threat!.toJson(),
       };
 }
@@ -933,7 +932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expireTime != null) 'expireTime': expireTime!,
         if (threatTypes != null) 'threatTypes': threatTypes!,
       };
@@ -965,7 +964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (threatTypes != null) 'threatTypes': threatTypes!,
         if (uri != null) 'uri': uri!,
       };
@@ -987,7 +986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (submission != null) 'submission': submission!.toJson(),
       };
 }
@@ -1024,7 +1023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rawHashes != null)
           'rawHashes': rawHashes!.map((value) => value.toJson()).toList(),
         if (riceHashes != null) 'riceHashes': riceHashes!.toJson(),
@@ -1057,7 +1056,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rawIndices != null) 'rawIndices': rawIndices!.toJson(),
         if (riceIndices != null) 'riceIndices': riceIndices!.toJson(),
       };
@@ -1071,7 +1070,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Operations.ListOperations.
@@ -1097,7 +1096,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1158,29 +1157,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1203,7 +1200,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -1239,8 +1236,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1253,7 +1250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis/lib/websecurityscanner/v1.dart b/generated/googleapis/lib/websecurityscanner/v1.dart
index 03bf022..73d167c 100644
--- a/generated/googleapis/lib/websecurityscanner/v1.dart
+++ b/generated/googleapis/lib/websecurityscanner/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -732,7 +731,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customAccount != null) 'customAccount': customAccount!.toJson(),
         if (googleAccount != null) 'googleAccount': googleAccount!.toJson(),
         if (iapCredential != null) 'iapCredential': iapCredential!.toJson(),
@@ -774,7 +773,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!,
         if (httpMethod != null) 'httpMethod': httpMethod!,
         if (url != null) 'url': url!,
@@ -815,7 +814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (loginUrl != null) 'loginUrl': loginUrl!,
         if (password != null) 'password': password!,
         if (username != null) 'username': username!,
@@ -836,7 +835,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A Finding resource represents a vulnerability instance identified during a
@@ -1009,7 +1008,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!,
         if (description != null) 'description': description!,
         if (finalUrl != null) 'finalUrl': finalUrl!,
@@ -1058,7 +1057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (findingCount != null) 'findingCount': findingCount!,
         if (findingType != null) 'findingType': findingType!,
       };
@@ -1085,7 +1084,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionUri != null) 'actionUri': actionUri!,
         if (fields != null) 'fields': fields!,
       };
@@ -1117,7 +1116,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (password != null) 'password': password!,
         if (username != null) 'username': username!,
       };
@@ -1142,7 +1141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -1164,7 +1163,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iapTestServiceAccountInfo != null)
           'iapTestServiceAccountInfo': iapTestServiceAccountInfo!.toJson(),
       };
@@ -1187,7 +1186,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (targetAudienceClientId != null)
           'targetAudienceClientId': targetAudienceClientId!,
       };
@@ -1216,7 +1215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (crawledUrls != null)
           'crawledUrls': crawledUrls!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1239,7 +1238,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (findingTypeStats != null)
           'findingTypeStats':
               findingTypeStats!.map((value) => value.toJson()).toList(),
@@ -1269,7 +1268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (findings != null)
           'findings': findings!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1299,7 +1298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (scanConfigs != null)
           'scanConfigs': scanConfigs!.map((value) => value.toJson()).toList(),
@@ -1329,7 +1328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (scanRuns != null)
           'scanRuns': scanRuns!.map((value) => value.toJson()).toList(),
@@ -1363,7 +1362,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (learnMoreUrls != null) 'learnMoreUrls': learnMoreUrls!,
         if (libraryName != null) 'libraryName': libraryName!,
         if (version != null) 'version': version!,
@@ -1492,7 +1491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authentication != null) 'authentication': authentication!.toJson(),
         if (blacklistPatterns != null) 'blacklistPatterns': blacklistPatterns!,
         if (displayName != null) 'displayName': displayName!,
@@ -1620,7 +1619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (fieldName != null) 'fieldName': fieldName!,
       };
@@ -1758,7 +1757,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (errorTrace != null) 'errorTrace': errorTrace!.toJson(),
         if (executionState != null) 'executionState': executionState!,
@@ -1834,7 +1833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (mostCommonHttpErrorCode != null)
           'mostCommonHttpErrorCode': mostCommonHttpErrorCode!,
@@ -1877,7 +1876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
       };
 }
@@ -1907,7 +1906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (intervalDurationDays != null)
           'intervalDurationDays': intervalDurationDays!,
         if (scheduleTime != null) 'scheduleTime': scheduleTime!,
@@ -1922,7 +1921,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request for the `StopScanRun` method.
@@ -1933,7 +1932,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Information regarding any resource causing the vulnerability such as
@@ -1956,7 +1955,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (resourceUrl != null) 'resourceUrl': resourceUrl!,
       };
@@ -1987,7 +1986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (headers != null)
           'headers': headers!.map((value) => value.toJson()).toList(),
         if (missingHeaders != null)
@@ -2011,7 +2010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameterNames != null) 'parameterNames': parameterNames!,
       };
 }
@@ -2072,7 +2071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attackVector != null) 'attackVector': attackVector!,
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (stackTraces != null) 'stackTraces': stackTraces!,
diff --git a/generated/googleapis/lib/workflowexecutions/v1.dart b/generated/googleapis/lib/workflowexecutions/v1.dart
index 4a3dd97..bc4e4fc 100644
--- a/generated/googleapis/lib/workflowexecutions/v1.dart
+++ b/generated/googleapis/lib/workflowexecutions/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -307,7 +306,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Error describes why the execution was abnormally terminated.
@@ -329,7 +328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!,
         if (payload != null) 'payload': payload!,
       };
@@ -425,7 +424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (argument != null) 'argument': argument!,
         if (endTime != null) 'endTime': endTime!,
         if (error != null) 'error': error!.toJson(),
@@ -462,7 +461,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executions != null)
           'executions': executions!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
diff --git a/generated/googleapis/lib/workflows/v1.dart b/generated/googleapis/lib/workflows/v1.dart
index a8735cb..aa43633 100644
--- a/generated/googleapis/lib/workflows/v1.dart
+++ b/generated/googleapis/lib/workflows/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -576,7 +575,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Locations.ListLocations.
@@ -601,7 +600,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -630,7 +629,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -669,7 +668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (unreachable != null) 'unreachable': unreachable!,
         if (workflows != null)
@@ -714,32 +713,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -802,29 +799,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -870,7 +865,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -912,8 +907,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -926,7 +921,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1014,13 +1009,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1045,7 +1039,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (labels != null) 'labels': labels!,
diff --git a/generated/googleapis/lib/youtube/v3.dart b/generated/googleapis/lib/youtube/v3.dart
index 278b0b0..b7d5e3e 100644
--- a/generated/googleapis/lib/youtube/v3.dart
+++ b/generated/googleapis/lib/youtube/v3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -5388,7 +5387,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (abuseTypes != null)
           'abuseTypes': abuseTypes!.map((value) => value.toJson()).toList(),
         if (description != null) 'description': description!,
@@ -5410,7 +5409,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
       };
 }
@@ -5438,7 +5437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowed != null) 'allowed': allowed!,
         if (exception != null) 'exception': exception!,
       };
@@ -5497,7 +5496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentDetails != null) 'contentDetails': contentDetails!.toJson(),
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -5620,7 +5619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bulletin != null) 'bulletin': bulletin!.toJson(),
         if (channelItem != null) 'channelItem': channelItem!.toJson(),
         if (comment != null) 'comment': comment!.toJson(),
@@ -5652,7 +5651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceId != null) 'resourceId': resourceId!.toJson(),
       };
 }
@@ -5672,7 +5671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceId != null) 'resourceId': resourceId!.toJson(),
       };
 }
@@ -5692,7 +5691,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceId != null) 'resourceId': resourceId!.toJson(),
       };
 }
@@ -5712,7 +5711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceId != null) 'resourceId': resourceId!.toJson(),
       };
 }
@@ -5732,7 +5731,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceId != null) 'resourceId': resourceId!.toJson(),
       };
 }
@@ -5764,7 +5763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (playlistId != null) 'playlistId': playlistId!,
         if (playlistItemId != null) 'playlistItemId': playlistItemId!,
         if (resourceId != null) 'resourceId': resourceId!.toJson(),
@@ -5857,7 +5856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adTag != null) 'adTag': adTag!,
         if (clickTrackingUrl != null) 'clickTrackingUrl': clickTrackingUrl!,
         if (creativeViewUrl != null) 'creativeViewUrl': creativeViewUrl!,
@@ -5906,7 +5905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reason != null) 'reason': reason!,
         if (resourceId != null) 'resourceId': resourceId!.toJson(),
         if (seedResourceId != null) 'seedResourceId': seedResourceId!.toJson(),
@@ -5957,7 +5956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (author != null) 'author': author!,
         if (imageUrl != null) 'imageUrl': imageUrl!,
         if (referenceUrl != null) 'referenceUrl': referenceUrl!,
@@ -5981,7 +5980,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceId != null) 'resourceId': resourceId!.toJson(),
       };
 }
@@ -5999,7 +5998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (videoId != null) 'videoId': videoId!,
       };
 }
@@ -6069,7 +6068,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -6170,7 +6169,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (channelTitle != null) 'channelTitle': channelTitle!,
         if (description != null) 'description': description!,
@@ -6218,7 +6217,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -6267,7 +6266,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -6409,7 +6408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioTrackType != null) 'audioTrackType': audioTrackType!,
         if (failureReason != null) 'failureReason': failureReason!,
         if (isAutoSynced != null) 'isAutoSynced': isAutoSynced!,
@@ -6483,7 +6482,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (format != null) 'format': format!,
         if (frameRate != null) 'frameRate': frameRate!,
         if (ingestionInfo != null) 'ingestionInfo': ingestionInfo!.toJson(),
@@ -6576,15 +6575,14 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('localizations')) {
-      localizations = (_json['localizations'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ChannelLocalization.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      localizations =
+          (_json['localizations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ChannelLocalization.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('snippet')) {
       snippet = ChannelSnippet.fromJson(
@@ -6604,7 +6602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditDetails != null) 'auditDetails': auditDetails!.toJson(),
         if (brandingSettings != null)
           'brandingSettings': brandingSettings!.toJson(),
@@ -6655,7 +6653,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (communityGuidelinesGoodStanding != null)
           'communityGuidelinesGoodStanding': communityGuidelinesGoodStanding!,
         if (contentIdClaimsGoodStanding != null)
@@ -6691,7 +6689,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (url != null) 'url': url!,
@@ -6735,7 +6733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channel != null) 'channel': channel!.toJson(),
         if (hints != null)
           'hints': hints!.map((value) => value.toJson()).toList(),
@@ -6795,7 +6793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (favorites != null) 'favorites': favorites!,
         if (likes != null) 'likes': likes!,
         if (uploads != null) 'uploads': uploads!,
@@ -6817,7 +6815,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (relatedPlaylists != null)
           'relatedPlaylists': relatedPlaylists!.toJson(),
       };
@@ -6843,7 +6841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentOwner != null) 'contentOwner': contentOwner!,
         if (timeLinked != null) 'timeLinked': timeLinked!.toIso8601String(),
       };
@@ -6882,7 +6880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!,
         if (conversionUrl != null) 'conversionUrl': conversionUrl!,
       };
@@ -6908,7 +6906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pings != null)
           'pings': pings!.map((value) => value.toJson()).toList(),
       };
@@ -6979,7 +6977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -7013,7 +7011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (title != null) 'title': title!,
       };
@@ -7049,7 +7047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (channelUrl != null) 'channelUrl': channelUrl!,
         if (displayName != null) 'displayName': displayName!,
@@ -7101,15 +7099,14 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('localizations')) {
-      localizations = (_json['localizations'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ChannelSectionLocalization.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      localizations =
+          (_json['localizations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ChannelSectionLocalization.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('snippet')) {
       snippet = ChannelSectionSnippet.fromJson(
@@ -7121,7 +7118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentDetails != null) 'contentDetails': contentDetails!.toJson(),
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -7159,7 +7156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channels != null) 'channels': channels!,
         if (playlists != null) 'playlists': playlists!,
       };
@@ -7206,7 +7203,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -7229,7 +7226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (title != null) 'title': title!,
       };
 }
@@ -7307,7 +7304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (defaultLanguage != null) 'defaultLanguage': defaultLanguage!,
         if (localized != null) 'localized': localized!.toJson(),
@@ -7349,7 +7346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countries != null) 'countries': countries!,
         if (languages != null) 'languages': languages!,
         if (regions != null) 'regions': regions!,
@@ -7450,7 +7447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (defaultLanguage != null) 'defaultLanguage': defaultLanguage!,
         if (defaultTab != null) 'defaultTab': defaultTab!,
@@ -7542,7 +7539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (country != null) 'country': country!,
         if (customUrl != null) 'customUrl': customUrl!,
         if (defaultLanguage != null) 'defaultLanguage': defaultLanguage!,
@@ -7592,7 +7589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commentCount != null) 'commentCount': commentCount!,
         if (hiddenSubscriberCount != null)
           'hiddenSubscriberCount': hiddenSubscriberCount!,
@@ -7649,7 +7646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isLinked != null) 'isLinked': isLinked!,
         if (longUploadsStatus != null) 'longUploadsStatus': longUploadsStatus!,
         if (madeForKids != null) 'madeForKids': madeForKids!,
@@ -7679,7 +7676,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (storeName != null) 'storeName': storeName!,
         if (storeUrl != null) 'storeUrl': storeUrl!,
       };
@@ -7711,7 +7708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topicCategories != null) 'topicCategories': topicCategories!,
         if (topicIds != null) 'topicIds': topicIds!,
       };
@@ -7751,7 +7748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -7819,7 +7816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -7955,7 +7952,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorChannelId != null)
           'authorChannelId': authorChannelId!.toJson(),
         if (authorChannelUrl != null) 'authorChannelUrl': authorChannelUrl!,
@@ -7988,7 +7985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (value != null) 'value': value!,
       };
 }
@@ -8039,7 +8036,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -8108,7 +8105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -8142,7 +8139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comments != null)
           'comments': comments!.map((value) => value.toJson()).toList(),
       };
@@ -8201,7 +8198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canReply != null) 'canReply': canReply!,
         if (channelId != null) 'channelId': channelId!,
         if (isPublic != null) 'isPublic': isPublic!,
@@ -9335,7 +9332,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (acbRating != null) 'acbRating': acbRating!,
         if (agcomRating != null) 'agcomRating': agcomRating!,
         if (anatelRating != null) 'anatelRating': anatelRating!,
@@ -9432,7 +9429,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (typeId != null) 'typeId': typeId!,
         if (url != null) 'url': url!,
@@ -9464,7 +9461,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (altitude != null) 'altitude': altitude!,
         if (latitude != null) 'latitude': latitude!,
         if (longitude != null) 'longitude': longitude!,
@@ -9507,7 +9504,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -9559,7 +9556,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -9589,7 +9586,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hl != null) 'hl': hl!,
         if (name != null) 'name': name!,
       };
@@ -9630,7 +9627,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -9682,7 +9679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -9712,7 +9709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gl != null) 'gl': gl!,
         if (name != null) 'name': name!,
       };
@@ -9905,7 +9902,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundImageUrl != null)
           'backgroundImageUrl': backgroundImageUrl!.toJson(),
         if (bannerExternalUrl != null) 'bannerExternalUrl': bannerExternalUrl!,
@@ -10002,7 +9999,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupIngestionAddress != null)
           'backupIngestionAddress': backupIngestionAddress!,
         if (ingestionAddress != null) 'ingestionAddress': ingestionAddress!,
@@ -10067,7 +10064,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageBytes != null) 'imageBytes': imageBytes!,
         if (imageUrl != null) 'imageUrl': imageUrl!,
         if (position != null) 'position': position!.toJson(),
@@ -10104,7 +10101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cornerPosition != null) 'cornerPosition': cornerPosition!,
         if (type != null) 'type': type!,
       };
@@ -10149,7 +10146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (durationMs != null) 'durationMs': durationMs!,
         if (offsetMs != null) 'offsetMs': offsetMs!,
         if (type != null) 'type': type!,
@@ -10167,7 +10164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (value != null) 'value': value!,
       };
 }
@@ -10184,7 +10181,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -10253,7 +10250,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentDetails != null) 'contentDetails': contentDetails!.toJson(),
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -10456,7 +10453,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundStreamId != null) 'boundStreamId': boundStreamId!,
         if (boundStreamLastUpdateTimeMs != null)
           'boundStreamLastUpdateTimeMs':
@@ -10549,7 +10546,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -10662,7 +10659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actualEndTime != null)
           'actualEndTime': actualEndTime!.toIso8601String(),
         if (actualStartTime != null)
@@ -10704,7 +10701,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (totalChatCount != null) 'totalChatCount': totalChatCount!,
       };
 }
@@ -10791,7 +10788,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (lifeCycleStatus != null) 'lifeCycleStatus': lifeCycleStatus!,
         if (liveBroadcastPriority != null)
           'liveBroadcastPriority': liveBroadcastPriority!,
@@ -10837,7 +10834,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -10878,7 +10875,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (banDurationSeconds != null)
           'banDurationSeconds': banDurationSeconds!,
         if (bannedUserDetails != null)
@@ -10918,7 +10915,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amountDisplayString != null)
           'amountDisplayString': amountDisplayString!,
         if (amountMicros != null) 'amountMicros': amountMicros!,
@@ -10970,7 +10967,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorDetails != null) 'authorDetails': authorDetails!.toJson(),
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -11033,7 +11030,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (channelUrl != null) 'channelUrl': channelUrl!,
         if (displayName != null) 'displayName': displayName!,
@@ -11056,7 +11053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deletedMessageId != null) 'deletedMessageId': deletedMessageId!,
       };
 }
@@ -11128,7 +11125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -11156,7 +11153,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (retractedMessageId != null)
           'retractedMessageId': retractedMessageId!,
       };
@@ -11278,7 +11275,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorChannelId != null) 'authorChannelId': authorChannelId!,
         if (displayMessage != null) 'displayMessage': displayMessage!,
         if (fanFundingEventDetails != null)
@@ -11340,7 +11337,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -11415,7 +11412,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -11449,7 +11446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (liveChatId != null) 'liveChatId': liveChatId!,
         if (moderatorDetails != null)
           'moderatorDetails': moderatorDetails!.toJson(),
@@ -11494,7 +11491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amountDisplayString != null)
           'amountDisplayString': amountDisplayString!,
         if (amountMicros != null) 'amountMicros': amountMicros!,
@@ -11543,7 +11540,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amountDisplayString != null)
           'amountDisplayString': amountDisplayString!,
         if (amountMicros != null) 'amountMicros': amountMicros!,
@@ -11566,7 +11563,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (messageText != null) 'messageText': messageText!,
       };
 }
@@ -11601,7 +11598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (banDurationSeconds != null)
           'banDurationSeconds': banDurationSeconds!,
         if (banType != null) 'banType': banType!,
@@ -11671,7 +11668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cdn != null) 'cdn': cdn!.toJson(),
         if (contentDetails != null) 'contentDetails': contentDetails!.toJson(),
         if (etag != null) 'etag': etag!,
@@ -11751,7 +11748,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (reason != null) 'reason': reason!,
         if (severity != null) 'severity': severity!,
@@ -11792,7 +11789,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (closedCaptionsIngestionUrl != null)
           'closedCaptionsIngestionUrl': closedCaptionsIngestionUrl!,
         if (isReusable != null) 'isReusable': isReusable!,
@@ -11833,7 +11830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configurationIssues != null)
           'configurationIssues':
               configurationIssues!.map((value) => value.toJson()).toList(),
@@ -11908,7 +11905,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -11962,7 +11959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (description != null) 'description': description!,
         if (isDefaultStream != null) 'isDefaultStream': isDefaultStream!,
@@ -11997,7 +11994,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (healthStatus != null) 'healthStatus': healthStatus!.toJson(),
         if (streamStatus != null) 'streamStatus': streamStatus!,
       };
@@ -12028,7 +12025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (default_ != null) 'default': default_!,
         if (defaultLanguage != null)
           'defaultLanguage': defaultLanguage!.toJson(),
@@ -12052,7 +12049,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (language != null) 'language': language!,
         if (value != null) 'value': value!,
       };
@@ -12089,7 +12086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (snippet != null) 'snippet': snippet!.toJson(),
@@ -12154,7 +12151,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -12194,7 +12191,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creatorChannelId != null) 'creatorChannelId': creatorChannelId!,
         if (memberDetails != null) 'memberDetails': memberDetails!.toJson(),
         if (membershipsDetails != null)
@@ -12252,7 +12249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessibleLevels != null) 'accessibleLevels': accessibleLevels!,
         if (highestAccessibleLevel != null)
           'highestAccessibleLevel': highestAccessibleLevel!,
@@ -12289,7 +12286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (memberSince != null) 'memberSince': memberSince!,
         if (memberTotalDurationMonths != null)
           'memberTotalDurationMonths': memberTotalDurationMonths!,
@@ -12323,7 +12320,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (level != null) 'level': level!,
         if (memberSince != null) 'memberSince': memberSince!,
         if (memberTotalDurationMonths != null)
@@ -12370,7 +12367,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -12419,7 +12416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -12448,7 +12445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creatorChannelId != null) 'creatorChannelId': creatorChannelId!,
         if (levelDetails != null) 'levelDetails': levelDetails!.toJson(),
       };
@@ -12489,7 +12486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (broadcastStreamDelayMs != null)
           'broadcastStreamDelayMs': broadcastStreamDelayMs!,
         if (embedHtml != null) 'embedHtml': embedHtml!,
@@ -12518,7 +12515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resultsPerPage != null) 'resultsPerPage': resultsPerPage!,
         if (totalResults != null) 'totalResults': totalResults!,
       };
@@ -12586,15 +12583,14 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('localizations')) {
-      localizations = (_json['localizations'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              PlaylistLocalization.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      localizations =
+          (_json['localizations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          PlaylistLocalization.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('player')) {
       player = PlaylistPlayer.fromJson(
@@ -12610,7 +12606,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentDetails != null) 'contentDetails': contentDetails!.toJson(),
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -12636,7 +12632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (itemCount != null) 'itemCount': itemCount!,
       };
 }
@@ -12710,7 +12706,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentDetails != null) 'contentDetails': contentDetails!.toJson(),
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -12770,7 +12766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endAt != null) 'endAt': endAt!,
         if (note != null) 'note': note!,
         if (startAt != null) 'startAt': startAt!,
@@ -12847,7 +12843,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -12949,7 +12945,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (channelTitle != null) 'channelTitle': channelTitle!,
         if (description != null) 'description': description!,
@@ -12983,7 +12979,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (privacyStatus != null) 'privacyStatus': privacyStatus!,
       };
 }
@@ -13055,7 +13051,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -13089,7 +13085,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (title != null) 'title': title!,
       };
@@ -13107,7 +13103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (embedHtml != null) 'embedHtml': embedHtml!,
       };
 }
@@ -13197,7 +13193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (channelTitle != null) 'channelTitle': channelTitle!,
         if (defaultLanguage != null) 'defaultLanguage': defaultLanguage!,
@@ -13227,7 +13223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (privacyStatus != null) 'privacyStatus': privacyStatus!,
       };
 }
@@ -13251,7 +13247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (property != null) 'property': property!,
         if (value != null) 'value': value!,
       };
@@ -13269,7 +13265,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!.toJson(),
       };
 }
@@ -13318,7 +13314,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (kind != null) 'kind': kind!,
         if (playlistId != null) 'playlistId': playlistId!,
@@ -13397,7 +13393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -13457,7 +13453,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!.toJson(),
         if (kind != null) 'kind': kind!,
@@ -13531,7 +13527,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (channelTitle != null) 'channelTitle': channelTitle!,
         if (description != null) 'description': description!,
@@ -13598,7 +13594,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentDetails != null) 'contentDetails': contentDetails!.toJson(),
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
@@ -13639,7 +13635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activityType != null) 'activityType': activityType!,
         if (newItemCount != null) 'newItemCount': newItemCount!,
         if (totalItemCount != null) 'totalItemCount': totalItemCount!,
@@ -13711,7 +13707,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -13783,7 +13779,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (channelTitle != null) 'channelTitle': channelTitle!,
         if (description != null) 'description': description!,
@@ -13827,7 +13823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelId != null) 'channelId': channelId!,
         if (description != null) 'description': description!,
         if (thumbnails != null) 'thumbnails': thumbnails!.toJson(),
@@ -13870,7 +13866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -13936,7 +13932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -14027,7 +14023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amountMicros != null) 'amountMicros': amountMicros!,
         if (channelId != null) 'channelId': channelId!,
         if (commentText != null) 'commentText': commentText!,
@@ -14072,7 +14068,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (altText != null) 'altText': altText!,
         if (altTextLanguage != null) 'altTextLanguage': altTextLanguage!,
         if (stickerId != null) 'stickerId': stickerId!,
@@ -14099,7 +14095,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gaia != null) 'gaia': gaia!,
         if (id != null) 'id': id!,
         if (snippet != null) 'snippet': snippet!.toJson(),
@@ -14113,7 +14109,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A *third party account link* resource represents a link between a YouTube
@@ -14160,7 +14156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (kind != null) 'kind': kind!,
         if (linkingToken != null) 'linkingToken': linkingToken!,
@@ -14196,7 +14192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelToStoreLink != null)
           'channelToStoreLink': channelToStoreLink!.toJson(),
         if (type != null) 'type': type!,
@@ -14222,7 +14218,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (linkStatus != null) 'linkStatus': linkStatus!,
       };
 }
@@ -14252,7 +14248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (url != null) 'url': url!,
         if (width != null) 'width': width!,
@@ -14301,7 +14297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (default_ != null) 'default': default_!.toJson(),
         if (high != null) 'high': high!.toJson(),
         if (maxres != null) 'maxres': maxres!.toJson(),
@@ -14351,7 +14347,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -14369,7 +14365,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A *video* resource represents a YouTube video.
@@ -14501,15 +14497,14 @@
           _json['liveStreamingDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('localizations')) {
-      localizations = (_json['localizations'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              VideoLocalization.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      localizations =
+          (_json['localizations'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          VideoLocalization.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('monetizationDetails')) {
       monetizationDetails = VideoMonetizationDetails.fromJson(
@@ -14553,7 +14548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ageGating != null) 'ageGating': ageGating!.toJson(),
         if (contentDetails != null) 'contentDetails': contentDetails!.toJson(),
         if (etag != null) 'etag': etag!,
@@ -14623,7 +14618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comments != null) 'comments': comments!,
         if (language != null) 'language': language!,
         if (reasonId != null) 'reasonId': reasonId!,
@@ -14669,7 +14664,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -14719,7 +14714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -14754,7 +14749,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
         if (secondaryReasons != null)
           'secondaryReasons':
@@ -14780,7 +14775,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (label != null) 'label': label!,
       };
@@ -14822,7 +14817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alcoholContent != null) 'alcoholContent': alcoholContent!,
         if (restricted != null) 'restricted': restricted!,
         if (videoGameRating != null) 'videoGameRating': videoGameRating!,
@@ -14865,7 +14860,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
@@ -14943,7 +14938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -14982,7 +14977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignable != null) 'assignable': assignable!,
         if (channelId != null) 'channelId': channelId!,
         if (title != null) 'title': title!,
@@ -15088,7 +15083,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caption != null) 'caption': caption!,
         if (contentRating != null) 'contentRating': contentRating!.toJson(),
         if (countryRestriction != null)
@@ -15137,7 +15132,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowed != null) 'allowed': allowed!,
         if (blocked != null) 'blocked': blocked!,
       };
@@ -15241,7 +15236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioStreams != null)
           'audioStreams': audioStreams!.map((value) => value.toJson()).toList(),
         if (bitrateBps != null) 'bitrateBps': bitrateBps!,
@@ -15289,7 +15284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bitrateBps != null) 'bitrateBps': bitrateBps!,
         if (channelCount != null) 'channelCount': channelCount!,
         if (codec != null) 'codec': codec!,
@@ -15365,7 +15360,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aspectRatio != null) 'aspectRatio': aspectRatio!,
         if (bitrateBps != null) 'bitrateBps': bitrateBps!,
         if (codec != null) 'codec': codec!,
@@ -15442,7 +15437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -15524,7 +15519,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeLiveChatId != null) 'activeLiveChatId': activeLiveChatId!,
         if (actualEndTime != null)
           'actualEndTime': actualEndTime!.toIso8601String(),
@@ -15557,7 +15552,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (title != null) 'title': title!,
       };
@@ -15577,7 +15572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (access != null) 'access': access!.toJson(),
       };
 }
@@ -15606,7 +15601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (embedHeight != null) 'embedHeight': embedHeight!,
         if (embedHtml != null) 'embedHtml': embedHtml!,
         if (embedWidth != null) 'embedWidth': embedWidth!,
@@ -15714,7 +15709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (editorSuggestionsAvailability != null)
           'editorSuggestionsAvailability': editorSuggestionsAvailability!,
         if (fileDetailsAvailability != null)
@@ -15770,7 +15765,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (partsProcessed != null) 'partsProcessed': partsProcessed!,
         if (partsTotal != null) 'partsTotal': partsTotal!,
         if (timeLeftMs != null) 'timeLeftMs': timeLeftMs!,
@@ -15795,7 +15790,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Basic details about rating of a video.
@@ -15821,7 +15816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rating != null) 'rating': rating!,
         if (videoId != null) 'videoId': videoId!,
       };
@@ -15868,7 +15863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (eventId != null) 'eventId': eventId!,
         if (items != null)
@@ -15905,7 +15900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null) 'location': location!.toJson(),
         if (locationDescription != null)
           'locationDescription': locationDescription!,
@@ -16020,7 +16015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoryId != null) 'categoryId': categoryId!,
         if (channelId != null) 'channelId': channelId!,
         if (channelTitle != null) 'channelTitle': channelTitle!,
@@ -16079,7 +16074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commentCount != null) 'commentCount': commentCount!,
         if (dislikeCount != null) 'dislikeCount': dislikeCount!,
         if (favoriteCount != null) 'favoriteCount': favoriteCount!,
@@ -16200,7 +16195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (embeddable != null) 'embeddable': embeddable!,
         if (failureReason != null) 'failureReason': failureReason!,
         if (license != null) 'license': license!,
@@ -16280,7 +16275,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (editorSuggestions != null) 'editorSuggestions': editorSuggestions!,
         if (processingErrors != null) 'processingErrors': processingErrors!,
         if (processingHints != null) 'processingHints': processingHints!,
@@ -16318,7 +16313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoryRestricts != null) 'categoryRestricts': categoryRestricts!,
         if (tag != null) 'tag': tag!,
       };
@@ -16365,7 +16360,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (relevantTopicIds != null) 'relevantTopicIds': relevantTopicIds!,
         if (topicCategories != null) 'topicCategories': topicCategories!,
         if (topicIds != null) 'topicIds': topicIds!,
@@ -16400,7 +16395,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null) 'backgroundColor': backgroundColor!,
         if (featuredPlaylistId != null)
           'featuredPlaylistId': featuredPlaylistId!,
diff --git a/generated/googleapis/lib/youtubeanalytics/v2.dart b/generated/googleapis/lib/youtubeanalytics/v2.dart
index 956ff1d..0f7afa8 100644
--- a/generated/googleapis/lib/youtubeanalytics/v2.dart
+++ b/generated/googleapis/lib/youtubeanalytics/v2.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -597,7 +596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null) 'errors': errors!.toJson(),
       };
 }
@@ -680,7 +679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (argument != null) 'argument': argument!,
         if (code != null) 'code': code!,
         if (debugInfo != null) 'debugInfo': debugInfo!,
@@ -735,7 +734,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (error != null)
           'error': error!.map((value) => value.toJson()).toList(),
@@ -793,7 +792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentDetails != null) 'contentDetails': contentDetails!.toJson(),
         if (errors != null) 'errors': errors!.toJson(),
         if (etag != null) 'etag': etag!,
@@ -825,7 +824,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (itemCount != null) 'itemCount': itemCount!,
         if (itemType != null) 'itemType': itemType!,
       };
@@ -887,7 +886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null) 'errors': errors!.toJson(),
         if (etag != null) 'etag': etag!,
         if (groupId != null) 'groupId': groupId!,
@@ -919,7 +918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (kind != null) 'kind': kind!,
       };
@@ -948,7 +947,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publishedAt != null) 'publishedAt': publishedAt!,
         if (title != null) 'title': title!,
       };
@@ -993,7 +992,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null) 'errors': errors!.toJson(),
         if (etag != null) 'etag': etag!,
         if (items != null)
@@ -1048,7 +1047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null) 'errors': errors!.toJson(),
         if (etag != null) 'etag': etag!,
         if (items != null)
@@ -1122,7 +1121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnHeaders != null)
           'columnHeaders':
               columnHeaders!.map((value) => value.toJson()).toList(),
@@ -1157,7 +1156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnType != null) 'columnType': columnType!,
         if (dataType != null) 'dataType': dataType!,
         if (name != null) 'name': name!,
diff --git a/generated/googleapis/lib/youtubereporting/v1.dart b/generated/googleapis/lib/youtubereporting/v1.dart
index 630776e..b6755dd 100644
--- a/generated/googleapis/lib/youtubereporting/v1.dart
+++ b/generated/googleapis/lib/youtubereporting/v1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -528,7 +527,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// gdata
@@ -582,7 +581,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blobGeneration != null) 'blobGeneration': blobGeneration!,
         if (blobId != null) 'blobId': blobId!,
         if (downloadReadHandle != null)
@@ -705,7 +704,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blobRef != null) 'blobRef': blobRef!,
         if (blobstore2Info != null) 'blobstore2Info': blobstore2Info!.toJson(),
         if (cosmoBinaryReference != null)
@@ -758,7 +757,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bestGuess != null) 'bestGuess': bestGuess!,
         if (fromBytes != null) 'fromBytes': fromBytes!,
         if (fromFileName != null) 'fromFileName': fromFileName!,
@@ -806,7 +805,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checksumsLocation != null)
           'checksumsLocation': checksumsLocation!.toJson(),
         if (chunkSizeBytes != null) 'chunkSizeBytes': chunkSizeBytes!,
@@ -830,7 +829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectLocation != null) 'objectLocation': objectLocation!.toJson(),
       };
 }
@@ -862,7 +861,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checksumsInfo != null) 'checksumsInfo': checksumsInfo!.toJson(),
         if (objectInfo != null) 'objectInfo': objectInfo!.toJson(),
         if (objectVersion != null) 'objectVersion': objectVersion!,
@@ -889,7 +888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectVersion != null) 'objectVersion': objectVersion!,
         if (originalObject != null) 'originalObject': originalObject!.toJson(),
       };
@@ -914,7 +913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectSizeBytes != null) 'objectSizeBytes': objectSizeBytes!,
         if (objectVersion != null) 'objectVersion': objectVersion!,
       };
@@ -939,7 +938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowGzipCompression != null)
           'allowGzipCompression': allowGzipCompression!,
         if (ignoreRange != null) 'ignoreRange': ignoreRange!,
@@ -1211,7 +1210,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (bigstoreObjectRef != null) 'bigstoreObjectRef': bigstoreObjectRef!,
         if (blobRef != null) 'blobRef': blobRef!,
@@ -1280,7 +1279,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketName != null) 'bucketName': bucketName!,
         if (generation != null) 'generation': generation!,
         if (objectName != null) 'objectName': objectName!,
@@ -1339,7 +1338,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (expireTime != null) 'expireTime': expireTime!,
         if (id != null) 'id': id!,
@@ -1374,7 +1373,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -1406,7 +1405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (reportTypes != null)
           'reportTypes': reportTypes!.map((value) => value.toJson()).toList(),
@@ -1439,7 +1438,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (reports != null)
           'reports': reports!.map((value) => value.toJson()).toList(),
@@ -1502,7 +1501,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (downloadUrl != null) 'downloadUrl': downloadUrl!,
         if (endTime != null) 'endTime': endTime!,
@@ -1551,7 +1550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deprecateTime != null) 'deprecateTime': deprecateTime!,
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
diff --git a/generated/googleapis/test/abusiveexperiencereport/v1_test.dart b/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
index 298a3f4..3b404b6 100644
--- a/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
+++ b/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
@@ -112,7 +112,9 @@
   unittest.group('obj-schema-SiteSummaryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteSummaryResponse();
-      var od = api.SiteSummaryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteSummaryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteSummaryResponse(od as api.SiteSummaryResponse);
     });
   });
@@ -120,7 +122,9 @@
   unittest.group('obj-schema-ViolatingSitesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildViolatingSitesResponse();
-      var od = api.ViolatingSitesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ViolatingSitesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkViolatingSitesResponse(od as api.ViolatingSitesResponse);
     });
   });
diff --git a/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart b/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
index 6df8007..6d81691 100644
--- a/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
+++ b/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
@@ -185,7 +185,9 @@
   unittest.group('obj-schema-AmpUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAmpUrl();
-      var od = api.AmpUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AmpUrl.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAmpUrl(od as api.AmpUrl);
     });
   });
@@ -193,7 +195,9 @@
   unittest.group('obj-schema-AmpUrlError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAmpUrlError();
-      var od = api.AmpUrlError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AmpUrlError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAmpUrlError(od as api.AmpUrlError);
     });
   });
@@ -201,7 +205,9 @@
   unittest.group('obj-schema-BatchGetAmpUrlsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetAmpUrlsRequest();
-      var od = api.BatchGetAmpUrlsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetAmpUrlsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetAmpUrlsRequest(od as api.BatchGetAmpUrlsRequest);
     });
   });
@@ -209,7 +215,9 @@
   unittest.group('obj-schema-BatchGetAmpUrlsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetAmpUrlsResponse();
-      var od = api.BatchGetAmpUrlsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetAmpUrlsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetAmpUrlsResponse(od as api.BatchGetAmpUrlsResponse);
     });
   });
diff --git a/generated/googleapis/test/accessapproval/v1_test.dart b/generated/googleapis/test/accessapproval/v1_test.dart
index 2f784f7..affe26d 100644
--- a/generated/googleapis/test/accessapproval/v1_test.dart
+++ b/generated/googleapis/test/accessapproval/v1_test.dart
@@ -379,7 +379,9 @@
   unittest.group('obj-schema-AccessApprovalSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessApprovalSettings();
-      var od = api.AccessApprovalSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessApprovalSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessApprovalSettings(od as api.AccessApprovalSettings);
     });
   });
@@ -387,7 +389,9 @@
   unittest.group('obj-schema-AccessLocations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessLocations();
-      var od = api.AccessLocations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessLocations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessLocations(od as api.AccessLocations);
     });
   });
@@ -395,7 +399,9 @@
   unittest.group('obj-schema-AccessReason', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessReason();
-      var od = api.AccessReason.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessReason.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessReason(od as api.AccessReason);
     });
   });
@@ -403,7 +409,9 @@
   unittest.group('obj-schema-ApprovalRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApprovalRequest();
-      var od = api.ApprovalRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApprovalRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApprovalRequest(od as api.ApprovalRequest);
     });
   });
@@ -411,7 +419,9 @@
   unittest.group('obj-schema-ApproveApprovalRequestMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApproveApprovalRequestMessage();
-      var od = api.ApproveApprovalRequestMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApproveApprovalRequestMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApproveApprovalRequestMessage(
           od as api.ApproveApprovalRequestMessage);
     });
@@ -420,7 +430,9 @@
   unittest.group('obj-schema-ApproveDecision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApproveDecision();
-      var od = api.ApproveDecision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApproveDecision.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApproveDecision(od as api.ApproveDecision);
     });
   });
@@ -428,7 +440,9 @@
   unittest.group('obj-schema-DismissApprovalRequestMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDismissApprovalRequestMessage();
-      var od = api.DismissApprovalRequestMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DismissApprovalRequestMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDismissApprovalRequestMessage(
           od as api.DismissApprovalRequestMessage);
     });
@@ -437,7 +451,9 @@
   unittest.group('obj-schema-DismissDecision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDismissDecision();
-      var od = api.DismissDecision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DismissDecision.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDismissDecision(od as api.DismissDecision);
     });
   });
@@ -445,7 +461,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -453,7 +470,9 @@
   unittest.group('obj-schema-EnrolledService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnrolledService();
-      var od = api.EnrolledService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnrolledService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnrolledService(od as api.EnrolledService);
     });
   });
@@ -461,7 +480,9 @@
   unittest.group('obj-schema-ListApprovalRequestsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListApprovalRequestsResponse();
-      var od = api.ListApprovalRequestsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListApprovalRequestsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListApprovalRequestsResponse(od as api.ListApprovalRequestsResponse);
     });
   });
@@ -469,7 +490,9 @@
   unittest.group('obj-schema-ResourceProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceProperties();
-      var od = api.ResourceProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceProperties(od as api.ResourceProperties);
     });
   });
diff --git a/generated/googleapis/test/accesscontextmanager/v1_test.dart b/generated/googleapis/test/accesscontextmanager/v1_test.dart
index bf8c166..1c21370 100644
--- a/generated/googleapis/test/accesscontextmanager/v1_test.dart
+++ b/generated/googleapis/test/accesscontextmanager/v1_test.dart
@@ -1619,7 +1619,9 @@
   unittest.group('obj-schema-AccessLevel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessLevel();
-      var od = api.AccessLevel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessLevel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessLevel(od as api.AccessLevel);
     });
   });
@@ -1627,7 +1629,9 @@
   unittest.group('obj-schema-AccessPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessPolicy();
-      var od = api.AccessPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessPolicy(od as api.AccessPolicy);
     });
   });
@@ -1635,7 +1639,9 @@
   unittest.group('obj-schema-ApiOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiOperation();
-      var od = api.ApiOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApiOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApiOperation(od as api.ApiOperation);
     });
   });
@@ -1643,7 +1649,9 @@
   unittest.group('obj-schema-BasicLevel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicLevel();
-      var od = api.BasicLevel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BasicLevel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBasicLevel(od as api.BasicLevel);
     });
   });
@@ -1651,7 +1659,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -1659,7 +1669,9 @@
   unittest.group('obj-schema-CommitServicePerimetersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitServicePerimetersRequest();
-      var od = api.CommitServicePerimetersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitServicePerimetersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitServicePerimetersRequest(
           od as api.CommitServicePerimetersRequest);
     });
@@ -1668,7 +1680,9 @@
   unittest.group('obj-schema-CommitServicePerimetersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitServicePerimetersResponse();
-      var od = api.CommitServicePerimetersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitServicePerimetersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitServicePerimetersResponse(
           od as api.CommitServicePerimetersResponse);
     });
@@ -1677,7 +1691,9 @@
   unittest.group('obj-schema-Condition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCondition();
-      var od = api.Condition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Condition.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCondition(od as api.Condition);
     });
   });
@@ -1685,7 +1701,9 @@
   unittest.group('obj-schema-CustomLevel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomLevel();
-      var od = api.CustomLevel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomLevel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomLevel(od as api.CustomLevel);
     });
   });
@@ -1693,7 +1711,9 @@
   unittest.group('obj-schema-DevicePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDevicePolicy();
-      var od = api.DevicePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DevicePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDevicePolicy(od as api.DevicePolicy);
     });
   });
@@ -1701,7 +1721,9 @@
   unittest.group('obj-schema-EgressFrom', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEgressFrom();
-      var od = api.EgressFrom.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EgressFrom.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEgressFrom(od as api.EgressFrom);
     });
   });
@@ -1709,7 +1731,9 @@
   unittest.group('obj-schema-EgressPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEgressPolicy();
-      var od = api.EgressPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EgressPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEgressPolicy(od as api.EgressPolicy);
     });
   });
@@ -1717,7 +1741,9 @@
   unittest.group('obj-schema-EgressTo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEgressTo();
-      var od = api.EgressTo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EgressTo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEgressTo(od as api.EgressTo);
     });
   });
@@ -1725,7 +1751,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1733,7 +1760,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1741,7 +1769,9 @@
   unittest.group('obj-schema-GcpUserAccessBinding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcpUserAccessBinding();
-      var od = api.GcpUserAccessBinding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GcpUserAccessBinding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGcpUserAccessBinding(od as api.GcpUserAccessBinding);
     });
   });
@@ -1749,7 +1779,9 @@
   unittest.group('obj-schema-IngressFrom', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIngressFrom();
-      var od = api.IngressFrom.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IngressFrom.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIngressFrom(od as api.IngressFrom);
     });
   });
@@ -1757,7 +1789,9 @@
   unittest.group('obj-schema-IngressPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIngressPolicy();
-      var od = api.IngressPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IngressPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIngressPolicy(od as api.IngressPolicy);
     });
   });
@@ -1765,7 +1799,9 @@
   unittest.group('obj-schema-IngressSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIngressSource();
-      var od = api.IngressSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IngressSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIngressSource(od as api.IngressSource);
     });
   });
@@ -1773,7 +1809,9 @@
   unittest.group('obj-schema-IngressTo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIngressTo();
-      var od = api.IngressTo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IngressTo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIngressTo(od as api.IngressTo);
     });
   });
@@ -1781,7 +1819,9 @@
   unittest.group('obj-schema-ListAccessLevelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAccessLevelsResponse();
-      var od = api.ListAccessLevelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAccessLevelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAccessLevelsResponse(od as api.ListAccessLevelsResponse);
     });
   });
@@ -1789,7 +1829,9 @@
   unittest.group('obj-schema-ListAccessPoliciesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAccessPoliciesResponse();
-      var od = api.ListAccessPoliciesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAccessPoliciesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAccessPoliciesResponse(od as api.ListAccessPoliciesResponse);
     });
   });
@@ -1797,7 +1839,9 @@
   unittest.group('obj-schema-ListGcpUserAccessBindingsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGcpUserAccessBindingsResponse();
-      var od = api.ListGcpUserAccessBindingsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGcpUserAccessBindingsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGcpUserAccessBindingsResponse(
           od as api.ListGcpUserAccessBindingsResponse);
     });
@@ -1806,7 +1850,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1814,7 +1860,9 @@
   unittest.group('obj-schema-ListServicePerimetersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServicePerimetersResponse();
-      var od = api.ListServicePerimetersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServicePerimetersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServicePerimetersResponse(
           od as api.ListServicePerimetersResponse);
     });
@@ -1823,7 +1871,9 @@
   unittest.group('obj-schema-MethodSelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMethodSelector();
-      var od = api.MethodSelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MethodSelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMethodSelector(od as api.MethodSelector);
     });
   });
@@ -1831,7 +1881,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1839,7 +1891,9 @@
   unittest.group('obj-schema-OsConstraint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOsConstraint();
-      var od = api.OsConstraint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OsConstraint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOsConstraint(od as api.OsConstraint);
     });
   });
@@ -1847,7 +1901,9 @@
   unittest.group('obj-schema-ReplaceAccessLevelsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceAccessLevelsRequest();
-      var od = api.ReplaceAccessLevelsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceAccessLevelsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceAccessLevelsRequest(od as api.ReplaceAccessLevelsRequest);
     });
   });
@@ -1855,7 +1911,9 @@
   unittest.group('obj-schema-ReplaceAccessLevelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceAccessLevelsResponse();
-      var od = api.ReplaceAccessLevelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceAccessLevelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceAccessLevelsResponse(od as api.ReplaceAccessLevelsResponse);
     });
   });
@@ -1863,7 +1921,9 @@
   unittest.group('obj-schema-ReplaceServicePerimetersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceServicePerimetersRequest();
-      var od = api.ReplaceServicePerimetersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceServicePerimetersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceServicePerimetersRequest(
           od as api.ReplaceServicePerimetersRequest);
     });
@@ -1872,7 +1932,9 @@
   unittest.group('obj-schema-ReplaceServicePerimetersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceServicePerimetersResponse();
-      var od = api.ReplaceServicePerimetersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceServicePerimetersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceServicePerimetersResponse(
           od as api.ReplaceServicePerimetersResponse);
     });
@@ -1881,7 +1943,9 @@
   unittest.group('obj-schema-ServicePerimeter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServicePerimeter();
-      var od = api.ServicePerimeter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServicePerimeter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServicePerimeter(od as api.ServicePerimeter);
     });
   });
@@ -1889,7 +1953,9 @@
   unittest.group('obj-schema-ServicePerimeterConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServicePerimeterConfig();
-      var od = api.ServicePerimeterConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServicePerimeterConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServicePerimeterConfig(od as api.ServicePerimeterConfig);
     });
   });
@@ -1897,7 +1963,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1905,7 +1973,9 @@
   unittest.group('obj-schema-VpcAccessibleServices', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpcAccessibleServices();
-      var od = api.VpcAccessibleServices.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpcAccessibleServices.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpcAccessibleServices(od as api.VpcAccessibleServices);
     });
   });
diff --git a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
index 1b16efd..43a4e16 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
@@ -2024,7 +2024,9 @@
   unittest.group('obj-schema-AccountBidderLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountBidderLocation();
-      var od = api.AccountBidderLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountBidderLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountBidderLocation(od as api.AccountBidderLocation);
     });
   });
@@ -2032,7 +2034,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -2040,7 +2044,9 @@
   unittest.group('obj-schema-AccountsList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsList();
-      var od = api.AccountsList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsList(od as api.AccountsList);
     });
   });
@@ -2048,7 +2054,9 @@
   unittest.group('obj-schema-BillingInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingInfo();
-      var od = api.BillingInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingInfo(od as api.BillingInfo);
     });
   });
@@ -2056,7 +2064,9 @@
   unittest.group('obj-schema-BillingInfoList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingInfoList();
-      var od = api.BillingInfoList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingInfoList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingInfoList(od as api.BillingInfoList);
     });
   });
@@ -2064,7 +2074,9 @@
   unittest.group('obj-schema-Budget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBudget();
-      var od = api.Budget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Budget.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBudget(od as api.Budget);
     });
   });
@@ -2072,7 +2084,9 @@
   unittest.group('obj-schema-CreativeAdTechnologyProviders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeAdTechnologyProviders();
-      var od = api.CreativeAdTechnologyProviders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeAdTechnologyProviders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeAdTechnologyProviders(
           od as api.CreativeAdTechnologyProviders);
     });
@@ -2081,7 +2095,9 @@
   unittest.group('obj-schema-CreativeCorrections', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeCorrections();
-      var od = api.CreativeCorrections.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeCorrections.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeCorrections(od as api.CreativeCorrections);
     });
   });
@@ -2089,7 +2105,9 @@
   unittest.group('obj-schema-CreativeDisapprovalReasons', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeDisapprovalReasons();
-      var od = api.CreativeDisapprovalReasons.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeDisapprovalReasons.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeDisapprovalReasons(od as api.CreativeDisapprovalReasons);
     });
   });
@@ -2097,7 +2115,9 @@
   unittest.group('obj-schema-CreativeFilteringReasonsReasons', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeFilteringReasonsReasons();
-      var od = api.CreativeFilteringReasonsReasons.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeFilteringReasonsReasons.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeFilteringReasonsReasons(
           od as api.CreativeFilteringReasonsReasons);
     });
@@ -2106,7 +2126,9 @@
   unittest.group('obj-schema-CreativeFilteringReasons', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeFilteringReasons();
-      var od = api.CreativeFilteringReasons.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeFilteringReasons.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeFilteringReasons(od as api.CreativeFilteringReasons);
     });
   });
@@ -2114,7 +2136,9 @@
   unittest.group('obj-schema-CreativeNativeAdAppIcon', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeNativeAdAppIcon();
-      var od = api.CreativeNativeAdAppIcon.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeNativeAdAppIcon.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeNativeAdAppIcon(od as api.CreativeNativeAdAppIcon);
     });
   });
@@ -2122,7 +2146,9 @@
   unittest.group('obj-schema-CreativeNativeAdImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeNativeAdImage();
-      var od = api.CreativeNativeAdImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeNativeAdImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeNativeAdImage(od as api.CreativeNativeAdImage);
     });
   });
@@ -2130,7 +2156,9 @@
   unittest.group('obj-schema-CreativeNativeAdLogo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeNativeAdLogo();
-      var od = api.CreativeNativeAdLogo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeNativeAdLogo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeNativeAdLogo(od as api.CreativeNativeAdLogo);
     });
   });
@@ -2138,7 +2166,9 @@
   unittest.group('obj-schema-CreativeNativeAd', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeNativeAd();
-      var od = api.CreativeNativeAd.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeNativeAd.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeNativeAd(od as api.CreativeNativeAd);
     });
   });
@@ -2146,7 +2176,9 @@
   unittest.group('obj-schema-Creative', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreative();
-      var od = api.Creative.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Creative.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCreative(od as api.Creative);
     });
   });
@@ -2154,7 +2186,9 @@
   unittest.group('obj-schema-CreativesList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativesList();
-      var od = api.CreativesList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativesList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativesList(od as api.CreativesList);
     });
   });
@@ -2162,7 +2196,9 @@
   unittest.group('obj-schema-DirectDeal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectDeal();
-      var od = api.DirectDeal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DirectDeal.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDirectDeal(od as api.DirectDeal);
     });
   });
@@ -2170,7 +2206,9 @@
   unittest.group('obj-schema-DirectDealsList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectDealsList();
-      var od = api.DirectDealsList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectDealsList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectDealsList(od as api.DirectDealsList);
     });
   });
@@ -2178,7 +2216,9 @@
   unittest.group('obj-schema-PerformanceReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerformanceReport();
-      var od = api.PerformanceReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerformanceReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerformanceReport(od as api.PerformanceReport);
     });
   });
@@ -2186,7 +2226,9 @@
   unittest.group('obj-schema-PerformanceReportList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerformanceReportList();
-      var od = api.PerformanceReportList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerformanceReportList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerformanceReportList(od as api.PerformanceReportList);
     });
   });
@@ -2194,7 +2236,9 @@
   unittest.group('obj-schema-PretargetingConfigDimensions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfigDimensions();
-      var od = api.PretargetingConfigDimensions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfigDimensions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfigDimensions(od as api.PretargetingConfigDimensions);
     });
   });
@@ -2202,7 +2246,9 @@
   unittest.group('obj-schema-PretargetingConfigExcludedPlacements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfigExcludedPlacements();
-      var od = api.PretargetingConfigExcludedPlacements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfigExcludedPlacements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfigExcludedPlacements(
           od as api.PretargetingConfigExcludedPlacements);
     });
@@ -2211,7 +2257,9 @@
   unittest.group('obj-schema-PretargetingConfigPlacements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfigPlacements();
-      var od = api.PretargetingConfigPlacements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfigPlacements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfigPlacements(od as api.PretargetingConfigPlacements);
     });
   });
@@ -2219,7 +2267,9 @@
   unittest.group('obj-schema-PretargetingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfig();
-      var od = api.PretargetingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfig(od as api.PretargetingConfig);
     });
   });
@@ -2227,7 +2277,9 @@
   unittest.group('obj-schema-PretargetingConfigList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfigList();
-      var od = api.PretargetingConfigList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfigList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfigList(od as api.PretargetingConfigList);
     });
   });
diff --git a/generated/googleapis/test/adexchangebuyer/v1_4_test.dart b/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
index 5ead42b..701032c 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
@@ -4781,7 +4781,9 @@
   unittest.group('obj-schema-AccountBidderLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountBidderLocation();
-      var od = api.AccountBidderLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountBidderLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountBidderLocation(od as api.AccountBidderLocation);
     });
   });
@@ -4789,7 +4791,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -4797,7 +4801,9 @@
   unittest.group('obj-schema-AccountsList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsList();
-      var od = api.AccountsList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsList(od as api.AccountsList);
     });
   });
@@ -4805,7 +4811,9 @@
   unittest.group('obj-schema-AddOrderDealsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddOrderDealsRequest();
-      var od = api.AddOrderDealsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddOrderDealsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddOrderDealsRequest(od as api.AddOrderDealsRequest);
     });
   });
@@ -4813,7 +4821,9 @@
   unittest.group('obj-schema-AddOrderDealsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddOrderDealsResponse();
-      var od = api.AddOrderDealsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddOrderDealsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddOrderDealsResponse(od as api.AddOrderDealsResponse);
     });
   });
@@ -4821,7 +4831,9 @@
   unittest.group('obj-schema-AddOrderNotesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddOrderNotesRequest();
-      var od = api.AddOrderNotesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddOrderNotesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddOrderNotesRequest(od as api.AddOrderNotesRequest);
     });
   });
@@ -4829,7 +4841,9 @@
   unittest.group('obj-schema-AddOrderNotesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddOrderNotesResponse();
-      var od = api.AddOrderNotesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddOrderNotesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddOrderNotesResponse(od as api.AddOrderNotesResponse);
     });
   });
@@ -4837,7 +4851,9 @@
   unittest.group('obj-schema-BillingInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingInfo();
-      var od = api.BillingInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingInfo(od as api.BillingInfo);
     });
   });
@@ -4845,7 +4861,9 @@
   unittest.group('obj-schema-BillingInfoList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingInfoList();
-      var od = api.BillingInfoList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingInfoList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingInfoList(od as api.BillingInfoList);
     });
   });
@@ -4853,7 +4871,9 @@
   unittest.group('obj-schema-Budget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBudget();
-      var od = api.Budget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Budget.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBudget(od as api.Budget);
     });
   });
@@ -4861,7 +4881,8 @@
   unittest.group('obj-schema-Buyer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuyer();
-      var od = api.Buyer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Buyer.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuyer(od as api.Buyer);
     });
   });
@@ -4869,7 +4890,9 @@
   unittest.group('obj-schema-ContactInformation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContactInformation();
-      var od = api.ContactInformation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContactInformation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContactInformation(od as api.ContactInformation);
     });
   });
@@ -4877,7 +4900,9 @@
   unittest.group('obj-schema-CreateOrdersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateOrdersRequest();
-      var od = api.CreateOrdersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateOrdersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateOrdersRequest(od as api.CreateOrdersRequest);
     });
   });
@@ -4885,7 +4910,9 @@
   unittest.group('obj-schema-CreateOrdersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateOrdersResponse();
-      var od = api.CreateOrdersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateOrdersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateOrdersResponse(od as api.CreateOrdersResponse);
     });
   });
@@ -4893,7 +4920,9 @@
   unittest.group('obj-schema-CreativeAdTechnologyProviders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeAdTechnologyProviders();
-      var od = api.CreativeAdTechnologyProviders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeAdTechnologyProviders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeAdTechnologyProviders(
           od as api.CreativeAdTechnologyProviders);
     });
@@ -4902,7 +4931,9 @@
   unittest.group('obj-schema-CreativeCorrectionsContexts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeCorrectionsContexts();
-      var od = api.CreativeCorrectionsContexts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeCorrectionsContexts.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeCorrectionsContexts(od as api.CreativeCorrectionsContexts);
     });
   });
@@ -4910,7 +4941,9 @@
   unittest.group('obj-schema-CreativeCorrections', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeCorrections();
-      var od = api.CreativeCorrections.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeCorrections.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeCorrections(od as api.CreativeCorrections);
     });
   });
@@ -4918,7 +4951,9 @@
   unittest.group('obj-schema-CreativeFilteringReasonsReasons', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeFilteringReasonsReasons();
-      var od = api.CreativeFilteringReasonsReasons.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeFilteringReasonsReasons.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeFilteringReasonsReasons(
           od as api.CreativeFilteringReasonsReasons);
     });
@@ -4927,7 +4962,9 @@
   unittest.group('obj-schema-CreativeFilteringReasons', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeFilteringReasons();
-      var od = api.CreativeFilteringReasons.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeFilteringReasons.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeFilteringReasons(od as api.CreativeFilteringReasons);
     });
   });
@@ -4935,7 +4972,9 @@
   unittest.group('obj-schema-CreativeNativeAdAppIcon', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeNativeAdAppIcon();
-      var od = api.CreativeNativeAdAppIcon.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeNativeAdAppIcon.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeNativeAdAppIcon(od as api.CreativeNativeAdAppIcon);
     });
   });
@@ -4943,7 +4982,9 @@
   unittest.group('obj-schema-CreativeNativeAdImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeNativeAdImage();
-      var od = api.CreativeNativeAdImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeNativeAdImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeNativeAdImage(od as api.CreativeNativeAdImage);
     });
   });
@@ -4951,7 +4992,9 @@
   unittest.group('obj-schema-CreativeNativeAdLogo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeNativeAdLogo();
-      var od = api.CreativeNativeAdLogo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeNativeAdLogo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeNativeAdLogo(od as api.CreativeNativeAdLogo);
     });
   });
@@ -4959,7 +5002,9 @@
   unittest.group('obj-schema-CreativeNativeAd', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeNativeAd();
-      var od = api.CreativeNativeAd.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeNativeAd.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeNativeAd(od as api.CreativeNativeAd);
     });
   });
@@ -4967,7 +5012,9 @@
   unittest.group('obj-schema-CreativeServingRestrictionsContexts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeServingRestrictionsContexts();
-      var od = api.CreativeServingRestrictionsContexts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeServingRestrictionsContexts.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeServingRestrictionsContexts(
           od as api.CreativeServingRestrictionsContexts);
     });
@@ -4977,8 +5024,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeServingRestrictionsDisapprovalReasons();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.CreativeServingRestrictionsDisapprovalReasons.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeServingRestrictionsDisapprovalReasons(
           od as api.CreativeServingRestrictionsDisapprovalReasons);
     });
@@ -4987,7 +5035,9 @@
   unittest.group('obj-schema-CreativeServingRestrictions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeServingRestrictions();
-      var od = api.CreativeServingRestrictions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeServingRestrictions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeServingRestrictions(od as api.CreativeServingRestrictions);
     });
   });
@@ -4995,7 +5045,9 @@
   unittest.group('obj-schema-Creative', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreative();
-      var od = api.Creative.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Creative.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCreative(od as api.Creative);
     });
   });
@@ -5003,7 +5055,9 @@
   unittest.group('obj-schema-CreativeDealIdsDealStatuses', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeDealIdsDealStatuses();
-      var od = api.CreativeDealIdsDealStatuses.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeDealIdsDealStatuses.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeDealIdsDealStatuses(od as api.CreativeDealIdsDealStatuses);
     });
   });
@@ -5011,7 +5065,9 @@
   unittest.group('obj-schema-CreativeDealIds', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeDealIds();
-      var od = api.CreativeDealIds.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeDealIds.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeDealIds(od as api.CreativeDealIds);
     });
   });
@@ -5019,7 +5075,9 @@
   unittest.group('obj-schema-CreativesList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativesList();
-      var od = api.CreativesList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativesList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativesList(od as api.CreativesList);
     });
   });
@@ -5027,7 +5085,9 @@
   unittest.group('obj-schema-DealServingMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealServingMetadata();
-      var od = api.DealServingMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DealServingMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDealServingMetadata(od as api.DealServingMetadata);
     });
   });
@@ -5035,7 +5095,9 @@
   unittest.group('obj-schema-DealServingMetadataDealPauseStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealServingMetadataDealPauseStatus();
-      var od = api.DealServingMetadataDealPauseStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DealServingMetadataDealPauseStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDealServingMetadataDealPauseStatus(
           od as api.DealServingMetadataDealPauseStatus);
     });
@@ -5044,7 +5106,9 @@
   unittest.group('obj-schema-DealTerms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealTerms();
-      var od = api.DealTerms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DealTerms.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDealTerms(od as api.DealTerms);
     });
   });
@@ -5052,7 +5116,9 @@
   unittest.group('obj-schema-DealTermsGuaranteedFixedPriceTerms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealTermsGuaranteedFixedPriceTerms();
-      var od = api.DealTermsGuaranteedFixedPriceTerms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DealTermsGuaranteedFixedPriceTerms.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDealTermsGuaranteedFixedPriceTerms(
           od as api.DealTermsGuaranteedFixedPriceTerms);
     });
@@ -5062,8 +5128,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealTermsGuaranteedFixedPriceTermsBillingInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.DealTermsGuaranteedFixedPriceTermsBillingInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkDealTermsGuaranteedFixedPriceTermsBillingInfo(
           od as api.DealTermsGuaranteedFixedPriceTermsBillingInfo);
     });
@@ -5072,7 +5139,9 @@
   unittest.group('obj-schema-DealTermsNonGuaranteedAuctionTerms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealTermsNonGuaranteedAuctionTerms();
-      var od = api.DealTermsNonGuaranteedAuctionTerms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DealTermsNonGuaranteedAuctionTerms.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDealTermsNonGuaranteedAuctionTerms(
           od as api.DealTermsNonGuaranteedAuctionTerms);
     });
@@ -5081,7 +5150,9 @@
   unittest.group('obj-schema-DealTermsNonGuaranteedFixedPriceTerms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealTermsNonGuaranteedFixedPriceTerms();
-      var od = api.DealTermsNonGuaranteedFixedPriceTerms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DealTermsNonGuaranteedFixedPriceTerms.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDealTermsNonGuaranteedFixedPriceTerms(
           od as api.DealTermsNonGuaranteedFixedPriceTerms);
     });
@@ -5090,7 +5161,9 @@
   unittest.group('obj-schema-DealTermsRubiconNonGuaranteedTerms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealTermsRubiconNonGuaranteedTerms();
-      var od = api.DealTermsRubiconNonGuaranteedTerms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DealTermsRubiconNonGuaranteedTerms.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDealTermsRubiconNonGuaranteedTerms(
           od as api.DealTermsRubiconNonGuaranteedTerms);
     });
@@ -5099,7 +5172,9 @@
   unittest.group('obj-schema-DeleteOrderDealsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteOrderDealsRequest();
-      var od = api.DeleteOrderDealsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteOrderDealsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteOrderDealsRequest(od as api.DeleteOrderDealsRequest);
     });
   });
@@ -5107,7 +5182,9 @@
   unittest.group('obj-schema-DeleteOrderDealsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteOrderDealsResponse();
-      var od = api.DeleteOrderDealsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteOrderDealsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteOrderDealsResponse(od as api.DeleteOrderDealsResponse);
     });
   });
@@ -5115,7 +5192,9 @@
   unittest.group('obj-schema-DeliveryControl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeliveryControl();
-      var od = api.DeliveryControl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeliveryControl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeliveryControl(od as api.DeliveryControl);
     });
   });
@@ -5123,7 +5202,9 @@
   unittest.group('obj-schema-DeliveryControlFrequencyCap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeliveryControlFrequencyCap();
-      var od = api.DeliveryControlFrequencyCap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeliveryControlFrequencyCap.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeliveryControlFrequencyCap(od as api.DeliveryControlFrequencyCap);
     });
   });
@@ -5131,7 +5212,9 @@
   unittest.group('obj-schema-Dimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimension();
-      var od = api.Dimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Dimension.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDimension(od as api.Dimension);
     });
   });
@@ -5139,7 +5222,9 @@
   unittest.group('obj-schema-DimensionDimensionValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionDimensionValue();
-      var od = api.DimensionDimensionValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionDimensionValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionDimensionValue(od as api.DimensionDimensionValue);
     });
   });
@@ -5147,7 +5232,9 @@
   unittest.group('obj-schema-EditAllOrderDealsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEditAllOrderDealsRequest();
-      var od = api.EditAllOrderDealsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EditAllOrderDealsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEditAllOrderDealsRequest(od as api.EditAllOrderDealsRequest);
     });
   });
@@ -5155,7 +5242,9 @@
   unittest.group('obj-schema-EditAllOrderDealsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEditAllOrderDealsResponse();
-      var od = api.EditAllOrderDealsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EditAllOrderDealsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEditAllOrderDealsResponse(od as api.EditAllOrderDealsResponse);
     });
   });
@@ -5163,7 +5252,9 @@
   unittest.group('obj-schema-GetOffersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetOffersResponse();
-      var od = api.GetOffersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetOffersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetOffersResponse(od as api.GetOffersResponse);
     });
   });
@@ -5171,7 +5262,9 @@
   unittest.group('obj-schema-GetOrderDealsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetOrderDealsResponse();
-      var od = api.GetOrderDealsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetOrderDealsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetOrderDealsResponse(od as api.GetOrderDealsResponse);
     });
   });
@@ -5179,7 +5272,9 @@
   unittest.group('obj-schema-GetOrderNotesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetOrderNotesResponse();
-      var od = api.GetOrderNotesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetOrderNotesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetOrderNotesResponse(od as api.GetOrderNotesResponse);
     });
   });
@@ -5187,7 +5282,9 @@
   unittest.group('obj-schema-GetOrdersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetOrdersResponse();
-      var od = api.GetOrdersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetOrdersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetOrdersResponse(od as api.GetOrdersResponse);
     });
   });
@@ -5195,7 +5292,9 @@
   unittest.group('obj-schema-GetPublisherProfilesByAccountIdResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPublisherProfilesByAccountIdResponse();
-      var od = api.GetPublisherProfilesByAccountIdResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPublisherProfilesByAccountIdResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPublisherProfilesByAccountIdResponse(
           od as api.GetPublisherProfilesByAccountIdResponse);
     });
@@ -5204,7 +5303,9 @@
   unittest.group('obj-schema-MarketplaceDeal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMarketplaceDeal();
-      var od = api.MarketplaceDeal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MarketplaceDeal.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMarketplaceDeal(od as api.MarketplaceDeal);
     });
   });
@@ -5212,7 +5313,9 @@
   unittest.group('obj-schema-MarketplaceDealParty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMarketplaceDealParty();
-      var od = api.MarketplaceDealParty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MarketplaceDealParty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMarketplaceDealParty(od as api.MarketplaceDealParty);
     });
   });
@@ -5220,7 +5323,9 @@
   unittest.group('obj-schema-MarketplaceLabel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMarketplaceLabel();
-      var od = api.MarketplaceLabel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MarketplaceLabel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMarketplaceLabel(od as api.MarketplaceLabel);
     });
   });
@@ -5228,7 +5333,9 @@
   unittest.group('obj-schema-MarketplaceNote', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMarketplaceNote();
-      var od = api.MarketplaceNote.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MarketplaceNote.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMarketplaceNote(od as api.MarketplaceNote);
     });
   });
@@ -5236,7 +5343,9 @@
   unittest.group('obj-schema-MobileApplication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileApplication();
-      var od = api.MobileApplication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MobileApplication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMobileApplication(od as api.MobileApplication);
     });
   });
@@ -5244,7 +5353,9 @@
   unittest.group('obj-schema-PerformanceReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerformanceReport();
-      var od = api.PerformanceReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerformanceReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerformanceReport(od as api.PerformanceReport);
     });
   });
@@ -5252,7 +5363,9 @@
   unittest.group('obj-schema-PerformanceReportList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerformanceReportList();
-      var od = api.PerformanceReportList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerformanceReportList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerformanceReportList(od as api.PerformanceReportList);
     });
   });
@@ -5260,7 +5373,9 @@
   unittest.group('obj-schema-PretargetingConfigDimensions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfigDimensions();
-      var od = api.PretargetingConfigDimensions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfigDimensions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfigDimensions(od as api.PretargetingConfigDimensions);
     });
   });
@@ -5268,7 +5383,9 @@
   unittest.group('obj-schema-PretargetingConfigExcludedPlacements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfigExcludedPlacements();
-      var od = api.PretargetingConfigExcludedPlacements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfigExcludedPlacements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfigExcludedPlacements(
           od as api.PretargetingConfigExcludedPlacements);
     });
@@ -5277,7 +5394,9 @@
   unittest.group('obj-schema-PretargetingConfigPlacements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfigPlacements();
-      var od = api.PretargetingConfigPlacements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfigPlacements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfigPlacements(od as api.PretargetingConfigPlacements);
     });
   });
@@ -5285,7 +5404,9 @@
   unittest.group('obj-schema-PretargetingConfigVideoPlayerSizes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfigVideoPlayerSizes();
-      var od = api.PretargetingConfigVideoPlayerSizes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfigVideoPlayerSizes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfigVideoPlayerSizes(
           od as api.PretargetingConfigVideoPlayerSizes);
     });
@@ -5294,7 +5415,9 @@
   unittest.group('obj-schema-PretargetingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfig();
-      var od = api.PretargetingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfig(od as api.PretargetingConfig);
     });
   });
@@ -5302,7 +5425,9 @@
   unittest.group('obj-schema-PretargetingConfigList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfigList();
-      var od = api.PretargetingConfigList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfigList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfigList(od as api.PretargetingConfigList);
     });
   });
@@ -5310,7 +5435,8 @@
   unittest.group('obj-schema-Price', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrice();
-      var od = api.Price.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Price.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPrice(od as api.Price);
     });
   });
@@ -5318,7 +5444,9 @@
   unittest.group('obj-schema-PricePerBuyer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPricePerBuyer();
-      var od = api.PricePerBuyer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PricePerBuyer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPricePerBuyer(od as api.PricePerBuyer);
     });
   });
@@ -5326,7 +5454,9 @@
   unittest.group('obj-schema-PrivateData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrivateData();
-      var od = api.PrivateData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PrivateData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPrivateData(od as api.PrivateData);
     });
   });
@@ -5334,7 +5464,9 @@
   unittest.group('obj-schema-Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProduct();
-      var od = api.Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Product.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProduct(od as api.Product);
     });
   });
@@ -5342,7 +5474,9 @@
   unittest.group('obj-schema-Proposal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProposal();
-      var od = api.Proposal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Proposal.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProposal(od as api.Proposal);
     });
   });
@@ -5350,7 +5484,9 @@
   unittest.group('obj-schema-PublisherProfileApiProto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublisherProfileApiProto();
-      var od = api.PublisherProfileApiProto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublisherProfileApiProto.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublisherProfileApiProto(od as api.PublisherProfileApiProto);
     });
   });
@@ -5358,7 +5494,9 @@
   unittest.group('obj-schema-PublisherProvidedForecast', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublisherProvidedForecast();
-      var od = api.PublisherProvidedForecast.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublisherProvidedForecast.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublisherProvidedForecast(od as api.PublisherProvidedForecast);
     });
   });
@@ -5366,7 +5504,9 @@
   unittest.group('obj-schema-Seller', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeller();
-      var od = api.Seller.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Seller.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSeller(od as api.Seller);
     });
   });
@@ -5374,7 +5514,9 @@
   unittest.group('obj-schema-SharedTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSharedTargeting();
-      var od = api.SharedTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SharedTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSharedTargeting(od as api.SharedTargeting);
     });
   });
@@ -5382,7 +5524,9 @@
   unittest.group('obj-schema-TargetingValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingValue();
-      var od = api.TargetingValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingValue(od as api.TargetingValue);
     });
   });
@@ -5390,7 +5534,9 @@
   unittest.group('obj-schema-TargetingValueCreativeSize', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingValueCreativeSize();
-      var od = api.TargetingValueCreativeSize.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingValueCreativeSize.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingValueCreativeSize(od as api.TargetingValueCreativeSize);
     });
   });
@@ -5398,7 +5544,9 @@
   unittest.group('obj-schema-TargetingValueDayPartTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingValueDayPartTargeting();
-      var od = api.TargetingValueDayPartTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingValueDayPartTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingValueDayPartTargeting(
           od as api.TargetingValueDayPartTargeting);
     });
@@ -5407,7 +5555,9 @@
   unittest.group('obj-schema-TargetingValueDayPartTargetingDayPart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingValueDayPartTargetingDayPart();
-      var od = api.TargetingValueDayPartTargetingDayPart.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingValueDayPartTargetingDayPart.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingValueDayPartTargetingDayPart(
           od as api.TargetingValueDayPartTargetingDayPart);
     });
@@ -5416,7 +5566,9 @@
   unittest.group('obj-schema-TargetingValueDemogAgeCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingValueDemogAgeCriteria();
-      var od = api.TargetingValueDemogAgeCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingValueDemogAgeCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingValueDemogAgeCriteria(
           od as api.TargetingValueDemogAgeCriteria);
     });
@@ -5425,7 +5577,9 @@
   unittest.group('obj-schema-TargetingValueDemogGenderCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingValueDemogGenderCriteria();
-      var od = api.TargetingValueDemogGenderCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingValueDemogGenderCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingValueDemogGenderCriteria(
           od as api.TargetingValueDemogGenderCriteria);
     });
@@ -5434,7 +5588,9 @@
   unittest.group('obj-schema-TargetingValueRequestPlatformTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingValueRequestPlatformTargeting();
-      var od = api.TargetingValueRequestPlatformTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingValueRequestPlatformTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingValueRequestPlatformTargeting(
           od as api.TargetingValueRequestPlatformTargeting);
     });
@@ -5443,7 +5599,9 @@
   unittest.group('obj-schema-TargetingValueSize', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingValueSize();
-      var od = api.TargetingValueSize.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingValueSize.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingValueSize(od as api.TargetingValueSize);
     });
   });
@@ -5451,7 +5609,9 @@
   unittest.group('obj-schema-UpdatePrivateAuctionProposalRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdatePrivateAuctionProposalRequest();
-      var od = api.UpdatePrivateAuctionProposalRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdatePrivateAuctionProposalRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdatePrivateAuctionProposalRequest(
           od as api.UpdatePrivateAuctionProposalRequest);
     });
diff --git a/generated/googleapis/test/adexperiencereport/v1_test.dart b/generated/googleapis/test/adexperiencereport/v1_test.dart
index de8d186..9e1d829 100644
--- a/generated/googleapis/test/adexperiencereport/v1_test.dart
+++ b/generated/googleapis/test/adexperiencereport/v1_test.dart
@@ -154,7 +154,9 @@
   unittest.group('obj-schema-PlatformSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlatformSummary();
-      var od = api.PlatformSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlatformSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlatformSummary(od as api.PlatformSummary);
     });
   });
@@ -162,7 +164,9 @@
   unittest.group('obj-schema-SiteSummaryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteSummaryResponse();
-      var od = api.SiteSummaryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteSummaryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteSummaryResponse(od as api.SiteSummaryResponse);
     });
   });
@@ -170,7 +174,9 @@
   unittest.group('obj-schema-ViolatingSitesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildViolatingSitesResponse();
-      var od = api.ViolatingSitesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ViolatingSitesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkViolatingSitesResponse(od as api.ViolatingSitesResponse);
     });
   });
diff --git a/generated/googleapis/test/admin/datatransfer_v1_test.dart b/generated/googleapis/test/admin/datatransfer_v1_test.dart
index 7fe01a6..6d4ab91 100644
--- a/generated/googleapis/test/admin/datatransfer_v1_test.dart
+++ b/generated/googleapis/test/admin/datatransfer_v1_test.dart
@@ -329,7 +329,9 @@
   unittest.group('obj-schema-Application', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplication();
-      var od = api.Application.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Application.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplication(od as api.Application);
     });
   });
@@ -337,7 +339,9 @@
   unittest.group('obj-schema-ApplicationDataTransfer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationDataTransfer();
-      var od = api.ApplicationDataTransfer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationDataTransfer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationDataTransfer(od as api.ApplicationDataTransfer);
     });
   });
@@ -345,7 +349,9 @@
   unittest.group('obj-schema-ApplicationTransferParam', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationTransferParam();
-      var od = api.ApplicationTransferParam.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationTransferParam.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationTransferParam(od as api.ApplicationTransferParam);
     });
   });
@@ -353,7 +359,9 @@
   unittest.group('obj-schema-ApplicationsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationsListResponse();
-      var od = api.ApplicationsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationsListResponse(od as api.ApplicationsListResponse);
     });
   });
@@ -361,7 +369,9 @@
   unittest.group('obj-schema-DataTransfer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataTransfer();
-      var od = api.DataTransfer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataTransfer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataTransfer(od as api.DataTransfer);
     });
   });
@@ -369,7 +379,9 @@
   unittest.group('obj-schema-DataTransfersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataTransfersListResponse();
-      var od = api.DataTransfersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataTransfersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataTransfersListResponse(od as api.DataTransfersListResponse);
     });
   });
diff --git a/generated/googleapis/test/admin/directory_v1_test.dart b/generated/googleapis/test/admin/directory_v1_test.dart
index a22e828..b37aaef 100644
--- a/generated/googleapis/test/admin/directory_v1_test.dart
+++ b/generated/googleapis/test/admin/directory_v1_test.dart
@@ -4785,7 +4785,8 @@
   unittest.group('obj-schema-Alias', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAlias();
-      var od = api.Alias.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Alias.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAlias(od as api.Alias);
     });
   });
@@ -4793,7 +4794,9 @@
   unittest.group('obj-schema-Aliases', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAliases();
-      var od = api.Aliases.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Aliases.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAliases(od as api.Aliases);
     });
   });
@@ -4801,7 +4804,8 @@
   unittest.group('obj-schema-Asp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsp();
-      var od = api.Asp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Asp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAsp(od as api.Asp);
     });
   });
@@ -4809,7 +4813,8 @@
   unittest.group('obj-schema-Asps', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsps();
-      var od = api.Asps.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Asps.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAsps(od as api.Asps);
     });
   });
@@ -4817,7 +4822,9 @@
   unittest.group('obj-schema-Building', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuilding();
-      var od = api.Building.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Building.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuilding(od as api.Building);
     });
   });
@@ -4825,7 +4832,9 @@
   unittest.group('obj-schema-BuildingAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildingAddress();
-      var od = api.BuildingAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildingAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildingAddress(od as api.BuildingAddress);
     });
   });
@@ -4833,7 +4842,9 @@
   unittest.group('obj-schema-BuildingCoordinates', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildingCoordinates();
-      var od = api.BuildingCoordinates.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildingCoordinates.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildingCoordinates(od as api.BuildingCoordinates);
     });
   });
@@ -4841,7 +4852,9 @@
   unittest.group('obj-schema-Buildings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildings();
-      var od = api.Buildings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Buildings.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuildings(od as api.Buildings);
     });
   });
@@ -4849,7 +4862,9 @@
   unittest.group('obj-schema-CalendarResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCalendarResource();
-      var od = api.CalendarResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CalendarResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCalendarResource(od as api.CalendarResource);
     });
   });
@@ -4857,7 +4872,9 @@
   unittest.group('obj-schema-CalendarResources', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCalendarResources();
-      var od = api.CalendarResources.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CalendarResources.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCalendarResources(od as api.CalendarResources);
     });
   });
@@ -4865,7 +4882,9 @@
   unittest.group('obj-schema-Channel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannel();
-      var od = api.Channel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Channel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChannel(od as api.Channel);
     });
   });
@@ -4873,7 +4892,9 @@
   unittest.group('obj-schema-ChromeOsDeviceActiveTimeRanges', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDeviceActiveTimeRanges();
-      var od = api.ChromeOsDeviceActiveTimeRanges.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDeviceActiveTimeRanges.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDeviceActiveTimeRanges(
           od as api.ChromeOsDeviceActiveTimeRanges);
     });
@@ -4883,8 +4904,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDeviceCpuStatusReportsCpuTemperatureInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ChromeOsDeviceCpuStatusReportsCpuTemperatureInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDeviceCpuStatusReportsCpuTemperatureInfo(
           od as api.ChromeOsDeviceCpuStatusReportsCpuTemperatureInfo);
     });
@@ -4893,7 +4915,9 @@
   unittest.group('obj-schema-ChromeOsDeviceCpuStatusReports', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDeviceCpuStatusReports();
-      var od = api.ChromeOsDeviceCpuStatusReports.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDeviceCpuStatusReports.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDeviceCpuStatusReports(
           od as api.ChromeOsDeviceCpuStatusReports);
     });
@@ -4902,7 +4926,9 @@
   unittest.group('obj-schema-ChromeOsDeviceDeviceFiles', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDeviceDeviceFiles();
-      var od = api.ChromeOsDeviceDeviceFiles.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDeviceDeviceFiles.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDeviceDeviceFiles(od as api.ChromeOsDeviceDeviceFiles);
     });
   });
@@ -4910,8 +4936,9 @@
   unittest.group('obj-schema-ChromeOsDeviceDiskVolumeReportsVolumeInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDeviceDiskVolumeReportsVolumeInfo();
-      var od =
-          api.ChromeOsDeviceDiskVolumeReportsVolumeInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDeviceDiskVolumeReportsVolumeInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDeviceDiskVolumeReportsVolumeInfo(
           od as api.ChromeOsDeviceDiskVolumeReportsVolumeInfo);
     });
@@ -4920,7 +4947,9 @@
   unittest.group('obj-schema-ChromeOsDeviceDiskVolumeReports', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDeviceDiskVolumeReports();
-      var od = api.ChromeOsDeviceDiskVolumeReports.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDeviceDiskVolumeReports.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDeviceDiskVolumeReports(
           od as api.ChromeOsDeviceDiskVolumeReports);
     });
@@ -4929,7 +4958,9 @@
   unittest.group('obj-schema-ChromeOsDeviceLastKnownNetwork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDeviceLastKnownNetwork();
-      var od = api.ChromeOsDeviceLastKnownNetwork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDeviceLastKnownNetwork.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDeviceLastKnownNetwork(
           od as api.ChromeOsDeviceLastKnownNetwork);
     });
@@ -4938,7 +4969,9 @@
   unittest.group('obj-schema-ChromeOsDeviceSystemRamFreeReports', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDeviceSystemRamFreeReports();
-      var od = api.ChromeOsDeviceSystemRamFreeReports.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDeviceSystemRamFreeReports.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDeviceSystemRamFreeReports(
           od as api.ChromeOsDeviceSystemRamFreeReports);
     });
@@ -4947,7 +4980,9 @@
   unittest.group('obj-schema-ChromeOsDeviceTpmVersionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDeviceTpmVersionInfo();
-      var od = api.ChromeOsDeviceTpmVersionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDeviceTpmVersionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDeviceTpmVersionInfo(od as api.ChromeOsDeviceTpmVersionInfo);
     });
   });
@@ -4955,7 +4990,9 @@
   unittest.group('obj-schema-ChromeOsDevice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDevice();
-      var od = api.ChromeOsDevice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDevice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDevice(od as api.ChromeOsDevice);
     });
   });
@@ -4963,7 +5000,9 @@
   unittest.group('obj-schema-ChromeOsDeviceAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDeviceAction();
-      var od = api.ChromeOsDeviceAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDeviceAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDeviceAction(od as api.ChromeOsDeviceAction);
     });
   });
@@ -4971,7 +5010,9 @@
   unittest.group('obj-schema-ChromeOsDevices', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsDevices();
-      var od = api.ChromeOsDevices.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsDevices.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsDevices(od as api.ChromeOsDevices);
     });
   });
@@ -4979,7 +5020,9 @@
   unittest.group('obj-schema-ChromeOsMoveDevicesToOu', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChromeOsMoveDevicesToOu();
-      var od = api.ChromeOsMoveDevicesToOu.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChromeOsMoveDevicesToOu.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChromeOsMoveDevicesToOu(od as api.ChromeOsMoveDevicesToOu);
     });
   });
@@ -4987,7 +5030,9 @@
   unittest.group('obj-schema-Customer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomer();
-      var od = api.Customer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Customer.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCustomer(od as api.Customer);
     });
   });
@@ -4995,7 +5040,9 @@
   unittest.group('obj-schema-CustomerPostalAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerPostalAddress();
-      var od = api.CustomerPostalAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerPostalAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerPostalAddress(od as api.CustomerPostalAddress);
     });
   });
@@ -5003,7 +5050,9 @@
   unittest.group('obj-schema-DirectoryChromeosdevicesCommand', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectoryChromeosdevicesCommand();
-      var od = api.DirectoryChromeosdevicesCommand.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectoryChromeosdevicesCommand.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectoryChromeosdevicesCommand(
           od as api.DirectoryChromeosdevicesCommand);
     });
@@ -5012,7 +5061,9 @@
   unittest.group('obj-schema-DirectoryChromeosdevicesCommandResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectoryChromeosdevicesCommandResult();
-      var od = api.DirectoryChromeosdevicesCommandResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectoryChromeosdevicesCommandResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectoryChromeosdevicesCommandResult(
           od as api.DirectoryChromeosdevicesCommandResult);
     });
@@ -5021,8 +5072,9 @@
   unittest.group('obj-schema-DirectoryChromeosdevicesIssueCommandRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectoryChromeosdevicesIssueCommandRequest();
-      var od =
-          api.DirectoryChromeosdevicesIssueCommandRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectoryChromeosdevicesIssueCommandRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectoryChromeosdevicesIssueCommandRequest(
           od as api.DirectoryChromeosdevicesIssueCommandRequest);
     });
@@ -5031,8 +5083,9 @@
   unittest.group('obj-schema-DirectoryChromeosdevicesIssueCommandResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectoryChromeosdevicesIssueCommandResponse();
-      var od =
-          api.DirectoryChromeosdevicesIssueCommandResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectoryChromeosdevicesIssueCommandResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectoryChromeosdevicesIssueCommandResponse(
           od as api.DirectoryChromeosdevicesIssueCommandResponse);
     });
@@ -5041,7 +5094,9 @@
   unittest.group('obj-schema-DomainAlias', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainAlias();
-      var od = api.DomainAlias.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DomainAlias.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDomainAlias(od as api.DomainAlias);
     });
   });
@@ -5049,7 +5104,9 @@
   unittest.group('obj-schema-DomainAliases', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainAliases();
-      var od = api.DomainAliases.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DomainAliases.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDomainAliases(od as api.DomainAliases);
     });
   });
@@ -5057,7 +5114,9 @@
   unittest.group('obj-schema-Domains', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomains();
-      var od = api.Domains.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Domains.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDomains(od as api.Domains);
     });
   });
@@ -5065,7 +5124,9 @@
   unittest.group('obj-schema-Domains2', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomains2();
-      var od = api.Domains2.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Domains2.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDomains2(od as api.Domains2);
     });
   });
@@ -5073,7 +5134,9 @@
   unittest.group('obj-schema-Feature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeature();
-      var od = api.Feature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Feature.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFeature(od as api.Feature);
     });
   });
@@ -5081,7 +5144,9 @@
   unittest.group('obj-schema-FeatureInstance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeatureInstance();
-      var od = api.FeatureInstance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FeatureInstance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFeatureInstance(od as api.FeatureInstance);
     });
   });
@@ -5089,7 +5154,9 @@
   unittest.group('obj-schema-FeatureRename', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeatureRename();
-      var od = api.FeatureRename.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FeatureRename.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFeatureRename(od as api.FeatureRename);
     });
   });
@@ -5097,7 +5164,9 @@
   unittest.group('obj-schema-Features', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeatures();
-      var od = api.Features.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Features.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFeatures(od as api.Features);
     });
   });
@@ -5105,7 +5174,8 @@
   unittest.group('obj-schema-Group', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroup();
-      var od = api.Group.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Group.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGroup(od as api.Group);
     });
   });
@@ -5113,7 +5183,9 @@
   unittest.group('obj-schema-Groups', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroups();
-      var od = api.Groups.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Groups.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGroups(od as api.Groups);
     });
   });
@@ -5121,7 +5193,9 @@
   unittest.group('obj-schema-Member', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMember();
-      var od = api.Member.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Member.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMember(od as api.Member);
     });
   });
@@ -5129,7 +5203,9 @@
   unittest.group('obj-schema-Members', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembers();
-      var od = api.Members.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Members.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMembers(od as api.Members);
     });
   });
@@ -5137,7 +5213,9 @@
   unittest.group('obj-schema-MembersHasMember', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembersHasMember();
-      var od = api.MembersHasMember.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MembersHasMember.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMembersHasMember(od as api.MembersHasMember);
     });
   });
@@ -5145,7 +5223,9 @@
   unittest.group('obj-schema-MobileDeviceApplications', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileDeviceApplications();
-      var od = api.MobileDeviceApplications.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MobileDeviceApplications.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMobileDeviceApplications(od as api.MobileDeviceApplications);
     });
   });
@@ -5153,7 +5233,9 @@
   unittest.group('obj-schema-MobileDevice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileDevice();
-      var od = api.MobileDevice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MobileDevice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMobileDevice(od as api.MobileDevice);
     });
   });
@@ -5161,7 +5243,9 @@
   unittest.group('obj-schema-MobileDeviceAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileDeviceAction();
-      var od = api.MobileDeviceAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MobileDeviceAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMobileDeviceAction(od as api.MobileDeviceAction);
     });
   });
@@ -5169,7 +5253,9 @@
   unittest.group('obj-schema-MobileDevices', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileDevices();
-      var od = api.MobileDevices.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MobileDevices.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMobileDevices(od as api.MobileDevices);
     });
   });
@@ -5177,7 +5263,9 @@
   unittest.group('obj-schema-OrgUnit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrgUnit();
-      var od = api.OrgUnit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OrgUnit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrgUnit(od as api.OrgUnit);
     });
   });
@@ -5185,7 +5273,9 @@
   unittest.group('obj-schema-OrgUnits', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrgUnits();
-      var od = api.OrgUnits.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OrgUnits.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrgUnits(od as api.OrgUnits);
     });
   });
@@ -5193,7 +5283,9 @@
   unittest.group('obj-schema-Privilege', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrivilege();
-      var od = api.Privilege.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Privilege.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPrivilege(od as api.Privilege);
     });
   });
@@ -5201,7 +5293,9 @@
   unittest.group('obj-schema-Privileges', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrivileges();
-      var od = api.Privileges.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Privileges.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPrivileges(od as api.Privileges);
     });
   });
@@ -5209,7 +5303,9 @@
   unittest.group('obj-schema-RecentUsers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecentUsers();
-      var od = api.RecentUsers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RecentUsers.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRecentUsers(od as api.RecentUsers);
     });
   });
@@ -5217,7 +5313,9 @@
   unittest.group('obj-schema-RoleRolePrivileges', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoleRolePrivileges();
-      var od = api.RoleRolePrivileges.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoleRolePrivileges.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoleRolePrivileges(od as api.RoleRolePrivileges);
     });
   });
@@ -5225,7 +5323,8 @@
   unittest.group('obj-schema-Role', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRole();
-      var od = api.Role.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Role.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRole(od as api.Role);
     });
   });
@@ -5233,7 +5332,9 @@
   unittest.group('obj-schema-RoleAssignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoleAssignment();
-      var od = api.RoleAssignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoleAssignment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoleAssignment(od as api.RoleAssignment);
     });
   });
@@ -5241,7 +5342,9 @@
   unittest.group('obj-schema-RoleAssignments', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoleAssignments();
-      var od = api.RoleAssignments.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoleAssignments.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoleAssignments(od as api.RoleAssignments);
     });
   });
@@ -5249,7 +5352,8 @@
   unittest.group('obj-schema-Roles', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoles();
-      var od = api.Roles.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Roles.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRoles(od as api.Roles);
     });
   });
@@ -5257,7 +5361,9 @@
   unittest.group('obj-schema-Schema', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchema();
-      var od = api.Schema.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schema.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchema(od as api.Schema);
     });
   });
@@ -5265,7 +5371,9 @@
   unittest.group('obj-schema-SchemaFieldSpecNumericIndexingSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchemaFieldSpecNumericIndexingSpec();
-      var od = api.SchemaFieldSpecNumericIndexingSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SchemaFieldSpecNumericIndexingSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSchemaFieldSpecNumericIndexingSpec(
           od as api.SchemaFieldSpecNumericIndexingSpec);
     });
@@ -5274,7 +5382,9 @@
   unittest.group('obj-schema-SchemaFieldSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchemaFieldSpec();
-      var od = api.SchemaFieldSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SchemaFieldSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSchemaFieldSpec(od as api.SchemaFieldSpec);
     });
   });
@@ -5282,7 +5392,9 @@
   unittest.group('obj-schema-Schemas', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchemas();
-      var od = api.Schemas.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schemas.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchemas(od as api.Schemas);
     });
   });
@@ -5290,7 +5402,8 @@
   unittest.group('obj-schema-Token', () {
     unittest.test('to-json--from-json', () async {
       var o = buildToken();
-      var od = api.Token.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Token.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkToken(od as api.Token);
     });
   });
@@ -5298,7 +5411,9 @@
   unittest.group('obj-schema-Tokens', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTokens();
-      var od = api.Tokens.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Tokens.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTokens(od as api.Tokens);
     });
   });
@@ -5306,7 +5421,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
@@ -5314,7 +5430,9 @@
   unittest.group('obj-schema-UserAbout', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserAbout();
-      var od = api.UserAbout.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserAbout.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserAbout(od as api.UserAbout);
     });
   });
@@ -5322,7 +5440,9 @@
   unittest.group('obj-schema-UserAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserAddress();
-      var od = api.UserAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserAddress(od as api.UserAddress);
     });
   });
@@ -5330,7 +5450,9 @@
   unittest.group('obj-schema-UserCustomProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserCustomProperties();
-      var od = api.UserCustomProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserCustomProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserCustomProperties(od as api.UserCustomProperties);
     });
   });
@@ -5338,7 +5460,9 @@
   unittest.group('obj-schema-UserEmail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserEmail();
-      var od = api.UserEmail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserEmail.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserEmail(od as api.UserEmail);
     });
   });
@@ -5346,7 +5470,9 @@
   unittest.group('obj-schema-UserExternalId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserExternalId();
-      var od = api.UserExternalId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserExternalId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserExternalId(od as api.UserExternalId);
     });
   });
@@ -5354,7 +5480,9 @@
   unittest.group('obj-schema-UserGender', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserGender();
-      var od = api.UserGender.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserGender.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserGender(od as api.UserGender);
     });
   });
@@ -5362,7 +5490,9 @@
   unittest.group('obj-schema-UserIm', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserIm();
-      var od = api.UserIm.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserIm.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserIm(od as api.UserIm);
     });
   });
@@ -5370,7 +5500,9 @@
   unittest.group('obj-schema-UserKeyword', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserKeyword();
-      var od = api.UserKeyword.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserKeyword.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserKeyword(od as api.UserKeyword);
     });
   });
@@ -5378,7 +5510,9 @@
   unittest.group('obj-schema-UserLanguage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserLanguage();
-      var od = api.UserLanguage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserLanguage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserLanguage(od as api.UserLanguage);
     });
   });
@@ -5386,7 +5520,9 @@
   unittest.group('obj-schema-UserLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserLocation();
-      var od = api.UserLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserLocation(od as api.UserLocation);
     });
   });
@@ -5394,7 +5530,9 @@
   unittest.group('obj-schema-UserMakeAdmin', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserMakeAdmin();
-      var od = api.UserMakeAdmin.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserMakeAdmin.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserMakeAdmin(od as api.UserMakeAdmin);
     });
   });
@@ -5402,7 +5540,9 @@
   unittest.group('obj-schema-UserName', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserName();
-      var od = api.UserName.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserName.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserName(od as api.UserName);
     });
   });
@@ -5410,7 +5550,9 @@
   unittest.group('obj-schema-UserOrganization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserOrganization();
-      var od = api.UserOrganization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserOrganization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserOrganization(od as api.UserOrganization);
     });
   });
@@ -5418,7 +5560,9 @@
   unittest.group('obj-schema-UserPhone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserPhone();
-      var od = api.UserPhone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserPhone.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserPhone(od as api.UserPhone);
     });
   });
@@ -5426,7 +5570,9 @@
   unittest.group('obj-schema-UserPhoto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserPhoto();
-      var od = api.UserPhoto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserPhoto.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserPhoto(od as api.UserPhoto);
     });
   });
@@ -5434,7 +5580,9 @@
   unittest.group('obj-schema-UserPosixAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserPosixAccount();
-      var od = api.UserPosixAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserPosixAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserPosixAccount(od as api.UserPosixAccount);
     });
   });
@@ -5442,7 +5590,9 @@
   unittest.group('obj-schema-UserRelation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserRelation();
-      var od = api.UserRelation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserRelation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserRelation(od as api.UserRelation);
     });
   });
@@ -5450,7 +5600,9 @@
   unittest.group('obj-schema-UserSshPublicKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserSshPublicKey();
-      var od = api.UserSshPublicKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserSshPublicKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserSshPublicKey(od as api.UserSshPublicKey);
     });
   });
@@ -5458,7 +5610,9 @@
   unittest.group('obj-schema-UserUndelete', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserUndelete();
-      var od = api.UserUndelete.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserUndelete.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserUndelete(od as api.UserUndelete);
     });
   });
@@ -5466,7 +5620,9 @@
   unittest.group('obj-schema-UserWebsite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserWebsite();
-      var od = api.UserWebsite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserWebsite.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserWebsite(od as api.UserWebsite);
     });
   });
@@ -5474,7 +5630,8 @@
   unittest.group('obj-schema-Users', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsers();
-      var od = api.Users.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Users.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUsers(od as api.Users);
     });
   });
@@ -5482,7 +5639,9 @@
   unittest.group('obj-schema-VerificationCode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVerificationCode();
-      var od = api.VerificationCode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VerificationCode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVerificationCode(od as api.VerificationCode);
     });
   });
@@ -5490,7 +5649,9 @@
   unittest.group('obj-schema-VerificationCodes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVerificationCodes();
-      var od = api.VerificationCodes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VerificationCodes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVerificationCodes(od as api.VerificationCodes);
     });
   });
diff --git a/generated/googleapis/test/admin/reports_v1_test.dart b/generated/googleapis/test/admin/reports_v1_test.dart
index f7ef2f9..ca19b5c 100644
--- a/generated/googleapis/test/admin/reports_v1_test.dart
+++ b/generated/googleapis/test/admin/reports_v1_test.dart
@@ -909,7 +909,9 @@
   unittest.group('obj-schema-Activities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivities();
-      var od = api.Activities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Activities.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkActivities(od as api.Activities);
     });
   });
@@ -917,7 +919,9 @@
   unittest.group('obj-schema-ActivityActor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityActor();
-      var od = api.ActivityActor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityActor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityActor(od as api.ActivityActor);
     });
   });
@@ -925,7 +929,9 @@
   unittest.group('obj-schema-ActivityEventsParametersMessageValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityEventsParametersMessageValue();
-      var od = api.ActivityEventsParametersMessageValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityEventsParametersMessageValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityEventsParametersMessageValue(
           od as api.ActivityEventsParametersMessageValue);
     });
@@ -934,8 +940,9 @@
   unittest.group('obj-schema-ActivityEventsParametersMultiMessageValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityEventsParametersMultiMessageValue();
-      var od =
-          api.ActivityEventsParametersMultiMessageValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityEventsParametersMultiMessageValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityEventsParametersMultiMessageValue(
           od as api.ActivityEventsParametersMultiMessageValue);
     });
@@ -944,7 +951,9 @@
   unittest.group('obj-schema-ActivityEventsParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityEventsParameters();
-      var od = api.ActivityEventsParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityEventsParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityEventsParameters(od as api.ActivityEventsParameters);
     });
   });
@@ -952,7 +961,9 @@
   unittest.group('obj-schema-ActivityEvents', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityEvents();
-      var od = api.ActivityEvents.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityEvents.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityEvents(od as api.ActivityEvents);
     });
   });
@@ -960,7 +971,9 @@
   unittest.group('obj-schema-ActivityId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityId();
-      var od = api.ActivityId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ActivityId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkActivityId(od as api.ActivityId);
     });
   });
@@ -968,7 +981,9 @@
   unittest.group('obj-schema-Activity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivity();
-      var od = api.Activity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Activity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkActivity(od as api.Activity);
     });
   });
@@ -976,7 +991,9 @@
   unittest.group('obj-schema-Channel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannel();
-      var od = api.Channel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Channel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChannel(od as api.Channel);
     });
   });
@@ -984,7 +1001,9 @@
   unittest.group('obj-schema-NestedParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNestedParameter();
-      var od = api.NestedParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NestedParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNestedParameter(od as api.NestedParameter);
     });
   });
@@ -992,7 +1011,9 @@
   unittest.group('obj-schema-UsageReportEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageReportEntity();
-      var od = api.UsageReportEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsageReportEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsageReportEntity(od as api.UsageReportEntity);
     });
   });
@@ -1000,7 +1021,9 @@
   unittest.group('obj-schema-UsageReportParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageReportParameters();
-      var od = api.UsageReportParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsageReportParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsageReportParameters(od as api.UsageReportParameters);
     });
   });
@@ -1008,7 +1031,9 @@
   unittest.group('obj-schema-UsageReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageReport();
-      var od = api.UsageReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsageReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsageReport(od as api.UsageReport);
     });
   });
@@ -1016,7 +1041,9 @@
   unittest.group('obj-schema-UsageReportsWarningsData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageReportsWarningsData();
-      var od = api.UsageReportsWarningsData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsageReportsWarningsData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsageReportsWarningsData(od as api.UsageReportsWarningsData);
     });
   });
@@ -1024,7 +1051,9 @@
   unittest.group('obj-schema-UsageReportsWarnings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageReportsWarnings();
-      var od = api.UsageReportsWarnings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsageReportsWarnings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsageReportsWarnings(od as api.UsageReportsWarnings);
     });
   });
@@ -1032,7 +1061,9 @@
   unittest.group('obj-schema-UsageReports', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageReports();
-      var od = api.UsageReports.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsageReports.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsageReports(od as api.UsageReports);
     });
   });
diff --git a/generated/googleapis/test/admob/v1_test.dart b/generated/googleapis/test/admob/v1_test.dart
index 02f2f2e..8235cc3 100644
--- a/generated/googleapis/test/admob/v1_test.dart
+++ b/generated/googleapis/test/admob/v1_test.dart
@@ -837,7 +837,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -845,7 +846,9 @@
   unittest.group('obj-schema-DateRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateRange();
-      var od = api.DateRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DateRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDateRange(od as api.DateRange);
     });
   });
@@ -853,7 +856,9 @@
   unittest.group('obj-schema-GenerateMediationReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateMediationReportRequest();
-      var od = api.GenerateMediationReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateMediationReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateMediationReportRequest(
           od as api.GenerateMediationReportRequest);
     });
@@ -862,7 +867,9 @@
   unittest.group('obj-schema-GenerateMediationReportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateMediationReportResponse();
-      var od = api.GenerateMediationReportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateMediationReportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateMediationReportResponse(
           od as api.GenerateMediationReportResponse);
     });
@@ -871,7 +878,9 @@
   unittest.group('obj-schema-GenerateNetworkReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateNetworkReportRequest();
-      var od = api.GenerateNetworkReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateNetworkReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateNetworkReportRequest(od as api.GenerateNetworkReportRequest);
     });
   });
@@ -879,7 +888,9 @@
   unittest.group('obj-schema-GenerateNetworkReportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateNetworkReportResponse();
-      var od = api.GenerateNetworkReportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateNetworkReportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateNetworkReportResponse(
           od as api.GenerateNetworkReportResponse);
     });
@@ -888,7 +899,9 @@
   unittest.group('obj-schema-ListPublisherAccountsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPublisherAccountsResponse();
-      var od = api.ListPublisherAccountsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPublisherAccountsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPublisherAccountsResponse(
           od as api.ListPublisherAccountsResponse);
     });
@@ -897,7 +910,9 @@
   unittest.group('obj-schema-LocalizationSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalizationSettings();
-      var od = api.LocalizationSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalizationSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalizationSettings(od as api.LocalizationSettings);
     });
   });
@@ -905,7 +920,9 @@
   unittest.group('obj-schema-MediationReportSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMediationReportSpec();
-      var od = api.MediationReportSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MediationReportSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMediationReportSpec(od as api.MediationReportSpec);
     });
   });
@@ -913,7 +930,9 @@
   unittest.group('obj-schema-MediationReportSpecDimensionFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMediationReportSpecDimensionFilter();
-      var od = api.MediationReportSpecDimensionFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MediationReportSpecDimensionFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMediationReportSpecDimensionFilter(
           od as api.MediationReportSpecDimensionFilter);
     });
@@ -922,7 +941,9 @@
   unittest.group('obj-schema-MediationReportSpecSortCondition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMediationReportSpecSortCondition();
-      var od = api.MediationReportSpecSortCondition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MediationReportSpecSortCondition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMediationReportSpecSortCondition(
           od as api.MediationReportSpecSortCondition);
     });
@@ -931,7 +952,9 @@
   unittest.group('obj-schema-NetworkReportSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkReportSpec();
-      var od = api.NetworkReportSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkReportSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkReportSpec(od as api.NetworkReportSpec);
     });
   });
@@ -939,7 +962,9 @@
   unittest.group('obj-schema-NetworkReportSpecDimensionFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkReportSpecDimensionFilter();
-      var od = api.NetworkReportSpecDimensionFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkReportSpecDimensionFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkReportSpecDimensionFilter(
           od as api.NetworkReportSpecDimensionFilter);
     });
@@ -948,7 +973,9 @@
   unittest.group('obj-schema-NetworkReportSpecSortCondition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkReportSpecSortCondition();
-      var od = api.NetworkReportSpecSortCondition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkReportSpecSortCondition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkReportSpecSortCondition(
           od as api.NetworkReportSpecSortCondition);
     });
@@ -957,7 +984,9 @@
   unittest.group('obj-schema-PublisherAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublisherAccount();
-      var od = api.PublisherAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublisherAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublisherAccount(od as api.PublisherAccount);
     });
   });
@@ -965,7 +994,9 @@
   unittest.group('obj-schema-ReportFooter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportFooter();
-      var od = api.ReportFooter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportFooter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportFooter(od as api.ReportFooter);
     });
   });
@@ -973,7 +1004,9 @@
   unittest.group('obj-schema-ReportHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportHeader();
-      var od = api.ReportHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportHeader(od as api.ReportHeader);
     });
   });
@@ -981,7 +1014,9 @@
   unittest.group('obj-schema-ReportRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRow();
-      var od = api.ReportRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReportRow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReportRow(od as api.ReportRow);
     });
   });
@@ -989,7 +1024,9 @@
   unittest.group('obj-schema-ReportRowDimensionValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRowDimensionValue();
-      var od = api.ReportRowDimensionValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRowDimensionValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRowDimensionValue(od as api.ReportRowDimensionValue);
     });
   });
@@ -997,7 +1034,9 @@
   unittest.group('obj-schema-ReportRowMetricValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRowMetricValue();
-      var od = api.ReportRowMetricValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRowMetricValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRowMetricValue(od as api.ReportRowMetricValue);
     });
   });
@@ -1005,7 +1044,9 @@
   unittest.group('obj-schema-ReportWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportWarning();
-      var od = api.ReportWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportWarning(od as api.ReportWarning);
     });
   });
@@ -1013,7 +1054,9 @@
   unittest.group('obj-schema-StringList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStringList();
-      var od = api.StringList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.StringList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStringList(od as api.StringList);
     });
   });
diff --git a/generated/googleapis/test/adsense/v1_4_test.dart b/generated/googleapis/test/adsense/v1_4_test.dart
index bea54fb..fcd9c9c 100644
--- a/generated/googleapis/test/adsense/v1_4_test.dart
+++ b/generated/googleapis/test/adsense/v1_4_test.dart
@@ -1647,7 +1647,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -1655,7 +1657,9 @@
   unittest.group('obj-schema-Accounts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccounts();
-      var od = api.Accounts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Accounts.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccounts(od as api.Accounts);
     });
   });
@@ -1663,7 +1667,9 @@
   unittest.group('obj-schema-AdClient', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdClient();
-      var od = api.AdClient.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdClient.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdClient(od as api.AdClient);
     });
   });
@@ -1671,7 +1677,9 @@
   unittest.group('obj-schema-AdClients', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdClients();
-      var od = api.AdClients.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdClients.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdClients(od as api.AdClients);
     });
   });
@@ -1679,7 +1687,9 @@
   unittest.group('obj-schema-AdCode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdCode();
-      var od = api.AdCode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdCode.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdCode(od as api.AdCode);
     });
   });
@@ -1687,7 +1697,9 @@
   unittest.group('obj-schema-AdStyleColors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdStyleColors();
-      var od = api.AdStyleColors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdStyleColors.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdStyleColors(od as api.AdStyleColors);
     });
   });
@@ -1695,7 +1707,9 @@
   unittest.group('obj-schema-AdStyleFont', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdStyleFont();
-      var od = api.AdStyleFont.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdStyleFont.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdStyleFont(od as api.AdStyleFont);
     });
   });
@@ -1703,7 +1717,9 @@
   unittest.group('obj-schema-AdStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdStyle();
-      var od = api.AdStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdStyle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdStyle(od as api.AdStyle);
     });
   });
@@ -1711,7 +1727,9 @@
   unittest.group('obj-schema-AdUnitContentAdsSettingsBackupOption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnitContentAdsSettingsBackupOption();
-      var od = api.AdUnitContentAdsSettingsBackupOption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdUnitContentAdsSettingsBackupOption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdUnitContentAdsSettingsBackupOption(
           od as api.AdUnitContentAdsSettingsBackupOption);
     });
@@ -1720,7 +1738,9 @@
   unittest.group('obj-schema-AdUnitContentAdsSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnitContentAdsSettings();
-      var od = api.AdUnitContentAdsSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdUnitContentAdsSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdUnitContentAdsSettings(od as api.AdUnitContentAdsSettings);
     });
   });
@@ -1728,7 +1748,9 @@
   unittest.group('obj-schema-AdUnitFeedAdsSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnitFeedAdsSettings();
-      var od = api.AdUnitFeedAdsSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdUnitFeedAdsSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdUnitFeedAdsSettings(od as api.AdUnitFeedAdsSettings);
     });
   });
@@ -1736,7 +1758,9 @@
   unittest.group('obj-schema-AdUnitMobileContentAdsSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnitMobileContentAdsSettings();
-      var od = api.AdUnitMobileContentAdsSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdUnitMobileContentAdsSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdUnitMobileContentAdsSettings(
           od as api.AdUnitMobileContentAdsSettings);
     });
@@ -1745,7 +1769,9 @@
   unittest.group('obj-schema-AdUnit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnit();
-      var od = api.AdUnit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdUnit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdUnit(od as api.AdUnit);
     });
   });
@@ -1753,7 +1779,9 @@
   unittest.group('obj-schema-AdUnits', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnits();
-      var od = api.AdUnits.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdUnits.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdUnits(od as api.AdUnits);
     });
   });
@@ -1761,7 +1789,9 @@
   unittest.group('obj-schema-AdsenseReportsGenerateResponseHeaders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdsenseReportsGenerateResponseHeaders();
-      var od = api.AdsenseReportsGenerateResponseHeaders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdsenseReportsGenerateResponseHeaders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdsenseReportsGenerateResponseHeaders(
           od as api.AdsenseReportsGenerateResponseHeaders);
     });
@@ -1770,7 +1800,9 @@
   unittest.group('obj-schema-AdsenseReportsGenerateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdsenseReportsGenerateResponse();
-      var od = api.AdsenseReportsGenerateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdsenseReportsGenerateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdsenseReportsGenerateResponse(
           od as api.AdsenseReportsGenerateResponse);
     });
@@ -1779,7 +1811,8 @@
   unittest.group('obj-schema-Alert', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAlert();
-      var od = api.Alert.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Alert.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAlert(od as api.Alert);
     });
   });
@@ -1787,7 +1820,9 @@
   unittest.group('obj-schema-Alerts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAlerts();
-      var od = api.Alerts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Alerts.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAlerts(od as api.Alerts);
     });
   });
@@ -1795,7 +1830,9 @@
   unittest.group('obj-schema-CustomChannelTargetingInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomChannelTargetingInfo();
-      var od = api.CustomChannelTargetingInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomChannelTargetingInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomChannelTargetingInfo(od as api.CustomChannelTargetingInfo);
     });
   });
@@ -1803,7 +1840,9 @@
   unittest.group('obj-schema-CustomChannel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomChannel();
-      var od = api.CustomChannel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomChannel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomChannel(od as api.CustomChannel);
     });
   });
@@ -1811,7 +1850,9 @@
   unittest.group('obj-schema-CustomChannels', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomChannels();
-      var od = api.CustomChannels.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomChannels.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomChannels(od as api.CustomChannels);
     });
   });
@@ -1819,7 +1860,9 @@
   unittest.group('obj-schema-Metadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadata();
-      var od = api.Metadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metadata.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetadata(od as api.Metadata);
     });
   });
@@ -1827,7 +1870,9 @@
   unittest.group('obj-schema-Payment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPayment();
-      var od = api.Payment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Payment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPayment(od as api.Payment);
     });
   });
@@ -1835,7 +1880,9 @@
   unittest.group('obj-schema-Payments', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPayments();
-      var od = api.Payments.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Payments.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPayments(od as api.Payments);
     });
   });
@@ -1843,7 +1890,9 @@
   unittest.group('obj-schema-ReportingMetadataEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportingMetadataEntry();
-      var od = api.ReportingMetadataEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportingMetadataEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportingMetadataEntry(od as api.ReportingMetadataEntry);
     });
   });
@@ -1851,7 +1900,9 @@
   unittest.group('obj-schema-SavedAdStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSavedAdStyle();
-      var od = api.SavedAdStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SavedAdStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSavedAdStyle(od as api.SavedAdStyle);
     });
   });
@@ -1859,7 +1910,9 @@
   unittest.group('obj-schema-SavedAdStyles', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSavedAdStyles();
-      var od = api.SavedAdStyles.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SavedAdStyles.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSavedAdStyles(od as api.SavedAdStyles);
     });
   });
@@ -1867,7 +1920,9 @@
   unittest.group('obj-schema-SavedReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSavedReport();
-      var od = api.SavedReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SavedReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSavedReport(od as api.SavedReport);
     });
   });
@@ -1875,7 +1930,9 @@
   unittest.group('obj-schema-SavedReports', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSavedReports();
-      var od = api.SavedReports.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SavedReports.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSavedReports(od as api.SavedReports);
     });
   });
@@ -1883,7 +1940,9 @@
   unittest.group('obj-schema-UrlChannel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlChannel();
-      var od = api.UrlChannel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UrlChannel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUrlChannel(od as api.UrlChannel);
     });
   });
@@ -1891,7 +1950,9 @@
   unittest.group('obj-schema-UrlChannels', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlChannels();
-      var od = api.UrlChannels.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlChannels.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlChannels(od as api.UrlChannels);
     });
   });
diff --git a/generated/googleapis/test/adsensehost/v4_1_test.dart b/generated/googleapis/test/adsensehost/v4_1_test.dart
index 276d5f6..a60ad40 100644
--- a/generated/googleapis/test/adsensehost/v4_1_test.dart
+++ b/generated/googleapis/test/adsensehost/v4_1_test.dart
@@ -1139,7 +1139,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -1147,7 +1149,9 @@
   unittest.group('obj-schema-Accounts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccounts();
-      var od = api.Accounts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Accounts.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccounts(od as api.Accounts);
     });
   });
@@ -1155,7 +1159,9 @@
   unittest.group('obj-schema-AdClient', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdClient();
-      var od = api.AdClient.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdClient.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdClient(od as api.AdClient);
     });
   });
@@ -1163,7 +1169,9 @@
   unittest.group('obj-schema-AdClients', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdClients();
-      var od = api.AdClients.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdClients.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdClients(od as api.AdClients);
     });
   });
@@ -1171,7 +1179,9 @@
   unittest.group('obj-schema-AdCode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdCode();
-      var od = api.AdCode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdCode.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdCode(od as api.AdCode);
     });
   });
@@ -1179,7 +1189,9 @@
   unittest.group('obj-schema-AdStyleColors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdStyleColors();
-      var od = api.AdStyleColors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdStyleColors.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdStyleColors(od as api.AdStyleColors);
     });
   });
@@ -1187,7 +1199,9 @@
   unittest.group('obj-schema-AdStyleFont', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdStyleFont();
-      var od = api.AdStyleFont.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdStyleFont.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdStyleFont(od as api.AdStyleFont);
     });
   });
@@ -1195,7 +1209,9 @@
   unittest.group('obj-schema-AdStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdStyle();
-      var od = api.AdStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdStyle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdStyle(od as api.AdStyle);
     });
   });
@@ -1203,7 +1219,9 @@
   unittest.group('obj-schema-AdUnitContentAdsSettingsBackupOption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnitContentAdsSettingsBackupOption();
-      var od = api.AdUnitContentAdsSettingsBackupOption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdUnitContentAdsSettingsBackupOption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdUnitContentAdsSettingsBackupOption(
           od as api.AdUnitContentAdsSettingsBackupOption);
     });
@@ -1212,7 +1230,9 @@
   unittest.group('obj-schema-AdUnitContentAdsSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnitContentAdsSettings();
-      var od = api.AdUnitContentAdsSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdUnitContentAdsSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdUnitContentAdsSettings(od as api.AdUnitContentAdsSettings);
     });
   });
@@ -1220,7 +1240,9 @@
   unittest.group('obj-schema-AdUnitMobileContentAdsSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnitMobileContentAdsSettings();
-      var od = api.AdUnitMobileContentAdsSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdUnitMobileContentAdsSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdUnitMobileContentAdsSettings(
           od as api.AdUnitMobileContentAdsSettings);
     });
@@ -1229,7 +1251,9 @@
   unittest.group('obj-schema-AdUnit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnit();
-      var od = api.AdUnit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdUnit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdUnit(od as api.AdUnit);
     });
   });
@@ -1237,7 +1261,9 @@
   unittest.group('obj-schema-AdUnits', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdUnits();
-      var od = api.AdUnits.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdUnits.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdUnits(od as api.AdUnits);
     });
   });
@@ -1245,7 +1271,9 @@
   unittest.group('obj-schema-AssociationSession', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssociationSession();
-      var od = api.AssociationSession.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AssociationSession.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAssociationSession(od as api.AssociationSession);
     });
   });
@@ -1253,7 +1281,9 @@
   unittest.group('obj-schema-CustomChannel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomChannel();
-      var od = api.CustomChannel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomChannel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomChannel(od as api.CustomChannel);
     });
   });
@@ -1261,7 +1291,9 @@
   unittest.group('obj-schema-CustomChannels', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomChannels();
-      var od = api.CustomChannels.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomChannels.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomChannels(od as api.CustomChannels);
     });
   });
@@ -1269,7 +1301,9 @@
   unittest.group('obj-schema-ReportHeaders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportHeaders();
-      var od = api.ReportHeaders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportHeaders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportHeaders(od as api.ReportHeaders);
     });
   });
@@ -1277,7 +1311,9 @@
   unittest.group('obj-schema-Report', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReport();
-      var od = api.Report.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Report.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReport(od as api.Report);
     });
   });
@@ -1285,7 +1321,9 @@
   unittest.group('obj-schema-UrlChannel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlChannel();
-      var od = api.UrlChannel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UrlChannel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUrlChannel(od as api.UrlChannel);
     });
   });
@@ -1293,7 +1331,9 @@
   unittest.group('obj-schema-UrlChannels', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlChannels();
-      var od = api.UrlChannels.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlChannels.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlChannels(od as api.UrlChannels);
     });
   });
diff --git a/generated/googleapis/test/analytics/v3_test.dart b/generated/googleapis/test/analytics/v3_test.dart
index 8d857a3..f05c288 100644
--- a/generated/googleapis/test/analytics/v3_test.dart
+++ b/generated/googleapis/test/analytics/v3_test.dart
@@ -5678,7 +5678,9 @@
   unittest.group('obj-schema-AccountChildLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountChildLink();
-      var od = api.AccountChildLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountChildLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountChildLink(od as api.AccountChildLink);
     });
   });
@@ -5686,7 +5688,9 @@
   unittest.group('obj-schema-AccountPermissions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountPermissions();
-      var od = api.AccountPermissions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountPermissions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountPermissions(od as api.AccountPermissions);
     });
   });
@@ -5694,7 +5698,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -5702,7 +5708,9 @@
   unittest.group('obj-schema-AccountRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountRef();
-      var od = api.AccountRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AccountRef.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccountRef(od as api.AccountRef);
     });
   });
@@ -5710,7 +5718,9 @@
   unittest.group('obj-schema-AccountSummaries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountSummaries();
-      var od = api.AccountSummaries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountSummaries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountSummaries(od as api.AccountSummaries);
     });
   });
@@ -5718,7 +5728,9 @@
   unittest.group('obj-schema-AccountSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountSummary();
-      var od = api.AccountSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountSummary(od as api.AccountSummary);
     });
   });
@@ -5726,7 +5738,9 @@
   unittest.group('obj-schema-AccountTicket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountTicket();
-      var od = api.AccountTicket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountTicket.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountTicket(od as api.AccountTicket);
     });
   });
@@ -5734,7 +5748,9 @@
   unittest.group('obj-schema-AccountTreeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountTreeRequest();
-      var od = api.AccountTreeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountTreeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountTreeRequest(od as api.AccountTreeRequest);
     });
   });
@@ -5742,7 +5758,9 @@
   unittest.group('obj-schema-AccountTreeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountTreeResponse();
-      var od = api.AccountTreeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountTreeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountTreeResponse(od as api.AccountTreeResponse);
     });
   });
@@ -5750,7 +5768,9 @@
   unittest.group('obj-schema-Accounts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccounts();
-      var od = api.Accounts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Accounts.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccounts(od as api.Accounts);
     });
   });
@@ -5758,7 +5778,9 @@
   unittest.group('obj-schema-AdWordsAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdWordsAccount();
-      var od = api.AdWordsAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdWordsAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdWordsAccount(od as api.AdWordsAccount);
     });
   });
@@ -5766,8 +5788,9 @@
   unittest.group('obj-schema-AnalyticsDataimportDeleteUploadDataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyticsDataimportDeleteUploadDataRequest();
-      var od =
-          api.AnalyticsDataimportDeleteUploadDataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyticsDataimportDeleteUploadDataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyticsDataimportDeleteUploadDataRequest(
           od as api.AnalyticsDataimportDeleteUploadDataRequest);
     });
@@ -5776,7 +5799,9 @@
   unittest.group('obj-schema-Column', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColumn();
-      var od = api.Column.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Column.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColumn(od as api.Column);
     });
   });
@@ -5784,7 +5809,9 @@
   unittest.group('obj-schema-Columns', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColumns();
-      var od = api.Columns.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Columns.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColumns(od as api.Columns);
     });
   });
@@ -5792,7 +5819,9 @@
   unittest.group('obj-schema-CustomDataSourceChildLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomDataSourceChildLink();
-      var od = api.CustomDataSourceChildLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomDataSourceChildLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomDataSourceChildLink(od as api.CustomDataSourceChildLink);
     });
   });
@@ -5800,7 +5829,9 @@
   unittest.group('obj-schema-CustomDataSourceParentLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomDataSourceParentLink();
-      var od = api.CustomDataSourceParentLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomDataSourceParentLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomDataSourceParentLink(od as api.CustomDataSourceParentLink);
     });
   });
@@ -5808,7 +5839,9 @@
   unittest.group('obj-schema-CustomDataSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomDataSource();
-      var od = api.CustomDataSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomDataSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomDataSource(od as api.CustomDataSource);
     });
   });
@@ -5816,7 +5849,9 @@
   unittest.group('obj-schema-CustomDataSources', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomDataSources();
-      var od = api.CustomDataSources.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomDataSources.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomDataSources(od as api.CustomDataSources);
     });
   });
@@ -5824,7 +5859,9 @@
   unittest.group('obj-schema-CustomDimensionParentLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomDimensionParentLink();
-      var od = api.CustomDimensionParentLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomDimensionParentLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomDimensionParentLink(od as api.CustomDimensionParentLink);
     });
   });
@@ -5832,7 +5869,9 @@
   unittest.group('obj-schema-CustomDimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomDimension();
-      var od = api.CustomDimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomDimension.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomDimension(od as api.CustomDimension);
     });
   });
@@ -5840,7 +5879,9 @@
   unittest.group('obj-schema-CustomDimensions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomDimensions();
-      var od = api.CustomDimensions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomDimensions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomDimensions(od as api.CustomDimensions);
     });
   });
@@ -5848,7 +5889,9 @@
   unittest.group('obj-schema-CustomMetricParentLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomMetricParentLink();
-      var od = api.CustomMetricParentLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomMetricParentLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomMetricParentLink(od as api.CustomMetricParentLink);
     });
   });
@@ -5856,7 +5899,9 @@
   unittest.group('obj-schema-CustomMetric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomMetric();
-      var od = api.CustomMetric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomMetric.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomMetric(od as api.CustomMetric);
     });
   });
@@ -5864,7 +5909,9 @@
   unittest.group('obj-schema-CustomMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomMetrics();
-      var od = api.CustomMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomMetrics(od as api.CustomMetrics);
     });
   });
@@ -5872,7 +5919,9 @@
   unittest.group('obj-schema-EntityAdWordsLinkEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityAdWordsLinkEntity();
-      var od = api.EntityAdWordsLinkEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntityAdWordsLinkEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntityAdWordsLinkEntity(od as api.EntityAdWordsLinkEntity);
     });
   });
@@ -5880,7 +5929,9 @@
   unittest.group('obj-schema-EntityAdWordsLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityAdWordsLink();
-      var od = api.EntityAdWordsLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntityAdWordsLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntityAdWordsLink(od as api.EntityAdWordsLink);
     });
   });
@@ -5888,7 +5939,9 @@
   unittest.group('obj-schema-EntityAdWordsLinks', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityAdWordsLinks();
-      var od = api.EntityAdWordsLinks.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntityAdWordsLinks.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntityAdWordsLinks(od as api.EntityAdWordsLinks);
     });
   });
@@ -5896,7 +5949,9 @@
   unittest.group('obj-schema-EntityUserLinkEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityUserLinkEntity();
-      var od = api.EntityUserLinkEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntityUserLinkEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntityUserLinkEntity(od as api.EntityUserLinkEntity);
     });
   });
@@ -5904,7 +5959,9 @@
   unittest.group('obj-schema-EntityUserLinkPermissions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityUserLinkPermissions();
-      var od = api.EntityUserLinkPermissions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntityUserLinkPermissions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntityUserLinkPermissions(od as api.EntityUserLinkPermissions);
     });
   });
@@ -5912,7 +5969,9 @@
   unittest.group('obj-schema-EntityUserLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityUserLink();
-      var od = api.EntityUserLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntityUserLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntityUserLink(od as api.EntityUserLink);
     });
   });
@@ -5920,7 +5979,9 @@
   unittest.group('obj-schema-EntityUserLinks', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityUserLinks();
-      var od = api.EntityUserLinks.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntityUserLinks.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntityUserLinks(od as api.EntityUserLinks);
     });
   });
@@ -5928,7 +5989,9 @@
   unittest.group('obj-schema-ExperimentParentLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExperimentParentLink();
-      var od = api.ExperimentParentLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExperimentParentLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExperimentParentLink(od as api.ExperimentParentLink);
     });
   });
@@ -5936,7 +5999,9 @@
   unittest.group('obj-schema-ExperimentVariations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExperimentVariations();
-      var od = api.ExperimentVariations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExperimentVariations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExperimentVariations(od as api.ExperimentVariations);
     });
   });
@@ -5944,7 +6009,9 @@
   unittest.group('obj-schema-Experiment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExperiment();
-      var od = api.Experiment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Experiment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExperiment(od as api.Experiment);
     });
   });
@@ -5952,7 +6019,9 @@
   unittest.group('obj-schema-Experiments', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExperiments();
-      var od = api.Experiments.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Experiments.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExperiments(od as api.Experiments);
     });
   });
@@ -5960,7 +6029,9 @@
   unittest.group('obj-schema-FilterAdvancedDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterAdvancedDetails();
-      var od = api.FilterAdvancedDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterAdvancedDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterAdvancedDetails(od as api.FilterAdvancedDetails);
     });
   });
@@ -5968,7 +6039,9 @@
   unittest.group('obj-schema-FilterLowercaseDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterLowercaseDetails();
-      var od = api.FilterLowercaseDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterLowercaseDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterLowercaseDetails(od as api.FilterLowercaseDetails);
     });
   });
@@ -5976,7 +6049,9 @@
   unittest.group('obj-schema-FilterParentLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterParentLink();
-      var od = api.FilterParentLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterParentLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterParentLink(od as api.FilterParentLink);
     });
   });
@@ -5984,7 +6059,9 @@
   unittest.group('obj-schema-FilterSearchAndReplaceDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterSearchAndReplaceDetails();
-      var od = api.FilterSearchAndReplaceDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterSearchAndReplaceDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterSearchAndReplaceDetails(
           od as api.FilterSearchAndReplaceDetails);
     });
@@ -5993,7 +6070,9 @@
   unittest.group('obj-schema-FilterUppercaseDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterUppercaseDetails();
-      var od = api.FilterUppercaseDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterUppercaseDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterUppercaseDetails(od as api.FilterUppercaseDetails);
     });
   });
@@ -6001,7 +6080,9 @@
   unittest.group('obj-schema-Filter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilter();
-      var od = api.Filter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Filter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilter(od as api.Filter);
     });
   });
@@ -6009,7 +6090,9 @@
   unittest.group('obj-schema-FilterExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterExpression();
-      var od = api.FilterExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterExpression(od as api.FilterExpression);
     });
   });
@@ -6017,7 +6100,9 @@
   unittest.group('obj-schema-FilterRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterRef();
-      var od = api.FilterRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FilterRef.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilterRef(od as api.FilterRef);
     });
   });
@@ -6025,7 +6110,9 @@
   unittest.group('obj-schema-Filters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilters();
-      var od = api.Filters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Filters.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilters(od as api.Filters);
     });
   });
@@ -6033,7 +6120,9 @@
   unittest.group('obj-schema-GaDataColumnHeaders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGaDataColumnHeaders();
-      var od = api.GaDataColumnHeaders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GaDataColumnHeaders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGaDataColumnHeaders(od as api.GaDataColumnHeaders);
     });
   });
@@ -6041,7 +6130,9 @@
   unittest.group('obj-schema-GaDataDataTableCols', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGaDataDataTableCols();
-      var od = api.GaDataDataTableCols.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GaDataDataTableCols.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGaDataDataTableCols(od as api.GaDataDataTableCols);
     });
   });
@@ -6049,7 +6140,9 @@
   unittest.group('obj-schema-GaDataDataTableRowsC', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGaDataDataTableRowsC();
-      var od = api.GaDataDataTableRowsC.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GaDataDataTableRowsC.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGaDataDataTableRowsC(od as api.GaDataDataTableRowsC);
     });
   });
@@ -6057,7 +6150,9 @@
   unittest.group('obj-schema-GaDataDataTableRows', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGaDataDataTableRows();
-      var od = api.GaDataDataTableRows.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GaDataDataTableRows.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGaDataDataTableRows(od as api.GaDataDataTableRows);
     });
   });
@@ -6065,7 +6160,9 @@
   unittest.group('obj-schema-GaDataDataTable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGaDataDataTable();
-      var od = api.GaDataDataTable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GaDataDataTable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGaDataDataTable(od as api.GaDataDataTable);
     });
   });
@@ -6073,7 +6170,9 @@
   unittest.group('obj-schema-GaDataProfileInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGaDataProfileInfo();
-      var od = api.GaDataProfileInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GaDataProfileInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGaDataProfileInfo(od as api.GaDataProfileInfo);
     });
   });
@@ -6081,7 +6180,9 @@
   unittest.group('obj-schema-GaDataQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGaDataQuery();
-      var od = api.GaDataQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GaDataQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGaDataQuery(od as api.GaDataQuery);
     });
   });
@@ -6089,7 +6190,9 @@
   unittest.group('obj-schema-GaData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGaData();
-      var od = api.GaData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GaData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGaData(od as api.GaData);
     });
   });
@@ -6097,7 +6200,9 @@
   unittest.group('obj-schema-GoalEventDetailsEventConditions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoalEventDetailsEventConditions();
-      var od = api.GoalEventDetailsEventConditions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoalEventDetailsEventConditions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoalEventDetailsEventConditions(
           od as api.GoalEventDetailsEventConditions);
     });
@@ -6106,7 +6211,9 @@
   unittest.group('obj-schema-GoalEventDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoalEventDetails();
-      var od = api.GoalEventDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoalEventDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoalEventDetails(od as api.GoalEventDetails);
     });
   });
@@ -6114,7 +6221,9 @@
   unittest.group('obj-schema-GoalParentLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoalParentLink();
-      var od = api.GoalParentLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoalParentLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoalParentLink(od as api.GoalParentLink);
     });
   });
@@ -6122,7 +6231,9 @@
   unittest.group('obj-schema-GoalUrlDestinationDetailsSteps', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoalUrlDestinationDetailsSteps();
-      var od = api.GoalUrlDestinationDetailsSteps.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoalUrlDestinationDetailsSteps.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoalUrlDestinationDetailsSteps(
           od as api.GoalUrlDestinationDetailsSteps);
     });
@@ -6131,7 +6242,9 @@
   unittest.group('obj-schema-GoalUrlDestinationDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoalUrlDestinationDetails();
-      var od = api.GoalUrlDestinationDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoalUrlDestinationDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoalUrlDestinationDetails(od as api.GoalUrlDestinationDetails);
     });
   });
@@ -6139,7 +6252,9 @@
   unittest.group('obj-schema-GoalVisitNumPagesDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoalVisitNumPagesDetails();
-      var od = api.GoalVisitNumPagesDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoalVisitNumPagesDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoalVisitNumPagesDetails(od as api.GoalVisitNumPagesDetails);
     });
   });
@@ -6147,7 +6262,9 @@
   unittest.group('obj-schema-GoalVisitTimeOnSiteDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoalVisitTimeOnSiteDetails();
-      var od = api.GoalVisitTimeOnSiteDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoalVisitTimeOnSiteDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoalVisitTimeOnSiteDetails(od as api.GoalVisitTimeOnSiteDetails);
     });
   });
@@ -6155,7 +6272,8 @@
   unittest.group('obj-schema-Goal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoal();
-      var od = api.Goal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Goal.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoal(od as api.Goal);
     });
   });
@@ -6163,7 +6281,8 @@
   unittest.group('obj-schema-Goals', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoals();
-      var od = api.Goals.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Goals.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoals(od as api.Goals);
     });
   });
@@ -6171,7 +6290,9 @@
   unittest.group('obj-schema-HashClientIdRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHashClientIdRequest();
-      var od = api.HashClientIdRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HashClientIdRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHashClientIdRequest(od as api.HashClientIdRequest);
     });
   });
@@ -6179,7 +6300,9 @@
   unittest.group('obj-schema-HashClientIdResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHashClientIdResponse();
-      var od = api.HashClientIdResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HashClientIdResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHashClientIdResponse(od as api.HashClientIdResponse);
     });
   });
@@ -6187,7 +6310,9 @@
   unittest.group('obj-schema-IncludeConditions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIncludeConditions();
-      var od = api.IncludeConditions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IncludeConditions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIncludeConditions(od as api.IncludeConditions);
     });
   });
@@ -6195,7 +6320,9 @@
   unittest.group('obj-schema-LinkedForeignAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinkedForeignAccount();
-      var od = api.LinkedForeignAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LinkedForeignAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLinkedForeignAccount(od as api.LinkedForeignAccount);
     });
   });
@@ -6203,7 +6330,9 @@
   unittest.group('obj-schema-McfDataColumnHeaders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMcfDataColumnHeaders();
-      var od = api.McfDataColumnHeaders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.McfDataColumnHeaders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMcfDataColumnHeaders(od as api.McfDataColumnHeaders);
     });
   });
@@ -6211,7 +6340,9 @@
   unittest.group('obj-schema-McfDataProfileInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMcfDataProfileInfo();
-      var od = api.McfDataProfileInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.McfDataProfileInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMcfDataProfileInfo(od as api.McfDataProfileInfo);
     });
   });
@@ -6219,7 +6350,9 @@
   unittest.group('obj-schema-McfDataQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMcfDataQuery();
-      var od = api.McfDataQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.McfDataQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMcfDataQuery(od as api.McfDataQuery);
     });
   });
@@ -6227,7 +6360,9 @@
   unittest.group('obj-schema-McfDataRowsConversionPathValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMcfDataRowsConversionPathValue();
-      var od = api.McfDataRowsConversionPathValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.McfDataRowsConversionPathValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMcfDataRowsConversionPathValue(
           od as api.McfDataRowsConversionPathValue);
     });
@@ -6236,7 +6371,9 @@
   unittest.group('obj-schema-McfDataRows', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMcfDataRows();
-      var od = api.McfDataRows.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.McfDataRows.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMcfDataRows(od as api.McfDataRows);
     });
   });
@@ -6244,7 +6381,9 @@
   unittest.group('obj-schema-McfData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMcfData();
-      var od = api.McfData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.McfData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMcfData(od as api.McfData);
     });
   });
@@ -6252,7 +6391,9 @@
   unittest.group('obj-schema-ProfileChildLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfileChildLink();
-      var od = api.ProfileChildLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProfileChildLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProfileChildLink(od as api.ProfileChildLink);
     });
   });
@@ -6260,7 +6401,9 @@
   unittest.group('obj-schema-ProfileParentLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfileParentLink();
-      var od = api.ProfileParentLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProfileParentLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProfileParentLink(od as api.ProfileParentLink);
     });
   });
@@ -6268,7 +6411,9 @@
   unittest.group('obj-schema-ProfilePermissions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfilePermissions();
-      var od = api.ProfilePermissions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProfilePermissions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProfilePermissions(od as api.ProfilePermissions);
     });
   });
@@ -6276,7 +6421,9 @@
   unittest.group('obj-schema-Profile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfile();
-      var od = api.Profile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Profile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProfile(od as api.Profile);
     });
   });
@@ -6284,7 +6431,9 @@
   unittest.group('obj-schema-ProfileFilterLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfileFilterLink();
-      var od = api.ProfileFilterLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProfileFilterLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProfileFilterLink(od as api.ProfileFilterLink);
     });
   });
@@ -6292,7 +6441,9 @@
   unittest.group('obj-schema-ProfileFilterLinks', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfileFilterLinks();
-      var od = api.ProfileFilterLinks.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProfileFilterLinks.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProfileFilterLinks(od as api.ProfileFilterLinks);
     });
   });
@@ -6300,7 +6451,9 @@
   unittest.group('obj-schema-ProfileRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfileRef();
-      var od = api.ProfileRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ProfileRef.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProfileRef(od as api.ProfileRef);
     });
   });
@@ -6308,7 +6461,9 @@
   unittest.group('obj-schema-ProfileSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfileSummary();
-      var od = api.ProfileSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProfileSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProfileSummary(od as api.ProfileSummary);
     });
   });
@@ -6316,7 +6471,9 @@
   unittest.group('obj-schema-Profiles', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfiles();
-      var od = api.Profiles.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Profiles.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProfiles(od as api.Profiles);
     });
   });
@@ -6324,7 +6481,9 @@
   unittest.group('obj-schema-RealtimeDataColumnHeaders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRealtimeDataColumnHeaders();
-      var od = api.RealtimeDataColumnHeaders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RealtimeDataColumnHeaders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRealtimeDataColumnHeaders(od as api.RealtimeDataColumnHeaders);
     });
   });
@@ -6332,7 +6491,9 @@
   unittest.group('obj-schema-RealtimeDataProfileInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRealtimeDataProfileInfo();
-      var od = api.RealtimeDataProfileInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RealtimeDataProfileInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRealtimeDataProfileInfo(od as api.RealtimeDataProfileInfo);
     });
   });
@@ -6340,7 +6501,9 @@
   unittest.group('obj-schema-RealtimeDataQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRealtimeDataQuery();
-      var od = api.RealtimeDataQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RealtimeDataQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRealtimeDataQuery(od as api.RealtimeDataQuery);
     });
   });
@@ -6348,7 +6511,9 @@
   unittest.group('obj-schema-RealtimeData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRealtimeData();
-      var od = api.RealtimeData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RealtimeData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRealtimeData(od as api.RealtimeData);
     });
   });
@@ -6356,7 +6521,9 @@
   unittest.group('obj-schema-RemarketingAudienceAudienceDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemarketingAudienceAudienceDefinition();
-      var od = api.RemarketingAudienceAudienceDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemarketingAudienceAudienceDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemarketingAudienceAudienceDefinition(
           od as api.RemarketingAudienceAudienceDefinition);
     });
@@ -6368,9 +6535,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions(od
           as api
               .RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions);
@@ -6381,8 +6549,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemarketingAudienceStateBasedAudienceDefinition();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RemarketingAudienceStateBasedAudienceDefinition.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemarketingAudienceStateBasedAudienceDefinition(
           od as api.RemarketingAudienceStateBasedAudienceDefinition);
     });
@@ -6391,7 +6560,9 @@
   unittest.group('obj-schema-RemarketingAudience', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemarketingAudience();
-      var od = api.RemarketingAudience.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemarketingAudience.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemarketingAudience(od as api.RemarketingAudience);
     });
   });
@@ -6399,7 +6570,9 @@
   unittest.group('obj-schema-RemarketingAudiences', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemarketingAudiences();
-      var od = api.RemarketingAudiences.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemarketingAudiences.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemarketingAudiences(od as api.RemarketingAudiences);
     });
   });
@@ -6407,7 +6580,9 @@
   unittest.group('obj-schema-Segment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegment();
-      var od = api.Segment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Segment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSegment(od as api.Segment);
     });
   });
@@ -6415,7 +6590,9 @@
   unittest.group('obj-schema-Segments', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegments();
-      var od = api.Segments.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Segments.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSegments(od as api.Segments);
     });
   });
@@ -6423,8 +6600,9 @@
   unittest.group('obj-schema-UnsampledReportCloudStorageDownloadDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnsampledReportCloudStorageDownloadDetails();
-      var od =
-          api.UnsampledReportCloudStorageDownloadDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnsampledReportCloudStorageDownloadDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnsampledReportCloudStorageDownloadDetails(
           od as api.UnsampledReportCloudStorageDownloadDetails);
     });
@@ -6433,7 +6611,9 @@
   unittest.group('obj-schema-UnsampledReportDriveDownloadDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnsampledReportDriveDownloadDetails();
-      var od = api.UnsampledReportDriveDownloadDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnsampledReportDriveDownloadDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnsampledReportDriveDownloadDetails(
           od as api.UnsampledReportDriveDownloadDetails);
     });
@@ -6442,7 +6622,9 @@
   unittest.group('obj-schema-UnsampledReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnsampledReport();
-      var od = api.UnsampledReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnsampledReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnsampledReport(od as api.UnsampledReport);
     });
   });
@@ -6450,7 +6632,9 @@
   unittest.group('obj-schema-UnsampledReports', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnsampledReports();
-      var od = api.UnsampledReports.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnsampledReports.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnsampledReports(od as api.UnsampledReports);
     });
   });
@@ -6458,7 +6642,9 @@
   unittest.group('obj-schema-Upload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpload();
-      var od = api.Upload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Upload.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUpload(od as api.Upload);
     });
   });
@@ -6466,7 +6652,9 @@
   unittest.group('obj-schema-Uploads', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUploads();
-      var od = api.Uploads.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Uploads.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUploads(od as api.Uploads);
     });
   });
@@ -6474,7 +6662,9 @@
   unittest.group('obj-schema-UserDeletionRequestId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserDeletionRequestId();
-      var od = api.UserDeletionRequestId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserDeletionRequestId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserDeletionRequestId(od as api.UserDeletionRequestId);
     });
   });
@@ -6482,7 +6672,9 @@
   unittest.group('obj-schema-UserDeletionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserDeletionRequest();
-      var od = api.UserDeletionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserDeletionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserDeletionRequest(od as api.UserDeletionRequest);
     });
   });
@@ -6490,7 +6682,9 @@
   unittest.group('obj-schema-UserRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserRef();
-      var od = api.UserRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserRef.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserRef(od as api.UserRef);
     });
   });
@@ -6498,7 +6692,9 @@
   unittest.group('obj-schema-WebPropertyRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebPropertyRef();
-      var od = api.WebPropertyRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebPropertyRef.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebPropertyRef(od as api.WebPropertyRef);
     });
   });
@@ -6506,7 +6702,9 @@
   unittest.group('obj-schema-WebPropertySummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebPropertySummary();
-      var od = api.WebPropertySummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebPropertySummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebPropertySummary(od as api.WebPropertySummary);
     });
   });
@@ -6514,7 +6712,9 @@
   unittest.group('obj-schema-Webproperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebproperties();
-      var od = api.Webproperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Webproperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebproperties(od as api.Webproperties);
     });
   });
@@ -6522,7 +6722,9 @@
   unittest.group('obj-schema-WebpropertyChildLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebpropertyChildLink();
-      var od = api.WebpropertyChildLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebpropertyChildLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebpropertyChildLink(od as api.WebpropertyChildLink);
     });
   });
@@ -6530,7 +6732,9 @@
   unittest.group('obj-schema-WebpropertyParentLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebpropertyParentLink();
-      var od = api.WebpropertyParentLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebpropertyParentLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebpropertyParentLink(od as api.WebpropertyParentLink);
     });
   });
@@ -6538,7 +6742,9 @@
   unittest.group('obj-schema-WebpropertyPermissions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebpropertyPermissions();
-      var od = api.WebpropertyPermissions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebpropertyPermissions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebpropertyPermissions(od as api.WebpropertyPermissions);
     });
   });
@@ -6546,7 +6752,9 @@
   unittest.group('obj-schema-Webproperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebproperty();
-      var od = api.Webproperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Webproperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebproperty(od as api.Webproperty);
     });
   });
diff --git a/generated/googleapis/test/analyticsreporting/v4_test.dart b/generated/googleapis/test/analyticsreporting/v4_test.dart
index 5502fa8..45854c4 100644
--- a/generated/googleapis/test/analyticsreporting/v4_test.dart
+++ b/generated/googleapis/test/analyticsreporting/v4_test.dart
@@ -2225,7 +2225,9 @@
   unittest.group('obj-schema-Activity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivity();
-      var od = api.Activity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Activity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkActivity(od as api.Activity);
     });
   });
@@ -2233,7 +2235,9 @@
   unittest.group('obj-schema-Cohort', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCohort();
-      var od = api.Cohort.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Cohort.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCohort(od as api.Cohort);
     });
   });
@@ -2241,7 +2245,9 @@
   unittest.group('obj-schema-CohortGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCohortGroup();
-      var od = api.CohortGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CohortGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCohortGroup(od as api.CohortGroup);
     });
   });
@@ -2249,7 +2255,9 @@
   unittest.group('obj-schema-ColumnHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColumnHeader();
-      var od = api.ColumnHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ColumnHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkColumnHeader(od as api.ColumnHeader);
     });
   });
@@ -2257,7 +2265,9 @@
   unittest.group('obj-schema-CustomDimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomDimension();
-      var od = api.CustomDimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomDimension.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomDimension(od as api.CustomDimension);
     });
   });
@@ -2265,7 +2275,9 @@
   unittest.group('obj-schema-DateRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateRange();
-      var od = api.DateRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DateRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDateRange(od as api.DateRange);
     });
   });
@@ -2273,7 +2285,9 @@
   unittest.group('obj-schema-DateRangeValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateRangeValues();
-      var od = api.DateRangeValues.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DateRangeValues.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDateRangeValues(od as api.DateRangeValues);
     });
   });
@@ -2281,7 +2295,9 @@
   unittest.group('obj-schema-Dimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimension();
-      var od = api.Dimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Dimension.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDimension(od as api.Dimension);
     });
   });
@@ -2289,7 +2305,9 @@
   unittest.group('obj-schema-DimensionFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionFilter();
-      var od = api.DimensionFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionFilter(od as api.DimensionFilter);
     });
   });
@@ -2297,7 +2315,9 @@
   unittest.group('obj-schema-DimensionFilterClause', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionFilterClause();
-      var od = api.DimensionFilterClause.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionFilterClause.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionFilterClause(od as api.DimensionFilterClause);
     });
   });
@@ -2305,7 +2325,9 @@
   unittest.group('obj-schema-DynamicSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicSegment();
-      var od = api.DynamicSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicSegment(od as api.DynamicSegment);
     });
   });
@@ -2313,7 +2335,9 @@
   unittest.group('obj-schema-EcommerceData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEcommerceData();
-      var od = api.EcommerceData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EcommerceData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEcommerceData(od as api.EcommerceData);
     });
   });
@@ -2321,7 +2345,9 @@
   unittest.group('obj-schema-EventData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventData();
-      var od = api.EventData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EventData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEventData(od as api.EventData);
     });
   });
@@ -2329,7 +2355,9 @@
   unittest.group('obj-schema-GetReportsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetReportsRequest();
-      var od = api.GetReportsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetReportsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetReportsRequest(od as api.GetReportsRequest);
     });
   });
@@ -2337,7 +2365,9 @@
   unittest.group('obj-schema-GetReportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetReportsResponse();
-      var od = api.GetReportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetReportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetReportsResponse(od as api.GetReportsResponse);
     });
   });
@@ -2345,7 +2375,9 @@
   unittest.group('obj-schema-GoalData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoalData();
-      var od = api.GoalData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GoalData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoalData(od as api.GoalData);
     });
   });
@@ -2353,7 +2385,9 @@
   unittest.group('obj-schema-GoalSetData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoalSetData();
-      var od = api.GoalSetData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoalSetData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoalSetData(od as api.GoalSetData);
     });
   });
@@ -2361,7 +2395,9 @@
   unittest.group('obj-schema-Metric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetric();
-      var od = api.Metric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metric.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetric(od as api.Metric);
     });
   });
@@ -2369,7 +2405,9 @@
   unittest.group('obj-schema-MetricFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricFilter();
-      var od = api.MetricFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricFilter(od as api.MetricFilter);
     });
   });
@@ -2377,7 +2415,9 @@
   unittest.group('obj-schema-MetricFilterClause', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricFilterClause();
-      var od = api.MetricFilterClause.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricFilterClause.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricFilterClause(od as api.MetricFilterClause);
     });
   });
@@ -2385,7 +2425,9 @@
   unittest.group('obj-schema-MetricHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricHeader();
-      var od = api.MetricHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricHeader(od as api.MetricHeader);
     });
   });
@@ -2393,7 +2435,9 @@
   unittest.group('obj-schema-MetricHeaderEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricHeaderEntry();
-      var od = api.MetricHeaderEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricHeaderEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricHeaderEntry(od as api.MetricHeaderEntry);
     });
   });
@@ -2401,7 +2445,9 @@
   unittest.group('obj-schema-OrFiltersForSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrFiltersForSegment();
-      var od = api.OrFiltersForSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrFiltersForSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrFiltersForSegment(od as api.OrFiltersForSegment);
     });
   });
@@ -2409,7 +2455,9 @@
   unittest.group('obj-schema-OrderBy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderBy();
-      var od = api.OrderBy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OrderBy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrderBy(od as api.OrderBy);
     });
   });
@@ -2417,7 +2465,9 @@
   unittest.group('obj-schema-PageviewData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageviewData();
-      var od = api.PageviewData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PageviewData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPageviewData(od as api.PageviewData);
     });
   });
@@ -2425,7 +2475,8 @@
   unittest.group('obj-schema-Pivot', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivot();
-      var od = api.Pivot.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Pivot.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPivot(od as api.Pivot);
     });
   });
@@ -2433,7 +2484,9 @@
   unittest.group('obj-schema-PivotHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotHeader();
-      var od = api.PivotHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotHeader(od as api.PivotHeader);
     });
   });
@@ -2441,7 +2494,9 @@
   unittest.group('obj-schema-PivotHeaderEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotHeaderEntry();
-      var od = api.PivotHeaderEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotHeaderEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotHeaderEntry(od as api.PivotHeaderEntry);
     });
   });
@@ -2449,7 +2504,9 @@
   unittest.group('obj-schema-PivotValueRegion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotValueRegion();
-      var od = api.PivotValueRegion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotValueRegion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotValueRegion(od as api.PivotValueRegion);
     });
   });
@@ -2457,7 +2514,9 @@
   unittest.group('obj-schema-ProductData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductData();
-      var od = api.ProductData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductData(od as api.ProductData);
     });
   });
@@ -2465,7 +2524,9 @@
   unittest.group('obj-schema-Report', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReport();
-      var od = api.Report.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Report.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReport(od as api.Report);
     });
   });
@@ -2473,7 +2534,9 @@
   unittest.group('obj-schema-ReportData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportData();
-      var od = api.ReportData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReportData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReportData(od as api.ReportData);
     });
   });
@@ -2481,7 +2544,9 @@
   unittest.group('obj-schema-ReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRequest();
-      var od = api.ReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRequest(od as api.ReportRequest);
     });
   });
@@ -2489,7 +2554,9 @@
   unittest.group('obj-schema-ReportRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRow();
-      var od = api.ReportRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReportRow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReportRow(od as api.ReportRow);
     });
   });
@@ -2497,7 +2564,9 @@
   unittest.group('obj-schema-ResourceQuotasRemaining', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceQuotasRemaining();
-      var od = api.ResourceQuotasRemaining.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceQuotasRemaining.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceQuotasRemaining(od as api.ResourceQuotasRemaining);
     });
   });
@@ -2505,7 +2574,9 @@
   unittest.group('obj-schema-ScreenviewData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScreenviewData();
-      var od = api.ScreenviewData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScreenviewData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScreenviewData(od as api.ScreenviewData);
     });
   });
@@ -2513,7 +2584,9 @@
   unittest.group('obj-schema-SearchUserActivityRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchUserActivityRequest();
-      var od = api.SearchUserActivityRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchUserActivityRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchUserActivityRequest(od as api.SearchUserActivityRequest);
     });
   });
@@ -2521,7 +2594,9 @@
   unittest.group('obj-schema-SearchUserActivityResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchUserActivityResponse();
-      var od = api.SearchUserActivityResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchUserActivityResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchUserActivityResponse(od as api.SearchUserActivityResponse);
     });
   });
@@ -2529,7 +2604,9 @@
   unittest.group('obj-schema-Segment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegment();
-      var od = api.Segment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Segment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSegment(od as api.Segment);
     });
   });
@@ -2537,7 +2614,9 @@
   unittest.group('obj-schema-SegmentDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegmentDefinition();
-      var od = api.SegmentDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SegmentDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSegmentDefinition(od as api.SegmentDefinition);
     });
   });
@@ -2545,7 +2624,9 @@
   unittest.group('obj-schema-SegmentDimensionFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegmentDimensionFilter();
-      var od = api.SegmentDimensionFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SegmentDimensionFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSegmentDimensionFilter(od as api.SegmentDimensionFilter);
     });
   });
@@ -2553,7 +2634,9 @@
   unittest.group('obj-schema-SegmentFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegmentFilter();
-      var od = api.SegmentFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SegmentFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSegmentFilter(od as api.SegmentFilter);
     });
   });
@@ -2561,7 +2644,9 @@
   unittest.group('obj-schema-SegmentFilterClause', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegmentFilterClause();
-      var od = api.SegmentFilterClause.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SegmentFilterClause.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSegmentFilterClause(od as api.SegmentFilterClause);
     });
   });
@@ -2569,7 +2654,9 @@
   unittest.group('obj-schema-SegmentMetricFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegmentMetricFilter();
-      var od = api.SegmentMetricFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SegmentMetricFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSegmentMetricFilter(od as api.SegmentMetricFilter);
     });
   });
@@ -2577,7 +2664,9 @@
   unittest.group('obj-schema-SegmentSequenceStep', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegmentSequenceStep();
-      var od = api.SegmentSequenceStep.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SegmentSequenceStep.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSegmentSequenceStep(od as api.SegmentSequenceStep);
     });
   });
@@ -2585,7 +2674,9 @@
   unittest.group('obj-schema-SequenceSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSequenceSegment();
-      var od = api.SequenceSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SequenceSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSequenceSegment(od as api.SequenceSegment);
     });
   });
@@ -2593,7 +2684,9 @@
   unittest.group('obj-schema-SimpleSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSimpleSegment();
-      var od = api.SimpleSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SimpleSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSimpleSegment(od as api.SimpleSegment);
     });
   });
@@ -2601,7 +2694,9 @@
   unittest.group('obj-schema-TransactionData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransactionData();
-      var od = api.TransactionData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransactionData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransactionData(od as api.TransactionData);
     });
   });
@@ -2609,7 +2704,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
@@ -2617,7 +2713,9 @@
   unittest.group('obj-schema-UserActivitySession', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserActivitySession();
-      var od = api.UserActivitySession.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserActivitySession.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserActivitySession(od as api.UserActivitySession);
     });
   });
diff --git a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
index 625bfc2..357383d 100644
--- a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
+++ b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
@@ -1597,7 +1597,9 @@
   unittest.group('obj-schema-ClaimDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClaimDeviceRequest();
-      var od = api.ClaimDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClaimDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClaimDeviceRequest(od as api.ClaimDeviceRequest);
     });
   });
@@ -1605,7 +1607,9 @@
   unittest.group('obj-schema-ClaimDeviceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClaimDeviceResponse();
-      var od = api.ClaimDeviceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClaimDeviceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClaimDeviceResponse(od as api.ClaimDeviceResponse);
     });
   });
@@ -1613,7 +1617,9 @@
   unittest.group('obj-schema-ClaimDevicesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClaimDevicesRequest();
-      var od = api.ClaimDevicesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClaimDevicesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClaimDevicesRequest(od as api.ClaimDevicesRequest);
     });
   });
@@ -1621,7 +1627,9 @@
   unittest.group('obj-schema-Company', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompany();
-      var od = api.Company.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Company.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCompany(od as api.Company);
     });
   });
@@ -1629,7 +1637,9 @@
   unittest.group('obj-schema-Configuration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfiguration();
-      var od = api.Configuration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Configuration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfiguration(od as api.Configuration);
     });
   });
@@ -1637,7 +1647,9 @@
   unittest.group('obj-schema-CreateCustomerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateCustomerRequest();
-      var od = api.CreateCustomerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateCustomerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateCustomerRequest(od as api.CreateCustomerRequest);
     });
   });
@@ -1645,7 +1657,9 @@
   unittest.group('obj-schema-CustomerApplyConfigurationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerApplyConfigurationRequest();
-      var od = api.CustomerApplyConfigurationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerApplyConfigurationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerApplyConfigurationRequest(
           od as api.CustomerApplyConfigurationRequest);
     });
@@ -1654,7 +1668,9 @@
   unittest.group('obj-schema-CustomerListConfigurationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerListConfigurationsResponse();
-      var od = api.CustomerListConfigurationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerListConfigurationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerListConfigurationsResponse(
           od as api.CustomerListConfigurationsResponse);
     });
@@ -1663,7 +1679,9 @@
   unittest.group('obj-schema-CustomerListCustomersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerListCustomersResponse();
-      var od = api.CustomerListCustomersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerListCustomersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerListCustomersResponse(
           od as api.CustomerListCustomersResponse);
     });
@@ -1672,7 +1690,9 @@
   unittest.group('obj-schema-CustomerListDevicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerListDevicesResponse();
-      var od = api.CustomerListDevicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerListDevicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerListDevicesResponse(od as api.CustomerListDevicesResponse);
     });
   });
@@ -1680,7 +1700,9 @@
   unittest.group('obj-schema-CustomerListDpcsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerListDpcsResponse();
-      var od = api.CustomerListDpcsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerListDpcsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerListDpcsResponse(od as api.CustomerListDpcsResponse);
     });
   });
@@ -1688,7 +1710,9 @@
   unittest.group('obj-schema-CustomerRemoveConfigurationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerRemoveConfigurationRequest();
-      var od = api.CustomerRemoveConfigurationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerRemoveConfigurationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerRemoveConfigurationRequest(
           od as api.CustomerRemoveConfigurationRequest);
     });
@@ -1697,7 +1721,9 @@
   unittest.group('obj-schema-CustomerUnclaimDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerUnclaimDeviceRequest();
-      var od = api.CustomerUnclaimDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerUnclaimDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerUnclaimDeviceRequest(od as api.CustomerUnclaimDeviceRequest);
     });
   });
@@ -1705,7 +1731,9 @@
   unittest.group('obj-schema-Device', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDevice();
-      var od = api.Device.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Device.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDevice(od as api.Device);
     });
   });
@@ -1713,7 +1741,9 @@
   unittest.group('obj-schema-DeviceClaim', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceClaim();
-      var od = api.DeviceClaim.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceClaim.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceClaim(od as api.DeviceClaim);
     });
   });
@@ -1721,7 +1751,9 @@
   unittest.group('obj-schema-DeviceIdentifier', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceIdentifier();
-      var od = api.DeviceIdentifier.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceIdentifier.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceIdentifier(od as api.DeviceIdentifier);
     });
   });
@@ -1729,7 +1761,9 @@
   unittest.group('obj-schema-DeviceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceMetadata();
-      var od = api.DeviceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceMetadata(od as api.DeviceMetadata);
     });
   });
@@ -1737,7 +1771,9 @@
   unittest.group('obj-schema-DeviceReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceReference();
-      var od = api.DeviceReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceReference(od as api.DeviceReference);
     });
   });
@@ -1745,7 +1781,9 @@
   unittest.group('obj-schema-DevicesLongRunningOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDevicesLongRunningOperationMetadata();
-      var od = api.DevicesLongRunningOperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DevicesLongRunningOperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDevicesLongRunningOperationMetadata(
           od as api.DevicesLongRunningOperationMetadata);
     });
@@ -1754,7 +1792,9 @@
   unittest.group('obj-schema-DevicesLongRunningOperationResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDevicesLongRunningOperationResponse();
-      var od = api.DevicesLongRunningOperationResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DevicesLongRunningOperationResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDevicesLongRunningOperationResponse(
           od as api.DevicesLongRunningOperationResponse);
     });
@@ -1763,7 +1803,8 @@
   unittest.group('obj-schema-Dpc', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDpc();
-      var od = api.Dpc.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Dpc.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDpc(od as api.Dpc);
     });
   });
@@ -1771,7 +1812,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1779,7 +1821,9 @@
   unittest.group('obj-schema-FindDevicesByDeviceIdentifierRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFindDevicesByDeviceIdentifierRequest();
-      var od = api.FindDevicesByDeviceIdentifierRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FindDevicesByDeviceIdentifierRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFindDevicesByDeviceIdentifierRequest(
           od as api.FindDevicesByDeviceIdentifierRequest);
     });
@@ -1788,7 +1832,9 @@
   unittest.group('obj-schema-FindDevicesByDeviceIdentifierResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFindDevicesByDeviceIdentifierResponse();
-      var od = api.FindDevicesByDeviceIdentifierResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FindDevicesByDeviceIdentifierResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFindDevicesByDeviceIdentifierResponse(
           od as api.FindDevicesByDeviceIdentifierResponse);
     });
@@ -1797,7 +1843,9 @@
   unittest.group('obj-schema-FindDevicesByOwnerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFindDevicesByOwnerRequest();
-      var od = api.FindDevicesByOwnerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FindDevicesByOwnerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFindDevicesByOwnerRequest(od as api.FindDevicesByOwnerRequest);
     });
   });
@@ -1805,7 +1853,9 @@
   unittest.group('obj-schema-FindDevicesByOwnerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFindDevicesByOwnerResponse();
-      var od = api.FindDevicesByOwnerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FindDevicesByOwnerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFindDevicesByOwnerResponse(od as api.FindDevicesByOwnerResponse);
     });
   });
@@ -1813,7 +1863,9 @@
   unittest.group('obj-schema-ListCustomersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCustomersResponse();
-      var od = api.ListCustomersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCustomersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCustomersResponse(od as api.ListCustomersResponse);
     });
   });
@@ -1821,7 +1873,9 @@
   unittest.group('obj-schema-ListVendorCustomersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListVendorCustomersResponse();
-      var od = api.ListVendorCustomersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListVendorCustomersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListVendorCustomersResponse(od as api.ListVendorCustomersResponse);
     });
   });
@@ -1829,7 +1883,9 @@
   unittest.group('obj-schema-ListVendorsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListVendorsResponse();
-      var od = api.ListVendorsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListVendorsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListVendorsResponse(od as api.ListVendorsResponse);
     });
   });
@@ -1837,7 +1893,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1845,7 +1903,9 @@
   unittest.group('obj-schema-OperationPerDevice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationPerDevice();
-      var od = api.OperationPerDevice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationPerDevice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationPerDevice(od as api.OperationPerDevice);
     });
   });
@@ -1853,7 +1913,9 @@
   unittest.group('obj-schema-PartnerClaim', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartnerClaim();
-      var od = api.PartnerClaim.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartnerClaim.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartnerClaim(od as api.PartnerClaim);
     });
   });
@@ -1861,7 +1923,9 @@
   unittest.group('obj-schema-PartnerUnclaim', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartnerUnclaim();
-      var od = api.PartnerUnclaim.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartnerUnclaim.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartnerUnclaim(od as api.PartnerUnclaim);
     });
   });
@@ -1869,7 +1933,9 @@
   unittest.group('obj-schema-PerDeviceStatusInBatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerDeviceStatusInBatch();
-      var od = api.PerDeviceStatusInBatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerDeviceStatusInBatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerDeviceStatusInBatch(od as api.PerDeviceStatusInBatch);
     });
   });
@@ -1877,7 +1943,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1885,7 +1953,9 @@
   unittest.group('obj-schema-UnclaimDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnclaimDeviceRequest();
-      var od = api.UnclaimDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnclaimDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnclaimDeviceRequest(od as api.UnclaimDeviceRequest);
     });
   });
@@ -1893,7 +1963,9 @@
   unittest.group('obj-schema-UnclaimDevicesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnclaimDevicesRequest();
-      var od = api.UnclaimDevicesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnclaimDevicesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnclaimDevicesRequest(od as api.UnclaimDevicesRequest);
     });
   });
@@ -1901,7 +1973,9 @@
   unittest.group('obj-schema-UpdateDeviceMetadataInBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDeviceMetadataInBatchRequest();
-      var od = api.UpdateDeviceMetadataInBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDeviceMetadataInBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDeviceMetadataInBatchRequest(
           od as api.UpdateDeviceMetadataInBatchRequest);
     });
@@ -1910,7 +1984,9 @@
   unittest.group('obj-schema-UpdateDeviceMetadataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDeviceMetadataRequest();
-      var od = api.UpdateDeviceMetadataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDeviceMetadataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDeviceMetadataRequest(od as api.UpdateDeviceMetadataRequest);
     });
   });
@@ -1918,7 +1994,9 @@
   unittest.group('obj-schema-UpdateMetadataArguments', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateMetadataArguments();
-      var od = api.UpdateMetadataArguments.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateMetadataArguments.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateMetadataArguments(od as api.UpdateMetadataArguments);
     });
   });
diff --git a/generated/googleapis/test/androidenterprise/v1_test.dart b/generated/googleapis/test/androidenterprise/v1_test.dart
index c2f53fb..e248343 100644
--- a/generated/googleapis/test/androidenterprise/v1_test.dart
+++ b/generated/googleapis/test/androidenterprise/v1_test.dart
@@ -3235,7 +3235,9 @@
   unittest.group('obj-schema-Administrator', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministrator();
-      var od = api.Administrator.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Administrator.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministrator(od as api.Administrator);
     });
   });
@@ -3243,7 +3245,9 @@
   unittest.group('obj-schema-AdministratorWebToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministratorWebToken();
-      var od = api.AdministratorWebToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdministratorWebToken.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministratorWebToken(od as api.AdministratorWebToken);
     });
   });
@@ -3251,7 +3255,9 @@
   unittest.group('obj-schema-AdministratorWebTokenSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministratorWebTokenSpec();
-      var od = api.AdministratorWebTokenSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdministratorWebTokenSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministratorWebTokenSpec(od as api.AdministratorWebTokenSpec);
     });
   });
@@ -3260,8 +3266,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministratorWebTokenSpecManagedConfigurations();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.AdministratorWebTokenSpecManagedConfigurations.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministratorWebTokenSpecManagedConfigurations(
           od as api.AdministratorWebTokenSpecManagedConfigurations);
     });
@@ -3270,7 +3277,9 @@
   unittest.group('obj-schema-AdministratorWebTokenSpecPlaySearch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministratorWebTokenSpecPlaySearch();
-      var od = api.AdministratorWebTokenSpecPlaySearch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdministratorWebTokenSpecPlaySearch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministratorWebTokenSpecPlaySearch(
           od as api.AdministratorWebTokenSpecPlaySearch);
     });
@@ -3279,7 +3288,9 @@
   unittest.group('obj-schema-AdministratorWebTokenSpecPrivateApps', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministratorWebTokenSpecPrivateApps();
-      var od = api.AdministratorWebTokenSpecPrivateApps.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdministratorWebTokenSpecPrivateApps.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministratorWebTokenSpecPrivateApps(
           od as api.AdministratorWebTokenSpecPrivateApps);
     });
@@ -3288,7 +3299,9 @@
   unittest.group('obj-schema-AdministratorWebTokenSpecStoreBuilder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministratorWebTokenSpecStoreBuilder();
-      var od = api.AdministratorWebTokenSpecStoreBuilder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdministratorWebTokenSpecStoreBuilder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministratorWebTokenSpecStoreBuilder(
           od as api.AdministratorWebTokenSpecStoreBuilder);
     });
@@ -3297,7 +3310,9 @@
   unittest.group('obj-schema-AdministratorWebTokenSpecWebApps', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministratorWebTokenSpecWebApps();
-      var od = api.AdministratorWebTokenSpecWebApps.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdministratorWebTokenSpecWebApps.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministratorWebTokenSpecWebApps(
           od as api.AdministratorWebTokenSpecWebApps);
     });
@@ -3306,7 +3321,9 @@
   unittest.group('obj-schema-AppRestrictionsSchema', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppRestrictionsSchema();
-      var od = api.AppRestrictionsSchema.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppRestrictionsSchema.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppRestrictionsSchema(od as api.AppRestrictionsSchema);
     });
   });
@@ -3314,7 +3331,9 @@
   unittest.group('obj-schema-AppRestrictionsSchemaChangeEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppRestrictionsSchemaChangeEvent();
-      var od = api.AppRestrictionsSchemaChangeEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppRestrictionsSchemaChangeEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppRestrictionsSchemaChangeEvent(
           od as api.AppRestrictionsSchemaChangeEvent);
     });
@@ -3323,7 +3342,9 @@
   unittest.group('obj-schema-AppRestrictionsSchemaRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppRestrictionsSchemaRestriction();
-      var od = api.AppRestrictionsSchemaRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppRestrictionsSchemaRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppRestrictionsSchemaRestriction(
           od as api.AppRestrictionsSchemaRestriction);
     });
@@ -3333,8 +3354,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppRestrictionsSchemaRestrictionRestrictionValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.AppRestrictionsSchemaRestrictionRestrictionValue.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppRestrictionsSchemaRestrictionRestrictionValue(
           od as api.AppRestrictionsSchemaRestrictionRestrictionValue);
     });
@@ -3343,7 +3365,9 @@
   unittest.group('obj-schema-AppState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppState();
-      var od = api.AppState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AppState.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAppState(od as api.AppState);
     });
   });
@@ -3351,7 +3375,9 @@
   unittest.group('obj-schema-AppUpdateEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppUpdateEvent();
-      var od = api.AppUpdateEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppUpdateEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppUpdateEvent(od as api.AppUpdateEvent);
     });
   });
@@ -3359,7 +3385,9 @@
   unittest.group('obj-schema-AppVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppVersion();
-      var od = api.AppVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AppVersion.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAppVersion(od as api.AppVersion);
     });
   });
@@ -3367,7 +3395,9 @@
   unittest.group('obj-schema-ApprovalUrlInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApprovalUrlInfo();
-      var od = api.ApprovalUrlInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApprovalUrlInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApprovalUrlInfo(od as api.ApprovalUrlInfo);
     });
   });
@@ -3375,7 +3405,9 @@
   unittest.group('obj-schema-AuthenticationToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthenticationToken();
-      var od = api.AuthenticationToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthenticationToken.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthenticationToken(od as api.AuthenticationToken);
     });
   });
@@ -3383,7 +3415,9 @@
   unittest.group('obj-schema-AutoInstallConstraint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoInstallConstraint();
-      var od = api.AutoInstallConstraint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoInstallConstraint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoInstallConstraint(od as api.AutoInstallConstraint);
     });
   });
@@ -3391,7 +3425,9 @@
   unittest.group('obj-schema-AutoInstallPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoInstallPolicy();
-      var od = api.AutoInstallPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoInstallPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoInstallPolicy(od as api.AutoInstallPolicy);
     });
   });
@@ -3399,7 +3435,9 @@
   unittest.group('obj-schema-ConfigurationVariables', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigurationVariables();
-      var od = api.ConfigurationVariables.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigurationVariables.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigurationVariables(od as api.ConfigurationVariables);
     });
   });
@@ -3407,7 +3445,9 @@
   unittest.group('obj-schema-Device', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDevice();
-      var od = api.Device.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Device.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDevice(od as api.Device);
     });
   });
@@ -3415,7 +3455,9 @@
   unittest.group('obj-schema-DeviceReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceReport();
-      var od = api.DeviceReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceReport(od as api.DeviceReport);
     });
   });
@@ -3423,7 +3465,9 @@
   unittest.group('obj-schema-DeviceReportUpdateEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceReportUpdateEvent();
-      var od = api.DeviceReportUpdateEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceReportUpdateEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceReportUpdateEvent(od as api.DeviceReportUpdateEvent);
     });
   });
@@ -3431,7 +3475,9 @@
   unittest.group('obj-schema-DeviceState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceState();
-      var od = api.DeviceState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceState(od as api.DeviceState);
     });
   });
@@ -3439,7 +3485,9 @@
   unittest.group('obj-schema-DevicesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDevicesListResponse();
-      var od = api.DevicesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DevicesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDevicesListResponse(od as api.DevicesListResponse);
     });
   });
@@ -3447,7 +3495,9 @@
   unittest.group('obj-schema-Enterprise', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnterprise();
-      var od = api.Enterprise.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Enterprise.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnterprise(od as api.Enterprise);
     });
   });
@@ -3455,7 +3505,9 @@
   unittest.group('obj-schema-EnterpriseAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnterpriseAccount();
-      var od = api.EnterpriseAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnterpriseAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnterpriseAccount(od as api.EnterpriseAccount);
     });
   });
@@ -3463,7 +3515,9 @@
   unittest.group('obj-schema-EnterprisesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnterprisesListResponse();
-      var od = api.EnterprisesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnterprisesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnterprisesListResponse(od as api.EnterprisesListResponse);
     });
   });
@@ -3471,8 +3525,9 @@
   unittest.group('obj-schema-EnterprisesSendTestPushNotificationResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnterprisesSendTestPushNotificationResponse();
-      var od =
-          api.EnterprisesSendTestPushNotificationResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnterprisesSendTestPushNotificationResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnterprisesSendTestPushNotificationResponse(
           od as api.EnterprisesSendTestPushNotificationResponse);
     });
@@ -3481,7 +3536,9 @@
   unittest.group('obj-schema-Entitlement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntitlement();
-      var od = api.Entitlement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Entitlement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntitlement(od as api.Entitlement);
     });
   });
@@ -3489,7 +3546,9 @@
   unittest.group('obj-schema-EntitlementsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntitlementsListResponse();
-      var od = api.EntitlementsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntitlementsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntitlementsListResponse(od as api.EntitlementsListResponse);
     });
   });
@@ -3497,7 +3556,9 @@
   unittest.group('obj-schema-GroupLicense', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupLicense();
-      var od = api.GroupLicense.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupLicense.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupLicense(od as api.GroupLicense);
     });
   });
@@ -3505,7 +3566,9 @@
   unittest.group('obj-schema-GroupLicenseUsersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupLicenseUsersListResponse();
-      var od = api.GroupLicenseUsersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupLicenseUsersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupLicenseUsersListResponse(
           od as api.GroupLicenseUsersListResponse);
     });
@@ -3514,7 +3577,9 @@
   unittest.group('obj-schema-GroupLicensesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupLicensesListResponse();
-      var od = api.GroupLicensesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupLicensesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupLicensesListResponse(od as api.GroupLicensesListResponse);
     });
   });
@@ -3522,7 +3587,9 @@
   unittest.group('obj-schema-Install', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstall();
-      var od = api.Install.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Install.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstall(od as api.Install);
     });
   });
@@ -3530,7 +3597,9 @@
   unittest.group('obj-schema-InstallFailureEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstallFailureEvent();
-      var od = api.InstallFailureEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstallFailureEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstallFailureEvent(od as api.InstallFailureEvent);
     });
   });
@@ -3538,7 +3607,9 @@
   unittest.group('obj-schema-InstallsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstallsListResponse();
-      var od = api.InstallsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstallsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstallsListResponse(od as api.InstallsListResponse);
     });
   });
@@ -3546,7 +3617,9 @@
   unittest.group('obj-schema-KeyedAppState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyedAppState();
-      var od = api.KeyedAppState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeyedAppState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKeyedAppState(od as api.KeyedAppState);
     });
   });
@@ -3554,7 +3627,9 @@
   unittest.group('obj-schema-LocalizedText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalizedText();
-      var od = api.LocalizedText.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalizedText.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalizedText(od as api.LocalizedText);
     });
   });
@@ -3562,7 +3637,9 @@
   unittest.group('obj-schema-MaintenanceWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenanceWindow();
-      var od = api.MaintenanceWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenanceWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenanceWindow(od as api.MaintenanceWindow);
     });
   });
@@ -3570,7 +3647,9 @@
   unittest.group('obj-schema-ManagedConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedConfiguration();
-      var od = api.ManagedConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedConfiguration(od as api.ManagedConfiguration);
     });
   });
@@ -3578,8 +3657,9 @@
   unittest.group('obj-schema-ManagedConfigurationsForDeviceListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedConfigurationsForDeviceListResponse();
-      var od =
-          api.ManagedConfigurationsForDeviceListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedConfigurationsForDeviceListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedConfigurationsForDeviceListResponse(
           od as api.ManagedConfigurationsForDeviceListResponse);
     });
@@ -3588,8 +3668,9 @@
   unittest.group('obj-schema-ManagedConfigurationsForUserListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedConfigurationsForUserListResponse();
-      var od =
-          api.ManagedConfigurationsForUserListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedConfigurationsForUserListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedConfigurationsForUserListResponse(
           od as api.ManagedConfigurationsForUserListResponse);
     });
@@ -3598,7 +3679,9 @@
   unittest.group('obj-schema-ManagedConfigurationsSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedConfigurationsSettings();
-      var od = api.ManagedConfigurationsSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedConfigurationsSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedConfigurationsSettings(
           od as api.ManagedConfigurationsSettings);
     });
@@ -3607,8 +3690,9 @@
   unittest.group('obj-schema-ManagedConfigurationsSettingsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedConfigurationsSettingsListResponse();
-      var od =
-          api.ManagedConfigurationsSettingsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedConfigurationsSettingsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedConfigurationsSettingsListResponse(
           od as api.ManagedConfigurationsSettingsListResponse);
     });
@@ -3617,7 +3701,9 @@
   unittest.group('obj-schema-ManagedProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedProperty();
-      var od = api.ManagedProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedProperty(od as api.ManagedProperty);
     });
   });
@@ -3625,7 +3711,9 @@
   unittest.group('obj-schema-ManagedPropertyBundle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedPropertyBundle();
-      var od = api.ManagedPropertyBundle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedPropertyBundle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedPropertyBundle(od as api.ManagedPropertyBundle);
     });
   });
@@ -3633,7 +3721,9 @@
   unittest.group('obj-schema-NewDeviceEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNewDeviceEvent();
-      var od = api.NewDeviceEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NewDeviceEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNewDeviceEvent(od as api.NewDeviceEvent);
     });
   });
@@ -3641,7 +3731,9 @@
   unittest.group('obj-schema-NewPermissionsEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNewPermissionsEvent();
-      var od = api.NewPermissionsEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NewPermissionsEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNewPermissionsEvent(od as api.NewPermissionsEvent);
     });
   });
@@ -3649,7 +3741,9 @@
   unittest.group('obj-schema-Notification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotification();
-      var od = api.Notification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Notification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotification(od as api.Notification);
     });
   });
@@ -3657,7 +3751,9 @@
   unittest.group('obj-schema-NotificationSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationSet();
-      var od = api.NotificationSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationSet(od as api.NotificationSet);
     });
   });
@@ -3665,7 +3761,9 @@
   unittest.group('obj-schema-PageInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageInfo();
-      var od = api.PageInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PageInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPageInfo(od as api.PageInfo);
     });
   });
@@ -3673,7 +3771,9 @@
   unittest.group('obj-schema-Permission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermission();
-      var od = api.Permission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Permission.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPermission(od as api.Permission);
     });
   });
@@ -3681,7 +3781,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -3689,7 +3791,9 @@
   unittest.group('obj-schema-Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProduct();
-      var od = api.Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Product.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProduct(od as api.Product);
     });
   });
@@ -3697,7 +3801,9 @@
   unittest.group('obj-schema-ProductApprovalEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductApprovalEvent();
-      var od = api.ProductApprovalEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductApprovalEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductApprovalEvent(od as api.ProductApprovalEvent);
     });
   });
@@ -3705,7 +3811,9 @@
   unittest.group('obj-schema-ProductAvailabilityChangeEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductAvailabilityChangeEvent();
-      var od = api.ProductAvailabilityChangeEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductAvailabilityChangeEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductAvailabilityChangeEvent(
           od as api.ProductAvailabilityChangeEvent);
     });
@@ -3714,7 +3822,9 @@
   unittest.group('obj-schema-ProductPermission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductPermission();
-      var od = api.ProductPermission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductPermission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductPermission(od as api.ProductPermission);
     });
   });
@@ -3722,7 +3832,9 @@
   unittest.group('obj-schema-ProductPermissions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductPermissions();
-      var od = api.ProductPermissions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductPermissions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductPermissions(od as api.ProductPermissions);
     });
   });
@@ -3730,7 +3842,9 @@
   unittest.group('obj-schema-ProductPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductPolicy();
-      var od = api.ProductPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductPolicy(od as api.ProductPolicy);
     });
   });
@@ -3738,7 +3852,9 @@
   unittest.group('obj-schema-ProductSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductSet();
-      var od = api.ProductSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ProductSet.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProductSet(od as api.ProductSet);
     });
   });
@@ -3746,7 +3862,9 @@
   unittest.group('obj-schema-ProductSigningCertificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductSigningCertificate();
-      var od = api.ProductSigningCertificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductSigningCertificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductSigningCertificate(od as api.ProductSigningCertificate);
     });
   });
@@ -3754,7 +3872,9 @@
   unittest.group('obj-schema-ProductVisibility', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductVisibility();
-      var od = api.ProductVisibility.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductVisibility.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductVisibility(od as api.ProductVisibility);
     });
   });
@@ -3762,7 +3882,9 @@
   unittest.group('obj-schema-ProductsApproveRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductsApproveRequest();
-      var od = api.ProductsApproveRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductsApproveRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductsApproveRequest(od as api.ProductsApproveRequest);
     });
   });
@@ -3770,7 +3892,9 @@
   unittest.group('obj-schema-ProductsGenerateApprovalUrlResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductsGenerateApprovalUrlResponse();
-      var od = api.ProductsGenerateApprovalUrlResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductsGenerateApprovalUrlResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductsGenerateApprovalUrlResponse(
           od as api.ProductsGenerateApprovalUrlResponse);
     });
@@ -3779,7 +3903,9 @@
   unittest.group('obj-schema-ProductsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductsListResponse();
-      var od = api.ProductsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductsListResponse(od as api.ProductsListResponse);
     });
   });
@@ -3787,7 +3913,9 @@
   unittest.group('obj-schema-ServiceAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccount();
-      var od = api.ServiceAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccount(od as api.ServiceAccount);
     });
   });
@@ -3795,7 +3923,9 @@
   unittest.group('obj-schema-ServiceAccountKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccountKey();
-      var od = api.ServiceAccountKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccountKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccountKey(od as api.ServiceAccountKey);
     });
   });
@@ -3803,7 +3933,9 @@
   unittest.group('obj-schema-ServiceAccountKeysListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccountKeysListResponse();
-      var od = api.ServiceAccountKeysListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccountKeysListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccountKeysListResponse(
           od as api.ServiceAccountKeysListResponse);
     });
@@ -3812,7 +3944,9 @@
   unittest.group('obj-schema-SignupInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignupInfo();
-      var od = api.SignupInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SignupInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSignupInfo(od as api.SignupInfo);
     });
   });
@@ -3820,7 +3954,9 @@
   unittest.group('obj-schema-StoreCluster', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStoreCluster();
-      var od = api.StoreCluster.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StoreCluster.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStoreCluster(od as api.StoreCluster);
     });
   });
@@ -3828,7 +3964,9 @@
   unittest.group('obj-schema-StoreLayout', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStoreLayout();
-      var od = api.StoreLayout.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StoreLayout.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStoreLayout(od as api.StoreLayout);
     });
   });
@@ -3836,7 +3974,9 @@
   unittest.group('obj-schema-StoreLayoutClustersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStoreLayoutClustersListResponse();
-      var od = api.StoreLayoutClustersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StoreLayoutClustersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStoreLayoutClustersListResponse(
           od as api.StoreLayoutClustersListResponse);
     });
@@ -3845,7 +3985,9 @@
   unittest.group('obj-schema-StoreLayoutPagesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStoreLayoutPagesListResponse();
-      var od = api.StoreLayoutPagesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StoreLayoutPagesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStoreLayoutPagesListResponse(od as api.StoreLayoutPagesListResponse);
     });
   });
@@ -3853,7 +3995,9 @@
   unittest.group('obj-schema-StorePage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStorePage();
-      var od = api.StorePage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.StorePage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStorePage(od as api.StorePage);
     });
   });
@@ -3861,7 +4005,9 @@
   unittest.group('obj-schema-TokenPagination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTokenPagination();
-      var od = api.TokenPagination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TokenPagination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTokenPagination(od as api.TokenPagination);
     });
   });
@@ -3869,7 +4015,9 @@
   unittest.group('obj-schema-TrackInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrackInfo();
-      var od = api.TrackInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TrackInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTrackInfo(od as api.TrackInfo);
     });
   });
@@ -3877,7 +4025,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
@@ -3885,7 +4034,9 @@
   unittest.group('obj-schema-UsersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsersListResponse();
-      var od = api.UsersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsersListResponse(od as api.UsersListResponse);
     });
   });
@@ -3893,7 +4044,9 @@
   unittest.group('obj-schema-VariableSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVariableSet();
-      var od = api.VariableSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VariableSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVariableSet(od as api.VariableSet);
     });
   });
@@ -3901,7 +4054,9 @@
   unittest.group('obj-schema-WebApp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebApp();
-      var od = api.WebApp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebApp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebApp(od as api.WebApp);
     });
   });
@@ -3909,7 +4064,9 @@
   unittest.group('obj-schema-WebAppIcon', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebAppIcon();
-      var od = api.WebAppIcon.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebAppIcon.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebAppIcon(od as api.WebAppIcon);
     });
   });
@@ -3917,7 +4074,9 @@
   unittest.group('obj-schema-WebAppsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebAppsListResponse();
-      var od = api.WebAppsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebAppsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebAppsListResponse(od as api.WebAppsListResponse);
     });
   });
diff --git a/generated/googleapis/test/androidmanagement/v1_test.dart b/generated/googleapis/test/androidmanagement/v1_test.dart
index fdda899..229f19b 100644
--- a/generated/googleapis/test/androidmanagement/v1_test.dart
+++ b/generated/googleapis/test/androidmanagement/v1_test.dart
@@ -4161,7 +4161,9 @@
   unittest.group('obj-schema-AdvancedSecurityOverrides', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvancedSecurityOverrides();
-      var od = api.AdvancedSecurityOverrides.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvancedSecurityOverrides.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvancedSecurityOverrides(od as api.AdvancedSecurityOverrides);
     });
   });
@@ -4169,7 +4171,9 @@
   unittest.group('obj-schema-AlwaysOnVpnPackage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAlwaysOnVpnPackage();
-      var od = api.AlwaysOnVpnPackage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AlwaysOnVpnPackage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAlwaysOnVpnPackage(od as api.AlwaysOnVpnPackage);
     });
   });
@@ -4177,7 +4181,9 @@
   unittest.group('obj-schema-ApiLevelCondition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiLevelCondition();
-      var od = api.ApiLevelCondition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApiLevelCondition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApiLevelCondition(od as api.ApiLevelCondition);
     });
   });
@@ -4185,7 +4191,9 @@
   unittest.group('obj-schema-AppTrackInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppTrackInfo();
-      var od = api.AppTrackInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppTrackInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppTrackInfo(od as api.AppTrackInfo);
     });
   });
@@ -4193,7 +4201,9 @@
   unittest.group('obj-schema-Application', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplication();
-      var od = api.Application.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Application.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplication(od as api.Application);
     });
   });
@@ -4201,7 +4211,9 @@
   unittest.group('obj-schema-ApplicationEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationEvent();
-      var od = api.ApplicationEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationEvent(od as api.ApplicationEvent);
     });
   });
@@ -4209,7 +4221,9 @@
   unittest.group('obj-schema-ApplicationPermission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationPermission();
-      var od = api.ApplicationPermission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationPermission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationPermission(od as api.ApplicationPermission);
     });
   });
@@ -4217,7 +4231,9 @@
   unittest.group('obj-schema-ApplicationPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationPolicy();
-      var od = api.ApplicationPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationPolicy(od as api.ApplicationPolicy);
     });
   });
@@ -4225,7 +4241,9 @@
   unittest.group('obj-schema-ApplicationReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationReport();
-      var od = api.ApplicationReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationReport(od as api.ApplicationReport);
     });
   });
@@ -4233,7 +4251,9 @@
   unittest.group('obj-schema-ApplicationReportingSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationReportingSettings();
-      var od = api.ApplicationReportingSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationReportingSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationReportingSettings(od as api.ApplicationReportingSettings);
     });
   });
@@ -4241,7 +4261,9 @@
   unittest.group('obj-schema-BlockAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlockAction();
-      var od = api.BlockAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BlockAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBlockAction(od as api.BlockAction);
     });
   });
@@ -4249,7 +4271,9 @@
   unittest.group('obj-schema-ChoosePrivateKeyRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChoosePrivateKeyRule();
-      var od = api.ChoosePrivateKeyRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChoosePrivateKeyRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChoosePrivateKeyRule(od as api.ChoosePrivateKeyRule);
     });
   });
@@ -4257,7 +4281,9 @@
   unittest.group('obj-schema-Command', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommand();
-      var od = api.Command.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Command.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCommand(od as api.Command);
     });
   });
@@ -4265,7 +4291,9 @@
   unittest.group('obj-schema-CommonCriteriaModeInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommonCriteriaModeInfo();
-      var od = api.CommonCriteriaModeInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommonCriteriaModeInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommonCriteriaModeInfo(od as api.CommonCriteriaModeInfo);
     });
   });
@@ -4273,7 +4301,9 @@
   unittest.group('obj-schema-ComplianceRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComplianceRule();
-      var od = api.ComplianceRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComplianceRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComplianceRule(od as api.ComplianceRule);
     });
   });
@@ -4281,7 +4311,9 @@
   unittest.group('obj-schema-ContactInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContactInfo();
-      var od = api.ContactInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContactInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContactInfo(od as api.ContactInfo);
     });
   });
@@ -4289,7 +4321,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -4297,7 +4330,9 @@
   unittest.group('obj-schema-Device', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDevice();
-      var od = api.Device.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Device.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDevice(od as api.Device);
     });
   });
@@ -4305,7 +4340,9 @@
   unittest.group('obj-schema-DeviceSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceSettings();
-      var od = api.DeviceSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceSettings(od as api.DeviceSettings);
     });
   });
@@ -4313,7 +4350,9 @@
   unittest.group('obj-schema-Display', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisplay();
-      var od = api.Display.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Display.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDisplay(od as api.Display);
     });
   });
@@ -4321,7 +4360,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -4329,7 +4369,9 @@
   unittest.group('obj-schema-EnrollmentToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnrollmentToken();
-      var od = api.EnrollmentToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnrollmentToken.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnrollmentToken(od as api.EnrollmentToken);
     });
   });
@@ -4337,7 +4379,9 @@
   unittest.group('obj-schema-Enterprise', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnterprise();
-      var od = api.Enterprise.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Enterprise.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnterprise(od as api.Enterprise);
     });
   });
@@ -4345,7 +4389,9 @@
   unittest.group('obj-schema-ExternalData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExternalData();
-      var od = api.ExternalData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExternalData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExternalData(od as api.ExternalData);
     });
   });
@@ -4353,7 +4399,9 @@
   unittest.group('obj-schema-FreezePeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFreezePeriod();
-      var od = api.FreezePeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FreezePeriod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFreezePeriod(od as api.FreezePeriod);
     });
   });
@@ -4361,7 +4409,9 @@
   unittest.group('obj-schema-HardwareInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHardwareInfo();
-      var od = api.HardwareInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HardwareInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHardwareInfo(od as api.HardwareInfo);
     });
   });
@@ -4369,7 +4419,9 @@
   unittest.group('obj-schema-HardwareStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHardwareStatus();
-      var od = api.HardwareStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HardwareStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHardwareStatus(od as api.HardwareStatus);
     });
   });
@@ -4377,7 +4429,9 @@
   unittest.group('obj-schema-KeyedAppState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyedAppState();
-      var od = api.KeyedAppState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeyedAppState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKeyedAppState(od as api.KeyedAppState);
     });
   });
@@ -4385,7 +4439,9 @@
   unittest.group('obj-schema-KioskCustomization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKioskCustomization();
-      var od = api.KioskCustomization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KioskCustomization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKioskCustomization(od as api.KioskCustomization);
     });
   });
@@ -4393,7 +4449,9 @@
   unittest.group('obj-schema-LaunchAppAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLaunchAppAction();
-      var od = api.LaunchAppAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LaunchAppAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLaunchAppAction(od as api.LaunchAppAction);
     });
   });
@@ -4401,7 +4459,9 @@
   unittest.group('obj-schema-ListDevicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDevicesResponse();
-      var od = api.ListDevicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDevicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDevicesResponse(od as api.ListDevicesResponse);
     });
   });
@@ -4409,7 +4469,9 @@
   unittest.group('obj-schema-ListEnterprisesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListEnterprisesResponse();
-      var od = api.ListEnterprisesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListEnterprisesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListEnterprisesResponse(od as api.ListEnterprisesResponse);
     });
   });
@@ -4417,7 +4479,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -4425,7 +4489,9 @@
   unittest.group('obj-schema-ListPoliciesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPoliciesResponse();
-      var od = api.ListPoliciesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPoliciesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPoliciesResponse(od as api.ListPoliciesResponse);
     });
   });
@@ -4433,7 +4499,9 @@
   unittest.group('obj-schema-ListWebAppsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListWebAppsResponse();
-      var od = api.ListWebAppsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListWebAppsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListWebAppsResponse(od as api.ListWebAppsResponse);
     });
   });
@@ -4441,7 +4509,9 @@
   unittest.group('obj-schema-ManagedConfigurationTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedConfigurationTemplate();
-      var od = api.ManagedConfigurationTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedConfigurationTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedConfigurationTemplate(od as api.ManagedConfigurationTemplate);
     });
   });
@@ -4449,7 +4519,9 @@
   unittest.group('obj-schema-ManagedProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedProperty();
-      var od = api.ManagedProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedProperty(od as api.ManagedProperty);
     });
   });
@@ -4457,7 +4529,9 @@
   unittest.group('obj-schema-ManagedPropertyEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedPropertyEntry();
-      var od = api.ManagedPropertyEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedPropertyEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedPropertyEntry(od as api.ManagedPropertyEntry);
     });
   });
@@ -4465,7 +4539,9 @@
   unittest.group('obj-schema-MemoryEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMemoryEvent();
-      var od = api.MemoryEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MemoryEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMemoryEvent(od as api.MemoryEvent);
     });
   });
@@ -4473,7 +4549,9 @@
   unittest.group('obj-schema-MemoryInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMemoryInfo();
-      var od = api.MemoryInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MemoryInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMemoryInfo(od as api.MemoryInfo);
     });
   });
@@ -4481,7 +4559,9 @@
   unittest.group('obj-schema-NetworkInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkInfo();
-      var od = api.NetworkInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkInfo(od as api.NetworkInfo);
     });
   });
@@ -4489,7 +4569,9 @@
   unittest.group('obj-schema-NonComplianceDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNonComplianceDetail();
-      var od = api.NonComplianceDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NonComplianceDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNonComplianceDetail(od as api.NonComplianceDetail);
     });
   });
@@ -4497,7 +4579,9 @@
   unittest.group('obj-schema-NonComplianceDetailCondition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNonComplianceDetailCondition();
-      var od = api.NonComplianceDetailCondition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NonComplianceDetailCondition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNonComplianceDetailCondition(od as api.NonComplianceDetailCondition);
     });
   });
@@ -4505,7 +4589,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -4513,7 +4599,9 @@
   unittest.group('obj-schema-PackageNameList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPackageNameList();
-      var od = api.PackageNameList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PackageNameList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPackageNameList(od as api.PackageNameList);
     });
   });
@@ -4521,7 +4609,9 @@
   unittest.group('obj-schema-PasswordRequirements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPasswordRequirements();
-      var od = api.PasswordRequirements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PasswordRequirements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPasswordRequirements(od as api.PasswordRequirements);
     });
   });
@@ -4529,7 +4619,9 @@
   unittest.group('obj-schema-PermissionGrant', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissionGrant();
-      var od = api.PermissionGrant.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PermissionGrant.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissionGrant(od as api.PermissionGrant);
     });
   });
@@ -4537,7 +4629,9 @@
   unittest.group('obj-schema-PersistentPreferredActivity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPersistentPreferredActivity();
-      var od = api.PersistentPreferredActivity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PersistentPreferredActivity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPersistentPreferredActivity(od as api.PersistentPreferredActivity);
     });
   });
@@ -4545,7 +4639,9 @@
   unittest.group('obj-schema-PersonalApplicationPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPersonalApplicationPolicy();
-      var od = api.PersonalApplicationPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PersonalApplicationPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPersonalApplicationPolicy(od as api.PersonalApplicationPolicy);
     });
   });
@@ -4553,7 +4649,9 @@
   unittest.group('obj-schema-PersonalUsagePolicies', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPersonalUsagePolicies();
-      var od = api.PersonalUsagePolicies.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PersonalUsagePolicies.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPersonalUsagePolicies(od as api.PersonalUsagePolicies);
     });
   });
@@ -4561,7 +4659,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -4569,7 +4669,9 @@
   unittest.group('obj-schema-PolicyEnforcementRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyEnforcementRule();
-      var od = api.PolicyEnforcementRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyEnforcementRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyEnforcementRule(od as api.PolicyEnforcementRule);
     });
   });
@@ -4577,7 +4679,9 @@
   unittest.group('obj-schema-PostureDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostureDetail();
-      var od = api.PostureDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostureDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostureDetail(od as api.PostureDetail);
     });
   });
@@ -4585,7 +4689,9 @@
   unittest.group('obj-schema-PowerManagementEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPowerManagementEvent();
-      var od = api.PowerManagementEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PowerManagementEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPowerManagementEvent(od as api.PowerManagementEvent);
     });
   });
@@ -4593,7 +4699,9 @@
   unittest.group('obj-schema-ProxyInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProxyInfo();
-      var od = api.ProxyInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ProxyInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProxyInfo(od as api.ProxyInfo);
     });
   });
@@ -4601,7 +4709,9 @@
   unittest.group('obj-schema-SecurityPosture', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPosture();
-      var od = api.SecurityPosture.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityPosture.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPosture(od as api.SecurityPosture);
     });
   });
@@ -4609,7 +4719,9 @@
   unittest.group('obj-schema-SetupAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetupAction();
-      var od = api.SetupAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetupAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetupAction(od as api.SetupAction);
     });
   });
@@ -4617,7 +4729,9 @@
   unittest.group('obj-schema-SigninDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSigninDetail();
-      var od = api.SigninDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SigninDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSigninDetail(od as api.SigninDetail);
     });
   });
@@ -4625,7 +4739,9 @@
   unittest.group('obj-schema-SignupUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignupUrl();
-      var od = api.SignupUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SignupUrl.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSignupUrl(od as api.SignupUrl);
     });
   });
@@ -4633,7 +4749,9 @@
   unittest.group('obj-schema-SoftwareInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSoftwareInfo();
-      var od = api.SoftwareInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SoftwareInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSoftwareInfo(od as api.SoftwareInfo);
     });
   });
@@ -4641,7 +4759,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4649,7 +4769,9 @@
   unittest.group('obj-schema-StatusReportingSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatusReportingSettings();
-      var od = api.StatusReportingSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StatusReportingSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStatusReportingSettings(od as api.StatusReportingSettings);
     });
   });
@@ -4657,7 +4779,9 @@
   unittest.group('obj-schema-SystemUpdate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemUpdate();
-      var od = api.SystemUpdate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemUpdate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemUpdate(od as api.SystemUpdate);
     });
   });
@@ -4665,7 +4789,9 @@
   unittest.group('obj-schema-SystemUpdateInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemUpdateInfo();
-      var od = api.SystemUpdateInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemUpdateInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemUpdateInfo(od as api.SystemUpdateInfo);
     });
   });
@@ -4673,7 +4799,9 @@
   unittest.group('obj-schema-TelephonyInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTelephonyInfo();
-      var od = api.TelephonyInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TelephonyInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTelephonyInfo(od as api.TelephonyInfo);
     });
   });
@@ -4681,7 +4809,9 @@
   unittest.group('obj-schema-TermsAndConditions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTermsAndConditions();
-      var od = api.TermsAndConditions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TermsAndConditions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTermsAndConditions(od as api.TermsAndConditions);
     });
   });
@@ -4689,7 +4819,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
@@ -4697,7 +4828,9 @@
   unittest.group('obj-schema-UserFacingMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserFacingMessage();
-      var od = api.UserFacingMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserFacingMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserFacingMessage(od as api.UserFacingMessage);
     });
   });
@@ -4705,7 +4838,9 @@
   unittest.group('obj-schema-WebApp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebApp();
-      var od = api.WebApp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebApp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebApp(od as api.WebApp);
     });
   });
@@ -4713,7 +4848,9 @@
   unittest.group('obj-schema-WebAppIcon', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebAppIcon();
-      var od = api.WebAppIcon.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebAppIcon.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebAppIcon(od as api.WebAppIcon);
     });
   });
@@ -4721,7 +4858,9 @@
   unittest.group('obj-schema-WebToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebToken();
-      var od = api.WebToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebToken.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebToken(od as api.WebToken);
     });
   });
@@ -4729,7 +4868,9 @@
   unittest.group('obj-schema-WipeAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWipeAction();
-      var od = api.WipeAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WipeAction.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWipeAction(od as api.WipeAction);
     });
   });
diff --git a/generated/googleapis/test/androidpublisher/v3_test.dart b/generated/googleapis/test/androidpublisher/v3_test.dart
index 493a0f1..5b013dd 100644
--- a/generated/googleapis/test/androidpublisher/v3_test.dart
+++ b/generated/googleapis/test/androidpublisher/v3_test.dart
@@ -2318,7 +2318,8 @@
   unittest.group('obj-schema-Apk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApk();
-      var od = api.Apk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Apk.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApk(od as api.Apk);
     });
   });
@@ -2326,7 +2327,9 @@
   unittest.group('obj-schema-ApkBinary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApkBinary();
-      var od = api.ApkBinary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ApkBinary.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApkBinary(od as api.ApkBinary);
     });
   });
@@ -2334,7 +2337,9 @@
   unittest.group('obj-schema-ApksAddExternallyHostedRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApksAddExternallyHostedRequest();
-      var od = api.ApksAddExternallyHostedRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApksAddExternallyHostedRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApksAddExternallyHostedRequest(
           od as api.ApksAddExternallyHostedRequest);
     });
@@ -2343,7 +2348,9 @@
   unittest.group('obj-schema-ApksAddExternallyHostedResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApksAddExternallyHostedResponse();
-      var od = api.ApksAddExternallyHostedResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApksAddExternallyHostedResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApksAddExternallyHostedResponse(
           od as api.ApksAddExternallyHostedResponse);
     });
@@ -2352,7 +2359,9 @@
   unittest.group('obj-schema-ApksListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApksListResponse();
-      var od = api.ApksListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApksListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApksListResponse(od as api.ApksListResponse);
     });
   });
@@ -2360,7 +2369,9 @@
   unittest.group('obj-schema-AppDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppDetails();
-      var od = api.AppDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AppDetails.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAppDetails(od as api.AppDetails);
     });
   });
@@ -2368,7 +2379,9 @@
   unittest.group('obj-schema-AppEdit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppEdit();
-      var od = api.AppEdit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AppEdit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAppEdit(od as api.AppEdit);
     });
   });
@@ -2376,7 +2389,9 @@
   unittest.group('obj-schema-Bundle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBundle();
-      var od = api.Bundle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Bundle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBundle(od as api.Bundle);
     });
   });
@@ -2384,7 +2399,9 @@
   unittest.group('obj-schema-BundlesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBundlesListResponse();
-      var od = api.BundlesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BundlesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBundlesListResponse(od as api.BundlesListResponse);
     });
   });
@@ -2392,7 +2409,9 @@
   unittest.group('obj-schema-Comment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComment();
-      var od = api.Comment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Comment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkComment(od as api.Comment);
     });
   });
@@ -2400,7 +2419,9 @@
   unittest.group('obj-schema-CountryTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCountryTargeting();
-      var od = api.CountryTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CountryTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCountryTargeting(od as api.CountryTargeting);
     });
   });
@@ -2408,7 +2429,9 @@
   unittest.group('obj-schema-DeobfuscationFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeobfuscationFile();
-      var od = api.DeobfuscationFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeobfuscationFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeobfuscationFile(od as api.DeobfuscationFile);
     });
   });
@@ -2416,7 +2439,9 @@
   unittest.group('obj-schema-DeobfuscationFilesUploadResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeobfuscationFilesUploadResponse();
-      var od = api.DeobfuscationFilesUploadResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeobfuscationFilesUploadResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeobfuscationFilesUploadResponse(
           od as api.DeobfuscationFilesUploadResponse);
     });
@@ -2425,7 +2450,9 @@
   unittest.group('obj-schema-DeveloperComment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeveloperComment();
-      var od = api.DeveloperComment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeveloperComment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeveloperComment(od as api.DeveloperComment);
     });
   });
@@ -2433,7 +2460,9 @@
   unittest.group('obj-schema-DeviceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceMetadata();
-      var od = api.DeviceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceMetadata(od as api.DeviceMetadata);
     });
   });
@@ -2441,7 +2470,9 @@
   unittest.group('obj-schema-DeviceSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceSpec();
-      var od = api.DeviceSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DeviceSpec.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeviceSpec(od as api.DeviceSpec);
     });
   });
@@ -2449,7 +2480,9 @@
   unittest.group('obj-schema-ExpansionFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpansionFile();
-      var od = api.ExpansionFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExpansionFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExpansionFile(od as api.ExpansionFile);
     });
   });
@@ -2457,7 +2490,9 @@
   unittest.group('obj-schema-ExpansionFilesUploadResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpansionFilesUploadResponse();
-      var od = api.ExpansionFilesUploadResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExpansionFilesUploadResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExpansionFilesUploadResponse(od as api.ExpansionFilesUploadResponse);
     });
   });
@@ -2465,7 +2500,9 @@
   unittest.group('obj-schema-ExternallyHostedApk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExternallyHostedApk();
-      var od = api.ExternallyHostedApk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExternallyHostedApk.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExternallyHostedApk(od as api.ExternallyHostedApk);
     });
   });
@@ -2473,7 +2510,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -2481,7 +2519,9 @@
   unittest.group('obj-schema-ImagesDeleteAllResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImagesDeleteAllResponse();
-      var od = api.ImagesDeleteAllResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImagesDeleteAllResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImagesDeleteAllResponse(od as api.ImagesDeleteAllResponse);
     });
   });
@@ -2489,7 +2529,9 @@
   unittest.group('obj-schema-ImagesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImagesListResponse();
-      var od = api.ImagesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImagesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImagesListResponse(od as api.ImagesListResponse);
     });
   });
@@ -2497,7 +2539,9 @@
   unittest.group('obj-schema-ImagesUploadResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImagesUploadResponse();
-      var od = api.ImagesUploadResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImagesUploadResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImagesUploadResponse(od as api.ImagesUploadResponse);
     });
   });
@@ -2505,7 +2549,9 @@
   unittest.group('obj-schema-InAppProduct', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInAppProduct();
-      var od = api.InAppProduct.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InAppProduct.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInAppProduct(od as api.InAppProduct);
     });
   });
@@ -2513,7 +2559,9 @@
   unittest.group('obj-schema-InAppProductListing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInAppProductListing();
-      var od = api.InAppProductListing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InAppProductListing.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInAppProductListing(od as api.InAppProductListing);
     });
   });
@@ -2521,7 +2569,9 @@
   unittest.group('obj-schema-InappproductsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInappproductsListResponse();
-      var od = api.InappproductsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InappproductsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInappproductsListResponse(od as api.InappproductsListResponse);
     });
   });
@@ -2529,7 +2579,9 @@
   unittest.group('obj-schema-InternalAppSharingArtifact', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInternalAppSharingArtifact();
-      var od = api.InternalAppSharingArtifact.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InternalAppSharingArtifact.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInternalAppSharingArtifact(od as api.InternalAppSharingArtifact);
     });
   });
@@ -2537,7 +2589,9 @@
   unittest.group('obj-schema-IntroductoryPriceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntroductoryPriceInfo();
-      var od = api.IntroductoryPriceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntroductoryPriceInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntroductoryPriceInfo(od as api.IntroductoryPriceInfo);
     });
   });
@@ -2545,7 +2599,9 @@
   unittest.group('obj-schema-Listing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListing();
-      var od = api.Listing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Listing.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkListing(od as api.Listing);
     });
   });
@@ -2553,7 +2609,9 @@
   unittest.group('obj-schema-ListingsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListingsListResponse();
-      var od = api.ListingsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListingsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListingsListResponse(od as api.ListingsListResponse);
     });
   });
@@ -2561,7 +2619,9 @@
   unittest.group('obj-schema-LocalizedText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalizedText();
-      var od = api.LocalizedText.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalizedText.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalizedText(od as api.LocalizedText);
     });
   });
@@ -2569,7 +2629,9 @@
   unittest.group('obj-schema-PageInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageInfo();
-      var od = api.PageInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PageInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPageInfo(od as api.PageInfo);
     });
   });
@@ -2577,7 +2639,8 @@
   unittest.group('obj-schema-Price', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrice();
-      var od = api.Price.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Price.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPrice(od as api.Price);
     });
   });
@@ -2585,7 +2648,9 @@
   unittest.group('obj-schema-ProductPurchase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductPurchase();
-      var od = api.ProductPurchase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductPurchase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductPurchase(od as api.ProductPurchase);
     });
   });
@@ -2593,7 +2658,9 @@
   unittest.group('obj-schema-ProductPurchasesAcknowledgeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductPurchasesAcknowledgeRequest();
-      var od = api.ProductPurchasesAcknowledgeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductPurchasesAcknowledgeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductPurchasesAcknowledgeRequest(
           od as api.ProductPurchasesAcknowledgeRequest);
     });
@@ -2602,7 +2669,9 @@
   unittest.group('obj-schema-Review', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReview();
-      var od = api.Review.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Review.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReview(od as api.Review);
     });
   });
@@ -2610,7 +2679,9 @@
   unittest.group('obj-schema-ReviewReplyResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReviewReplyResult();
-      var od = api.ReviewReplyResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReviewReplyResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReviewReplyResult(od as api.ReviewReplyResult);
     });
   });
@@ -2618,7 +2689,9 @@
   unittest.group('obj-schema-ReviewsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReviewsListResponse();
-      var od = api.ReviewsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReviewsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReviewsListResponse(od as api.ReviewsListResponse);
     });
   });
@@ -2626,7 +2699,9 @@
   unittest.group('obj-schema-ReviewsReplyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReviewsReplyRequest();
-      var od = api.ReviewsReplyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReviewsReplyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReviewsReplyRequest(od as api.ReviewsReplyRequest);
     });
   });
@@ -2634,7 +2709,9 @@
   unittest.group('obj-schema-ReviewsReplyResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReviewsReplyResponse();
-      var od = api.ReviewsReplyResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReviewsReplyResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReviewsReplyResponse(od as api.ReviewsReplyResponse);
     });
   });
@@ -2642,7 +2719,9 @@
   unittest.group('obj-schema-SubscriptionCancelSurveyResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionCancelSurveyResult();
-      var od = api.SubscriptionCancelSurveyResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionCancelSurveyResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionCancelSurveyResult(
           od as api.SubscriptionCancelSurveyResult);
     });
@@ -2651,7 +2730,9 @@
   unittest.group('obj-schema-SubscriptionDeferralInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionDeferralInfo();
-      var od = api.SubscriptionDeferralInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionDeferralInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionDeferralInfo(od as api.SubscriptionDeferralInfo);
     });
   });
@@ -2659,7 +2740,9 @@
   unittest.group('obj-schema-SubscriptionPriceChange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionPriceChange();
-      var od = api.SubscriptionPriceChange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionPriceChange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionPriceChange(od as api.SubscriptionPriceChange);
     });
   });
@@ -2667,7 +2750,9 @@
   unittest.group('obj-schema-SubscriptionPurchase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionPurchase();
-      var od = api.SubscriptionPurchase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionPurchase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionPurchase(od as api.SubscriptionPurchase);
     });
   });
@@ -2675,7 +2760,9 @@
   unittest.group('obj-schema-SubscriptionPurchasesAcknowledgeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionPurchasesAcknowledgeRequest();
-      var od = api.SubscriptionPurchasesAcknowledgeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionPurchasesAcknowledgeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionPurchasesAcknowledgeRequest(
           od as api.SubscriptionPurchasesAcknowledgeRequest);
     });
@@ -2684,7 +2771,9 @@
   unittest.group('obj-schema-SubscriptionPurchasesDeferRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionPurchasesDeferRequest();
-      var od = api.SubscriptionPurchasesDeferRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionPurchasesDeferRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionPurchasesDeferRequest(
           od as api.SubscriptionPurchasesDeferRequest);
     });
@@ -2693,7 +2782,9 @@
   unittest.group('obj-schema-SubscriptionPurchasesDeferResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionPurchasesDeferResponse();
-      var od = api.SubscriptionPurchasesDeferResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionPurchasesDeferResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionPurchasesDeferResponse(
           od as api.SubscriptionPurchasesDeferResponse);
     });
@@ -2702,7 +2793,9 @@
   unittest.group('obj-schema-SystemApksListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemApksListResponse();
-      var od = api.SystemApksListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemApksListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemApksListResponse(od as api.SystemApksListResponse);
     });
   });
@@ -2710,7 +2803,9 @@
   unittest.group('obj-schema-Testers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTesters();
-      var od = api.Testers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Testers.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTesters(od as api.Testers);
     });
   });
@@ -2718,7 +2813,9 @@
   unittest.group('obj-schema-Timestamp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimestamp();
-      var od = api.Timestamp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Timestamp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimestamp(od as api.Timestamp);
     });
   });
@@ -2726,7 +2823,9 @@
   unittest.group('obj-schema-TokenPagination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTokenPagination();
-      var od = api.TokenPagination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TokenPagination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTokenPagination(od as api.TokenPagination);
     });
   });
@@ -2734,7 +2833,8 @@
   unittest.group('obj-schema-Track', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrack();
-      var od = api.Track.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Track.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTrack(od as api.Track);
     });
   });
@@ -2742,7 +2842,9 @@
   unittest.group('obj-schema-TrackRelease', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrackRelease();
-      var od = api.TrackRelease.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrackRelease.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrackRelease(od as api.TrackRelease);
     });
   });
@@ -2750,7 +2852,9 @@
   unittest.group('obj-schema-TracksListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTracksListResponse();
-      var od = api.TracksListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TracksListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTracksListResponse(od as api.TracksListResponse);
     });
   });
@@ -2758,7 +2862,9 @@
   unittest.group('obj-schema-UserComment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserComment();
-      var od = api.UserComment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserComment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserComment(od as api.UserComment);
     });
   });
@@ -2766,7 +2872,9 @@
   unittest.group('obj-schema-UsesPermission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsesPermission();
-      var od = api.UsesPermission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsesPermission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsesPermission(od as api.UsesPermission);
     });
   });
@@ -2774,7 +2882,9 @@
   unittest.group('obj-schema-Variant', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVariant();
-      var od = api.Variant.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Variant.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVariant(od as api.Variant);
     });
   });
@@ -2782,7 +2892,9 @@
   unittest.group('obj-schema-VoidedPurchase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVoidedPurchase();
-      var od = api.VoidedPurchase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VoidedPurchase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVoidedPurchase(od as api.VoidedPurchase);
     });
   });
@@ -2790,7 +2902,9 @@
   unittest.group('obj-schema-VoidedPurchasesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVoidedPurchasesListResponse();
-      var od = api.VoidedPurchasesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VoidedPurchasesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVoidedPurchasesListResponse(od as api.VoidedPurchasesListResponse);
     });
   });
diff --git a/generated/googleapis/test/apigateway/v1_test.dart b/generated/googleapis/test/apigateway/v1_test.dart
index aa14958..59c4293 100644
--- a/generated/googleapis/test/apigateway/v1_test.dart
+++ b/generated/googleapis/test/apigateway/v1_test.dart
@@ -1395,7 +1395,9 @@
   unittest.group('obj-schema-ApigatewayApi', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayApi();
-      var od = api.ApigatewayApi.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayApi.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayApi(od as api.ApigatewayApi);
     });
   });
@@ -1403,7 +1405,9 @@
   unittest.group('obj-schema-ApigatewayApiConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayApiConfig();
-      var od = api.ApigatewayApiConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayApiConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayApiConfig(od as api.ApigatewayApiConfig);
     });
   });
@@ -1411,7 +1415,9 @@
   unittest.group('obj-schema-ApigatewayApiConfigFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayApiConfigFile();
-      var od = api.ApigatewayApiConfigFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayApiConfigFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayApiConfigFile(od as api.ApigatewayApiConfigFile);
     });
   });
@@ -1419,8 +1425,9 @@
   unittest.group('obj-schema-ApigatewayApiConfigGrpcServiceDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayApiConfigGrpcServiceDefinition();
-      var od =
-          api.ApigatewayApiConfigGrpcServiceDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayApiConfigGrpcServiceDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayApiConfigGrpcServiceDefinition(
           od as api.ApigatewayApiConfigGrpcServiceDefinition);
     });
@@ -1429,7 +1436,9 @@
   unittest.group('obj-schema-ApigatewayApiConfigOpenApiDocument', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayApiConfigOpenApiDocument();
-      var od = api.ApigatewayApiConfigOpenApiDocument.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayApiConfigOpenApiDocument.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayApiConfigOpenApiDocument(
           od as api.ApigatewayApiConfigOpenApiDocument);
     });
@@ -1438,7 +1447,9 @@
   unittest.group('obj-schema-ApigatewayAuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayAuditConfig();
-      var od = api.ApigatewayAuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayAuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayAuditConfig(od as api.ApigatewayAuditConfig);
     });
   });
@@ -1446,7 +1457,9 @@
   unittest.group('obj-schema-ApigatewayAuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayAuditLogConfig();
-      var od = api.ApigatewayAuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayAuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayAuditLogConfig(od as api.ApigatewayAuditLogConfig);
     });
   });
@@ -1454,7 +1467,9 @@
   unittest.group('obj-schema-ApigatewayBinding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayBinding();
-      var od = api.ApigatewayBinding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayBinding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayBinding(od as api.ApigatewayBinding);
     });
   });
@@ -1462,7 +1477,9 @@
   unittest.group('obj-schema-ApigatewayCancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayCancelOperationRequest();
-      var od = api.ApigatewayCancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayCancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayCancelOperationRequest(
           od as api.ApigatewayCancelOperationRequest);
     });
@@ -1471,7 +1488,9 @@
   unittest.group('obj-schema-ApigatewayExpr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayExpr();
-      var od = api.ApigatewayExpr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayExpr.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayExpr(od as api.ApigatewayExpr);
     });
   });
@@ -1479,7 +1498,9 @@
   unittest.group('obj-schema-ApigatewayGateway', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayGateway();
-      var od = api.ApigatewayGateway.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayGateway.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayGateway(od as api.ApigatewayGateway);
     });
   });
@@ -1487,7 +1508,9 @@
   unittest.group('obj-schema-ApigatewayListApiConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayListApiConfigsResponse();
-      var od = api.ApigatewayListApiConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayListApiConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayListApiConfigsResponse(
           od as api.ApigatewayListApiConfigsResponse);
     });
@@ -1496,7 +1519,9 @@
   unittest.group('obj-schema-ApigatewayListApisResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayListApisResponse();
-      var od = api.ApigatewayListApisResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayListApisResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayListApisResponse(od as api.ApigatewayListApisResponse);
     });
   });
@@ -1504,7 +1529,9 @@
   unittest.group('obj-schema-ApigatewayListGatewaysResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayListGatewaysResponse();
-      var od = api.ApigatewayListGatewaysResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayListGatewaysResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayListGatewaysResponse(
           od as api.ApigatewayListGatewaysResponse);
     });
@@ -1513,7 +1540,9 @@
   unittest.group('obj-schema-ApigatewayListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayListLocationsResponse();
-      var od = api.ApigatewayListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayListLocationsResponse(
           od as api.ApigatewayListLocationsResponse);
     });
@@ -1522,7 +1551,9 @@
   unittest.group('obj-schema-ApigatewayListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayListOperationsResponse();
-      var od = api.ApigatewayListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayListOperationsResponse(
           od as api.ApigatewayListOperationsResponse);
     });
@@ -1531,7 +1562,9 @@
   unittest.group('obj-schema-ApigatewayLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayLocation();
-      var od = api.ApigatewayLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayLocation(od as api.ApigatewayLocation);
     });
   });
@@ -1539,7 +1572,9 @@
   unittest.group('obj-schema-ApigatewayOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayOperation();
-      var od = api.ApigatewayOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayOperation(od as api.ApigatewayOperation);
     });
   });
@@ -1547,7 +1582,9 @@
   unittest.group('obj-schema-ApigatewayOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayOperationMetadata();
-      var od = api.ApigatewayOperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayOperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayOperationMetadata(od as api.ApigatewayOperationMetadata);
     });
   });
@@ -1555,7 +1592,9 @@
   unittest.group('obj-schema-ApigatewayOperationMetadataDiagnostic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayOperationMetadataDiagnostic();
-      var od = api.ApigatewayOperationMetadataDiagnostic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayOperationMetadataDiagnostic.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayOperationMetadataDiagnostic(
           od as api.ApigatewayOperationMetadataDiagnostic);
     });
@@ -1564,7 +1603,9 @@
   unittest.group('obj-schema-ApigatewayPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayPolicy();
-      var od = api.ApigatewayPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayPolicy(od as api.ApigatewayPolicy);
     });
   });
@@ -1572,7 +1613,9 @@
   unittest.group('obj-schema-ApigatewaySetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewaySetIamPolicyRequest();
-      var od = api.ApigatewaySetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewaySetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewaySetIamPolicyRequest(
           od as api.ApigatewaySetIamPolicyRequest);
     });
@@ -1581,7 +1624,9 @@
   unittest.group('obj-schema-ApigatewayStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayStatus();
-      var od = api.ApigatewayStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayStatus(od as api.ApigatewayStatus);
     });
   });
@@ -1589,7 +1634,9 @@
   unittest.group('obj-schema-ApigatewayTestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayTestIamPermissionsRequest();
-      var od = api.ApigatewayTestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayTestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayTestIamPermissionsRequest(
           od as api.ApigatewayTestIamPermissionsRequest);
     });
@@ -1598,7 +1645,9 @@
   unittest.group('obj-schema-ApigatewayTestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApigatewayTestIamPermissionsResponse();
-      var od = api.ApigatewayTestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApigatewayTestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApigatewayTestIamPermissionsResponse(
           od as api.ApigatewayTestIamPermissionsResponse);
     });
@@ -1607,7 +1656,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
diff --git a/generated/googleapis/test/apigee/v1_test.dart b/generated/googleapis/test/apigee/v1_test.dart
index d3ccb38..669a5aa 100644
--- a/generated/googleapis/test/apigee/v1_test.dart
+++ b/generated/googleapis/test/apigee/v1_test.dart
@@ -8529,7 +8529,9 @@
   unittest.group('obj-schema-GoogleApiHttpBody', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiHttpBody();
-      var od = api.GoogleApiHttpBody.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiHttpBody.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiHttpBody(od as api.GoogleApiHttpBody);
     });
   });
@@ -8537,7 +8539,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Access', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Access();
-      var od = api.GoogleCloudApigeeV1Access.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Access.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Access(od as api.GoogleCloudApigeeV1Access);
     });
   });
@@ -8545,7 +8549,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1AccessGet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1AccessGet();
-      var od = api.GoogleCloudApigeeV1AccessGet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1AccessGet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1AccessGet(od as api.GoogleCloudApigeeV1AccessGet);
     });
   });
@@ -8553,7 +8559,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1AccessRemove', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1AccessRemove();
-      var od = api.GoogleCloudApigeeV1AccessRemove.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1AccessRemove.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1AccessRemove(
           od as api.GoogleCloudApigeeV1AccessRemove);
     });
@@ -8562,7 +8570,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1AccessSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1AccessSet();
-      var od = api.GoogleCloudApigeeV1AccessSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1AccessSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1AccessSet(od as api.GoogleCloudApigeeV1AccessSet);
     });
   });
@@ -8570,8 +8580,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ActivateNatAddressRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ActivateNatAddressRequest();
-      var od =
-          api.GoogleCloudApigeeV1ActivateNatAddressRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ActivateNatAddressRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ActivateNatAddressRequest(
           od as api.GoogleCloudApigeeV1ActivateNatAddressRequest);
     });
@@ -8580,7 +8591,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Alias', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Alias();
-      var od = api.GoogleCloudApigeeV1Alias.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Alias.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Alias(od as api.GoogleCloudApigeeV1Alias);
     });
   });
@@ -8588,7 +8601,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1AliasRevisionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1AliasRevisionConfig();
-      var od = api.GoogleCloudApigeeV1AliasRevisionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1AliasRevisionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1AliasRevisionConfig(
           od as api.GoogleCloudApigeeV1AliasRevisionConfig);
     });
@@ -8597,7 +8612,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ApiCategory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ApiCategory();
-      var od = api.GoogleCloudApigeeV1ApiCategory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ApiCategory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ApiCategory(
           od as api.GoogleCloudApigeeV1ApiCategory);
     });
@@ -8606,7 +8623,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ApiCategoryData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ApiCategoryData();
-      var od = api.GoogleCloudApigeeV1ApiCategoryData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ApiCategoryData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ApiCategoryData(
           od as api.GoogleCloudApigeeV1ApiCategoryData);
     });
@@ -8615,7 +8634,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ApiProduct', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ApiProduct();
-      var od = api.GoogleCloudApigeeV1ApiProduct.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ApiProduct.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ApiProduct(
           od as api.GoogleCloudApigeeV1ApiProduct);
     });
@@ -8624,7 +8645,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ApiProductRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ApiProductRef();
-      var od = api.GoogleCloudApigeeV1ApiProductRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ApiProductRef.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ApiProductRef(
           od as api.GoogleCloudApigeeV1ApiProductRef);
     });
@@ -8633,7 +8656,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ApiProxy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ApiProxy();
-      var od = api.GoogleCloudApigeeV1ApiProxy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ApiProxy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ApiProxy(od as api.GoogleCloudApigeeV1ApiProxy);
     });
   });
@@ -8641,7 +8666,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ApiProxyRevision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ApiProxyRevision();
-      var od = api.GoogleCloudApigeeV1ApiProxyRevision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ApiProxyRevision.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ApiProxyRevision(
           od as api.GoogleCloudApigeeV1ApiProxyRevision);
     });
@@ -8650,7 +8677,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ApiResponseWrapper', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ApiResponseWrapper();
-      var od = api.GoogleCloudApigeeV1ApiResponseWrapper.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ApiResponseWrapper.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ApiResponseWrapper(
           od as api.GoogleCloudApigeeV1ApiResponseWrapper);
     });
@@ -8659,7 +8688,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1App', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1App();
-      var od = api.GoogleCloudApigeeV1App.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1App.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1App(od as api.GoogleCloudApigeeV1App);
     });
   });
@@ -8667,7 +8698,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1AsyncQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1AsyncQuery();
-      var od = api.GoogleCloudApigeeV1AsyncQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1AsyncQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1AsyncQuery(
           od as api.GoogleCloudApigeeV1AsyncQuery);
     });
@@ -8676,7 +8709,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1AsyncQueryResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1AsyncQueryResult();
-      var od = api.GoogleCloudApigeeV1AsyncQueryResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1AsyncQueryResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1AsyncQueryResult(
           od as api.GoogleCloudApigeeV1AsyncQueryResult);
     });
@@ -8685,7 +8720,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1AsyncQueryResultView', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1AsyncQueryResultView();
-      var od = api.GoogleCloudApigeeV1AsyncQueryResultView.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1AsyncQueryResultView.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1AsyncQueryResultView(
           od as api.GoogleCloudApigeeV1AsyncQueryResultView);
     });
@@ -8694,7 +8731,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Attribute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Attribute();
-      var od = api.GoogleCloudApigeeV1Attribute.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Attribute.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Attribute(od as api.GoogleCloudApigeeV1Attribute);
     });
   });
@@ -8702,7 +8741,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Attributes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Attributes();
-      var od = api.GoogleCloudApigeeV1Attributes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Attributes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Attributes(
           od as api.GoogleCloudApigeeV1Attributes);
     });
@@ -8711,7 +8752,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1CanaryEvaluation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1CanaryEvaluation();
-      var od = api.GoogleCloudApigeeV1CanaryEvaluation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1CanaryEvaluation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1CanaryEvaluation(
           od as api.GoogleCloudApigeeV1CanaryEvaluation);
     });
@@ -8721,8 +8764,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1CanaryEvaluationMetricLabels();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1CanaryEvaluationMetricLabels.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1CanaryEvaluationMetricLabels(
           od as api.GoogleCloudApigeeV1CanaryEvaluationMetricLabels);
     });
@@ -8731,7 +8775,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1CertInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1CertInfo();
-      var od = api.GoogleCloudApigeeV1CertInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1CertInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1CertInfo(od as api.GoogleCloudApigeeV1CertInfo);
     });
   });
@@ -8739,7 +8785,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Certificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Certificate();
-      var od = api.GoogleCloudApigeeV1Certificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Certificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Certificate(
           od as api.GoogleCloudApigeeV1Certificate);
     });
@@ -8748,7 +8796,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1CommonNameConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1CommonNameConfig();
-      var od = api.GoogleCloudApigeeV1CommonNameConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1CommonNameConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1CommonNameConfig(
           od as api.GoogleCloudApigeeV1CommonNameConfig);
     });
@@ -8757,7 +8807,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ConfigVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ConfigVersion();
-      var od = api.GoogleCloudApigeeV1ConfigVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ConfigVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ConfigVersion(
           od as api.GoogleCloudApigeeV1ConfigVersion);
     });
@@ -8766,7 +8818,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Credential', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Credential();
-      var od = api.GoogleCloudApigeeV1Credential.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Credential.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Credential(
           od as api.GoogleCloudApigeeV1Credential);
     });
@@ -8775,7 +8829,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1CustomReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1CustomReport();
-      var od = api.GoogleCloudApigeeV1CustomReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1CustomReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1CustomReport(
           od as api.GoogleCloudApigeeV1CustomReport);
     });
@@ -8784,7 +8840,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1CustomReportMetric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1CustomReportMetric();
-      var od = api.GoogleCloudApigeeV1CustomReportMetric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1CustomReportMetric.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1CustomReportMetric(
           od as api.GoogleCloudApigeeV1CustomReportMetric);
     });
@@ -8793,7 +8851,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DataCollector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DataCollector();
-      var od = api.GoogleCloudApigeeV1DataCollector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DataCollector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DataCollector(
           od as api.GoogleCloudApigeeV1DataCollector);
     });
@@ -8802,7 +8862,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DataCollectorConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DataCollectorConfig();
-      var od = api.GoogleCloudApigeeV1DataCollectorConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DataCollectorConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DataCollectorConfig(
           od as api.GoogleCloudApigeeV1DataCollectorConfig);
     });
@@ -8811,7 +8873,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Datastore', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Datastore();
-      var od = api.GoogleCloudApigeeV1Datastore.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Datastore.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Datastore(od as api.GoogleCloudApigeeV1Datastore);
     });
   });
@@ -8819,7 +8883,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DatastoreConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DatastoreConfig();
-      var od = api.GoogleCloudApigeeV1DatastoreConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DatastoreConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DatastoreConfig(
           od as api.GoogleCloudApigeeV1DatastoreConfig);
     });
@@ -8828,7 +8894,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DateRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DateRange();
-      var od = api.GoogleCloudApigeeV1DateRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DateRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DateRange(od as api.GoogleCloudApigeeV1DateRange);
     });
   });
@@ -8836,7 +8904,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DebugMask', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DebugMask();
-      var od = api.GoogleCloudApigeeV1DebugMask.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DebugMask.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DebugMask(od as api.GoogleCloudApigeeV1DebugMask);
     });
   });
@@ -8844,7 +8914,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DebugSession', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DebugSession();
-      var od = api.GoogleCloudApigeeV1DebugSession.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DebugSession.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DebugSession(
           od as api.GoogleCloudApigeeV1DebugSession);
     });
@@ -8853,8 +8925,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DebugSessionTransaction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DebugSessionTransaction();
-      var od =
-          api.GoogleCloudApigeeV1DebugSessionTransaction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DebugSessionTransaction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DebugSessionTransaction(
           od as api.GoogleCloudApigeeV1DebugSessionTransaction);
     });
@@ -8864,8 +8937,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DeleteCustomReportResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1DeleteCustomReportResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DeleteCustomReportResponse(
           od as api.GoogleCloudApigeeV1DeleteCustomReportResponse);
     });
@@ -8874,7 +8948,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Deployment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Deployment();
-      var od = api.GoogleCloudApigeeV1Deployment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Deployment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Deployment(
           od as api.GoogleCloudApigeeV1Deployment);
     });
@@ -8883,8 +8959,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DeploymentChangeReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DeploymentChangeReport();
-      var od =
-          api.GoogleCloudApigeeV1DeploymentChangeReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DeploymentChangeReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DeploymentChangeReport(
           od as api.GoogleCloudApigeeV1DeploymentChangeReport);
     });
@@ -8894,9 +8971,10 @@
       'obj-schema-GoogleCloudApigeeV1DeploymentChangeReportRoutingChange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DeploymentChangeReportRoutingChange();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudApigeeV1DeploymentChangeReportRoutingChange.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DeploymentChangeReportRoutingChange(
           od as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingChange);
     });
@@ -8907,9 +8985,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(
           od as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict);
     });
@@ -8920,8 +8999,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment(
           od as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment);
     });
@@ -8930,7 +9010,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DeploymentConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DeploymentConfig();
-      var od = api.GoogleCloudApigeeV1DeploymentConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DeploymentConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DeploymentConfig(
           od as api.GoogleCloudApigeeV1DeploymentConfig);
     });
@@ -8939,7 +9021,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Developer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Developer();
-      var od = api.GoogleCloudApigeeV1Developer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Developer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Developer(od as api.GoogleCloudApigeeV1Developer);
     });
   });
@@ -8947,7 +9031,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DeveloperApp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DeveloperApp();
-      var od = api.GoogleCloudApigeeV1DeveloperApp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DeveloperApp.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DeveloperApp(
           od as api.GoogleCloudApigeeV1DeveloperApp);
     });
@@ -8956,7 +9042,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DeveloperAppKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DeveloperAppKey();
-      var od = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DeveloperAppKey(
           od as api.GoogleCloudApigeeV1DeveloperAppKey);
     });
@@ -8965,7 +9053,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1DimensionMetric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1DimensionMetric();
-      var od = api.GoogleCloudApigeeV1DimensionMetric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1DimensionMetric.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1DimensionMetric(
           od as api.GoogleCloudApigeeV1DimensionMetric);
     });
@@ -8974,7 +9064,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1EntityMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1EntityMetadata();
-      var od = api.GoogleCloudApigeeV1EntityMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1EntityMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1EntityMetadata(
           od as api.GoogleCloudApigeeV1EntityMetadata);
     });
@@ -8983,7 +9075,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Environment();
-      var od = api.GoogleCloudApigeeV1Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Environment(
           od as api.GoogleCloudApigeeV1Environment);
     });
@@ -8992,7 +9086,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1EnvironmentConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1EnvironmentConfig();
-      var od = api.GoogleCloudApigeeV1EnvironmentConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1EnvironmentConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1EnvironmentConfig(
           od as api.GoogleCloudApigeeV1EnvironmentConfig);
     });
@@ -9001,7 +9097,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1EnvironmentGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1EnvironmentGroup();
-      var od = api.GoogleCloudApigeeV1EnvironmentGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1EnvironmentGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1EnvironmentGroup(
           od as api.GoogleCloudApigeeV1EnvironmentGroup);
     });
@@ -9011,8 +9109,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1EnvironmentGroupAttachment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1EnvironmentGroupAttachment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1EnvironmentGroupAttachment(
           od as api.GoogleCloudApigeeV1EnvironmentGroupAttachment);
     });
@@ -9021,8 +9120,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1EnvironmentGroupConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1EnvironmentGroupConfig();
-      var od =
-          api.GoogleCloudApigeeV1EnvironmentGroupConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1EnvironmentGroupConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1EnvironmentGroupConfig(
           od as api.GoogleCloudApigeeV1EnvironmentGroupConfig);
     });
@@ -9031,7 +9131,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Export', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Export();
-      var od = api.GoogleCloudApigeeV1Export.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Export.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Export(od as api.GoogleCloudApigeeV1Export);
     });
   });
@@ -9039,7 +9141,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ExportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ExportRequest();
-      var od = api.GoogleCloudApigeeV1ExportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ExportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ExportRequest(
           od as api.GoogleCloudApigeeV1ExportRequest);
     });
@@ -9048,7 +9152,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1FlowHook', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1FlowHook();
-      var od = api.GoogleCloudApigeeV1FlowHook.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1FlowHook.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1FlowHook(od as api.GoogleCloudApigeeV1FlowHook);
     });
   });
@@ -9056,7 +9162,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1FlowHookConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1FlowHookConfig();
-      var od = api.GoogleCloudApigeeV1FlowHookConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1FlowHookConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1FlowHookConfig(
           od as api.GoogleCloudApigeeV1FlowHookConfig);
     });
@@ -9066,8 +9174,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1GetSyncAuthorizationRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1GetSyncAuthorizationRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1GetSyncAuthorizationRequest(
           od as api.GoogleCloudApigeeV1GetSyncAuthorizationRequest);
     });
@@ -9076,7 +9185,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1IngressConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1IngressConfig();
-      var od = api.GoogleCloudApigeeV1IngressConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1IngressConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1IngressConfig(
           od as api.GoogleCloudApigeeV1IngressConfig);
     });
@@ -9085,7 +9196,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Instance();
-      var od = api.GoogleCloudApigeeV1Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Instance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Instance(od as api.GoogleCloudApigeeV1Instance);
     });
   });
@@ -9093,7 +9206,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1InstanceAttachment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1InstanceAttachment();
-      var od = api.GoogleCloudApigeeV1InstanceAttachment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1InstanceAttachment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1InstanceAttachment(
           od as api.GoogleCloudApigeeV1InstanceAttachment);
     });
@@ -9102,8 +9217,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1InstanceDeploymentStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1InstanceDeploymentStatus();
-      var od =
-          api.GoogleCloudApigeeV1InstanceDeploymentStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1InstanceDeploymentStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1InstanceDeploymentStatus(
           od as api.GoogleCloudApigeeV1InstanceDeploymentStatus);
     });
@@ -9115,8 +9231,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision(od
           as api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision);
     });
@@ -9127,9 +9244,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute(
           od as api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute);
     });
@@ -9138,7 +9256,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1KeyAliasReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1KeyAliasReference();
-      var od = api.GoogleCloudApigeeV1KeyAliasReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1KeyAliasReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1KeyAliasReference(
           od as api.GoogleCloudApigeeV1KeyAliasReference);
     });
@@ -9147,7 +9267,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1KeyValueMap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1KeyValueMap();
-      var od = api.GoogleCloudApigeeV1KeyValueMap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1KeyValueMap.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1KeyValueMap(
           od as api.GoogleCloudApigeeV1KeyValueMap);
     });
@@ -9156,7 +9278,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Keystore', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Keystore();
-      var od = api.GoogleCloudApigeeV1Keystore.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Keystore.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Keystore(od as api.GoogleCloudApigeeV1Keystore);
     });
   });
@@ -9164,7 +9288,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1KeystoreConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1KeystoreConfig();
-      var od = api.GoogleCloudApigeeV1KeystoreConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1KeystoreConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1KeystoreConfig(
           od as api.GoogleCloudApigeeV1KeystoreConfig);
     });
@@ -9173,8 +9299,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListApiCategoriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListApiCategoriesResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListApiCategoriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListApiCategoriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListApiCategoriesResponse(
           od as api.GoogleCloudApigeeV1ListApiCategoriesResponse);
     });
@@ -9183,8 +9310,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListApiProductsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListApiProductsResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListApiProductsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListApiProductsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListApiProductsResponse(
           od as api.GoogleCloudApigeeV1ListApiProductsResponse);
     });
@@ -9193,8 +9321,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListApiProxiesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListApiProxiesResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListApiProxiesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListApiProxiesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListApiProxiesResponse(
           od as api.GoogleCloudApigeeV1ListApiProxiesResponse);
     });
@@ -9203,7 +9332,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListAppsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListAppsResponse();
-      var od = api.GoogleCloudApigeeV1ListAppsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListAppsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListAppsResponse(
           od as api.GoogleCloudApigeeV1ListAppsResponse);
     });
@@ -9212,8 +9343,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListAsyncQueriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListAsyncQueriesResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListAsyncQueriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListAsyncQueriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListAsyncQueriesResponse(
           od as api.GoogleCloudApigeeV1ListAsyncQueriesResponse);
     });
@@ -9222,8 +9354,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListCustomReportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListCustomReportsResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListCustomReportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListCustomReportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListCustomReportsResponse(
           od as api.GoogleCloudApigeeV1ListCustomReportsResponse);
     });
@@ -9233,8 +9366,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListDataCollectorsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1ListDataCollectorsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListDataCollectorsResponse(
           od as api.GoogleCloudApigeeV1ListDataCollectorsResponse);
     });
@@ -9243,8 +9377,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListDatastoresResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListDatastoresResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListDatastoresResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListDatastoresResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListDatastoresResponse(
           od as api.GoogleCloudApigeeV1ListDatastoresResponse);
     });
@@ -9253,8 +9388,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListDebugSessionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListDebugSessionsResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListDebugSessionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListDebugSessionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListDebugSessionsResponse(
           od as api.GoogleCloudApigeeV1ListDebugSessionsResponse);
     });
@@ -9263,8 +9399,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListDeploymentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListDeploymentsResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListDeploymentsResponse(
           od as api.GoogleCloudApigeeV1ListDeploymentsResponse);
     });
@@ -9273,8 +9410,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListDeveloperAppsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListDeveloperAppsResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListDeveloperAppsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListDeveloperAppsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListDeveloperAppsResponse(
           od as api.GoogleCloudApigeeV1ListDeveloperAppsResponse);
     });
@@ -9285,8 +9423,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse(
           od as api.GoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse);
     });
@@ -9296,8 +9435,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListEnvironmentGroupsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1ListEnvironmentGroupsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListEnvironmentGroupsResponse(
           od as api.GoogleCloudApigeeV1ListEnvironmentGroupsResponse);
     });
@@ -9307,8 +9447,9 @@
       'obj-schema-GoogleCloudApigeeV1ListEnvironmentResourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListEnvironmentResourcesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1ListEnvironmentResourcesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListEnvironmentResourcesResponse(
           od as api.GoogleCloudApigeeV1ListEnvironmentResourcesResponse);
     });
@@ -9317,7 +9458,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListExportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListExportsResponse();
-      var od = api.GoogleCloudApigeeV1ListExportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListExportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListExportsResponse(
           od as api.GoogleCloudApigeeV1ListExportsResponse);
     });
@@ -9326,8 +9469,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListHybridIssuersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListHybridIssuersResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListHybridIssuersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListHybridIssuersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListHybridIssuersResponse(
           od as api.GoogleCloudApigeeV1ListHybridIssuersResponse);
     });
@@ -9337,8 +9481,9 @@
       'obj-schema-GoogleCloudApigeeV1ListInstanceAttachmentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListInstanceAttachmentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1ListInstanceAttachmentsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListInstanceAttachmentsResponse(
           od as api.GoogleCloudApigeeV1ListInstanceAttachmentsResponse);
     });
@@ -9347,8 +9492,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListInstancesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListInstancesResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListInstancesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListInstancesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListInstancesResponse(
           od as api.GoogleCloudApigeeV1ListInstancesResponse);
     });
@@ -9357,8 +9503,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListNatAddressesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListNatAddressesResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListNatAddressesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListNatAddressesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListNatAddressesResponse(
           od as api.GoogleCloudApigeeV1ListNatAddressesResponse);
     });
@@ -9367,8 +9514,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListOfDevelopersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListOfDevelopersResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListOfDevelopersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListOfDevelopersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListOfDevelopersResponse(
           od as api.GoogleCloudApigeeV1ListOfDevelopersResponse);
     });
@@ -9377,8 +9525,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListOrganizationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListOrganizationsResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListOrganizationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListOrganizationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListOrganizationsResponse(
           od as api.GoogleCloudApigeeV1ListOrganizationsResponse);
     });
@@ -9387,8 +9536,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ListSharedFlowsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ListSharedFlowsResponse();
-      var od =
-          api.GoogleCloudApigeeV1ListSharedFlowsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ListSharedFlowsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ListSharedFlowsResponse(
           od as api.GoogleCloudApigeeV1ListSharedFlowsResponse);
     });
@@ -9397,7 +9547,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Metadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Metadata();
-      var od = api.GoogleCloudApigeeV1Metadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Metadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Metadata(od as api.GoogleCloudApigeeV1Metadata);
     });
   });
@@ -9405,7 +9557,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Metric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Metric();
-      var od = api.GoogleCloudApigeeV1Metric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Metric.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Metric(od as api.GoogleCloudApigeeV1Metric);
     });
   });
@@ -9413,7 +9567,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1NatAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1NatAddress();
-      var od = api.GoogleCloudApigeeV1NatAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1NatAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1NatAddress(
           od as api.GoogleCloudApigeeV1NatAddress);
     });
@@ -9422,7 +9578,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Operation();
-      var od = api.GoogleCloudApigeeV1Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Operation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Operation(od as api.GoogleCloudApigeeV1Operation);
     });
   });
@@ -9430,7 +9588,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1OperationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1OperationConfig();
-      var od = api.GoogleCloudApigeeV1OperationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1OperationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1OperationConfig(
           od as api.GoogleCloudApigeeV1OperationConfig);
     });
@@ -9439,7 +9599,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1OperationGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1OperationGroup();
-      var od = api.GoogleCloudApigeeV1OperationGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1OperationGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1OperationGroup(
           od as api.GoogleCloudApigeeV1OperationGroup);
     });
@@ -9448,7 +9610,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1OperationMetadata();
-      var od = api.GoogleCloudApigeeV1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1OperationMetadata(
           od as api.GoogleCloudApigeeV1OperationMetadata);
     });
@@ -9457,7 +9621,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1OptimizedStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1OptimizedStats();
-      var od = api.GoogleCloudApigeeV1OptimizedStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1OptimizedStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1OptimizedStats(
           od as api.GoogleCloudApigeeV1OptimizedStats);
     });
@@ -9466,7 +9632,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1OptimizedStatsNode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1OptimizedStatsNode();
-      var od = api.GoogleCloudApigeeV1OptimizedStatsNode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1OptimizedStatsNode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1OptimizedStatsNode(
           od as api.GoogleCloudApigeeV1OptimizedStatsNode);
     });
@@ -9475,8 +9643,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1OptimizedStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1OptimizedStatsResponse();
-      var od =
-          api.GoogleCloudApigeeV1OptimizedStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1OptimizedStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1OptimizedStatsResponse(
           od as api.GoogleCloudApigeeV1OptimizedStatsResponse);
     });
@@ -9485,7 +9654,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Organization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Organization();
-      var od = api.GoogleCloudApigeeV1Organization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Organization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Organization(
           od as api.GoogleCloudApigeeV1Organization);
     });
@@ -9495,8 +9666,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1OrganizationProjectMapping();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1OrganizationProjectMapping.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1OrganizationProjectMapping(
           od as api.GoogleCloudApigeeV1OrganizationProjectMapping);
     });
@@ -9505,7 +9677,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1PodStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1PodStatus();
-      var od = api.GoogleCloudApigeeV1PodStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1PodStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1PodStatus(od as api.GoogleCloudApigeeV1PodStatus);
     });
   });
@@ -9513,7 +9687,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Point', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Point();
-      var od = api.GoogleCloudApigeeV1Point.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Point.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Point(od as api.GoogleCloudApigeeV1Point);
     });
   });
@@ -9521,7 +9697,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Properties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Properties();
-      var od = api.GoogleCloudApigeeV1Properties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Properties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Properties(
           od as api.GoogleCloudApigeeV1Properties);
     });
@@ -9530,7 +9708,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Property', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Property();
-      var od = api.GoogleCloudApigeeV1Property.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Property.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Property(od as api.GoogleCloudApigeeV1Property);
     });
   });
@@ -9539,8 +9719,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ProvisionOrganizationRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1ProvisionOrganizationRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ProvisionOrganizationRequest(
           od as api.GoogleCloudApigeeV1ProvisionOrganizationRequest);
     });
@@ -9549,7 +9730,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Query', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Query();
-      var od = api.GoogleCloudApigeeV1Query.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Query.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Query(od as api.GoogleCloudApigeeV1Query);
     });
   });
@@ -9557,7 +9740,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1QueryMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1QueryMetadata();
-      var od = api.GoogleCloudApigeeV1QueryMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1QueryMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1QueryMetadata(
           od as api.GoogleCloudApigeeV1QueryMetadata);
     });
@@ -9566,7 +9751,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1QueryMetric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1QueryMetric();
-      var od = api.GoogleCloudApigeeV1QueryMetric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1QueryMetric.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1QueryMetric(
           od as api.GoogleCloudApigeeV1QueryMetric);
     });
@@ -9575,7 +9762,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Quota', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Quota();
-      var od = api.GoogleCloudApigeeV1Quota.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Quota.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Quota(od as api.GoogleCloudApigeeV1Quota);
     });
   });
@@ -9583,7 +9772,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Reference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Reference();
-      var od = api.GoogleCloudApigeeV1Reference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Reference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Reference(od as api.GoogleCloudApigeeV1Reference);
     });
   });
@@ -9591,7 +9782,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ReferenceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ReferenceConfig();
-      var od = api.GoogleCloudApigeeV1ReferenceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ReferenceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ReferenceConfig(
           od as api.GoogleCloudApigeeV1ReferenceConfig);
     });
@@ -9601,8 +9794,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ReportInstanceStatusRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1ReportInstanceStatusRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ReportInstanceStatusRequest(
           od as api.GoogleCloudApigeeV1ReportInstanceStatusRequest);
     });
@@ -9612,8 +9806,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ReportInstanceStatusResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1ReportInstanceStatusResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ReportInstanceStatusResponse(
           od as api.GoogleCloudApigeeV1ReportInstanceStatusResponse);
     });
@@ -9622,7 +9817,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ReportProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ReportProperty();
-      var od = api.GoogleCloudApigeeV1ReportProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ReportProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ReportProperty(
           od as api.GoogleCloudApigeeV1ReportProperty);
     });
@@ -9631,7 +9828,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ResourceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ResourceConfig();
-      var od = api.GoogleCloudApigeeV1ResourceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ResourceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ResourceConfig(
           od as api.GoogleCloudApigeeV1ResourceConfig);
     });
@@ -9640,7 +9839,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ResourceFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ResourceFile();
-      var od = api.GoogleCloudApigeeV1ResourceFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ResourceFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ResourceFile(
           od as api.GoogleCloudApigeeV1ResourceFile);
     });
@@ -9649,7 +9850,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ResourceFiles', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ResourceFiles();
-      var od = api.GoogleCloudApigeeV1ResourceFiles.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ResourceFiles.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ResourceFiles(
           od as api.GoogleCloudApigeeV1ResourceFiles);
     });
@@ -9658,7 +9861,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ResourceStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ResourceStatus();
-      var od = api.GoogleCloudApigeeV1ResourceStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ResourceStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ResourceStatus(
           od as api.GoogleCloudApigeeV1ResourceStatus);
     });
@@ -9667,7 +9872,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Result', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Result();
-      var od = api.GoogleCloudApigeeV1Result.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Result.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Result(od as api.GoogleCloudApigeeV1Result);
     });
   });
@@ -9675,7 +9882,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1RevisionStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1RevisionStatus();
-      var od = api.GoogleCloudApigeeV1RevisionStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1RevisionStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1RevisionStatus(
           od as api.GoogleCloudApigeeV1RevisionStatus);
     });
@@ -9684,7 +9893,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1RoutingRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1RoutingRule();
-      var od = api.GoogleCloudApigeeV1RoutingRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1RoutingRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1RoutingRule(
           od as api.GoogleCloudApigeeV1RoutingRule);
     });
@@ -9693,7 +9904,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1RuntimeTraceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1RuntimeTraceConfig();
-      var od = api.GoogleCloudApigeeV1RuntimeTraceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1RuntimeTraceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1RuntimeTraceConfig(
           od as api.GoogleCloudApigeeV1RuntimeTraceConfig);
     });
@@ -9703,8 +9916,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1RuntimeTraceConfigOverride();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1RuntimeTraceConfigOverride.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1RuntimeTraceConfigOverride(
           od as api.GoogleCloudApigeeV1RuntimeTraceConfigOverride);
     });
@@ -9714,8 +9928,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1RuntimeTraceSamplingConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudApigeeV1RuntimeTraceSamplingConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1RuntimeTraceSamplingConfig(
           od as api.GoogleCloudApigeeV1RuntimeTraceSamplingConfig);
     });
@@ -9724,7 +9939,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Schema', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Schema();
-      var od = api.GoogleCloudApigeeV1Schema.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Schema.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Schema(od as api.GoogleCloudApigeeV1Schema);
     });
   });
@@ -9732,7 +9949,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1SchemaSchemaElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1SchemaSchemaElement();
-      var od = api.GoogleCloudApigeeV1SchemaSchemaElement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1SchemaSchemaElement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1SchemaSchemaElement(
           od as api.GoogleCloudApigeeV1SchemaSchemaElement);
     });
@@ -9741,7 +9960,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1SchemaSchemaProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1SchemaSchemaProperty();
-      var od = api.GoogleCloudApigeeV1SchemaSchemaProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1SchemaSchemaProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1SchemaSchemaProperty(
           od as api.GoogleCloudApigeeV1SchemaSchemaProperty);
     });
@@ -9750,8 +9971,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1ServiceIssuersMapping', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1ServiceIssuersMapping();
-      var od =
-          api.GoogleCloudApigeeV1ServiceIssuersMapping.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1ServiceIssuersMapping.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1ServiceIssuersMapping(
           od as api.GoogleCloudApigeeV1ServiceIssuersMapping);
     });
@@ -9760,7 +9982,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Session', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Session();
-      var od = api.GoogleCloudApigeeV1Session.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Session.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Session(od as api.GoogleCloudApigeeV1Session);
     });
   });
@@ -9768,7 +9992,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1SharedFlow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1SharedFlow();
-      var od = api.GoogleCloudApigeeV1SharedFlow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1SharedFlow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1SharedFlow(
           od as api.GoogleCloudApigeeV1SharedFlow);
     });
@@ -9777,7 +10003,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1SharedFlowRevision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1SharedFlowRevision();
-      var od = api.GoogleCloudApigeeV1SharedFlowRevision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1SharedFlowRevision.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1SharedFlowRevision(
           od as api.GoogleCloudApigeeV1SharedFlowRevision);
     });
@@ -9786,7 +10014,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Stats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Stats();
-      var od = api.GoogleCloudApigeeV1Stats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Stats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Stats(od as api.GoogleCloudApigeeV1Stats);
     });
   });
@@ -9794,8 +10024,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1StatsEnvironmentStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1StatsEnvironmentStats();
-      var od =
-          api.GoogleCloudApigeeV1StatsEnvironmentStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1StatsEnvironmentStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1StatsEnvironmentStats(
           od as api.GoogleCloudApigeeV1StatsEnvironmentStats);
     });
@@ -9804,7 +10035,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1StatsHostStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1StatsHostStats();
-      var od = api.GoogleCloudApigeeV1StatsHostStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1StatsHostStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1StatsHostStats(
           od as api.GoogleCloudApigeeV1StatsHostStats);
     });
@@ -9813,7 +10046,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1Subscription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1Subscription();
-      var od = api.GoogleCloudApigeeV1Subscription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1Subscription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1Subscription(
           od as api.GoogleCloudApigeeV1Subscription);
     });
@@ -9822,7 +10057,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1SyncAuthorization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1SyncAuthorization();
-      var od = api.GoogleCloudApigeeV1SyncAuthorization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1SyncAuthorization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1SyncAuthorization(
           od as api.GoogleCloudApigeeV1SyncAuthorization);
     });
@@ -9831,7 +10068,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1TargetServer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1TargetServer();
-      var od = api.GoogleCloudApigeeV1TargetServer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1TargetServer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1TargetServer(
           od as api.GoogleCloudApigeeV1TargetServer);
     });
@@ -9840,7 +10079,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1TargetServerConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1TargetServerConfig();
-      var od = api.GoogleCloudApigeeV1TargetServerConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1TargetServerConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1TargetServerConfig(
           od as api.GoogleCloudApigeeV1TargetServerConfig);
     });
@@ -9849,8 +10090,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1TestDatastoreResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1TestDatastoreResponse();
-      var od =
-          api.GoogleCloudApigeeV1TestDatastoreResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1TestDatastoreResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1TestDatastoreResponse(
           od as api.GoogleCloudApigeeV1TestDatastoreResponse);
     });
@@ -9859,7 +10101,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1TlsInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1TlsInfo();
-      var od = api.GoogleCloudApigeeV1TlsInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1TlsInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1TlsInfo(od as api.GoogleCloudApigeeV1TlsInfo);
     });
   });
@@ -9867,7 +10111,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1TlsInfoCommonName', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1TlsInfoCommonName();
-      var od = api.GoogleCloudApigeeV1TlsInfoCommonName.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1TlsInfoCommonName.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1TlsInfoCommonName(
           od as api.GoogleCloudApigeeV1TlsInfoCommonName);
     });
@@ -9876,7 +10122,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1TlsInfoConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1TlsInfoConfig();
-      var od = api.GoogleCloudApigeeV1TlsInfoConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1TlsInfoConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1TlsInfoConfig(
           od as api.GoogleCloudApigeeV1TlsInfoConfig);
     });
@@ -9885,7 +10133,9 @@
   unittest.group('obj-schema-GoogleCloudApigeeV1UpdateError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudApigeeV1UpdateError();
-      var od = api.GoogleCloudApigeeV1UpdateError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudApigeeV1UpdateError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudApigeeV1UpdateError(
           od as api.GoogleCloudApigeeV1UpdateError);
     });
@@ -9894,7 +10144,9 @@
   unittest.group('obj-schema-GoogleIamV1AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1AuditConfig();
-      var od = api.GoogleIamV1AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1AuditConfig(od as api.GoogleIamV1AuditConfig);
     });
   });
@@ -9902,7 +10154,9 @@
   unittest.group('obj-schema-GoogleIamV1AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1AuditLogConfig();
-      var od = api.GoogleIamV1AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1AuditLogConfig(od as api.GoogleIamV1AuditLogConfig);
     });
   });
@@ -9910,7 +10164,9 @@
   unittest.group('obj-schema-GoogleIamV1Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1Binding();
-      var od = api.GoogleIamV1Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1Binding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1Binding(od as api.GoogleIamV1Binding);
     });
   });
@@ -9918,7 +10174,9 @@
   unittest.group('obj-schema-GoogleIamV1Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1Policy();
-      var od = api.GoogleIamV1Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1Policy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1Policy(od as api.GoogleIamV1Policy);
     });
   });
@@ -9926,7 +10184,9 @@
   unittest.group('obj-schema-GoogleIamV1SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1SetIamPolicyRequest();
-      var od = api.GoogleIamV1SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1SetIamPolicyRequest(
           od as api.GoogleIamV1SetIamPolicyRequest);
     });
@@ -9935,7 +10195,9 @@
   unittest.group('obj-schema-GoogleIamV1TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1TestIamPermissionsRequest();
-      var od = api.GoogleIamV1TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1TestIamPermissionsRequest(
           od as api.GoogleIamV1TestIamPermissionsRequest);
     });
@@ -9944,7 +10206,9 @@
   unittest.group('obj-schema-GoogleIamV1TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1TestIamPermissionsResponse();
-      var od = api.GoogleIamV1TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1TestIamPermissionsResponse(
           od as api.GoogleIamV1TestIamPermissionsResponse);
     });
@@ -9953,7 +10217,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -9962,7 +10228,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -9970,7 +10238,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -9978,7 +10248,9 @@
   unittest.group('obj-schema-GoogleRpcPreconditionFailure', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcPreconditionFailure();
-      var od = api.GoogleRpcPreconditionFailure.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcPreconditionFailure.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcPreconditionFailure(od as api.GoogleRpcPreconditionFailure);
     });
   });
@@ -9986,7 +10258,9 @@
   unittest.group('obj-schema-GoogleRpcPreconditionFailureViolation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcPreconditionFailureViolation();
-      var od = api.GoogleRpcPreconditionFailureViolation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcPreconditionFailureViolation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcPreconditionFailureViolation(
           od as api.GoogleRpcPreconditionFailureViolation);
     });
@@ -9995,7 +10269,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
@@ -10003,7 +10279,9 @@
   unittest.group('obj-schema-GoogleTypeExpr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeExpr();
-      var od = api.GoogleTypeExpr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeExpr.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeExpr(od as api.GoogleTypeExpr);
     });
   });
diff --git a/generated/googleapis/test/appengine/v1_test.dart b/generated/googleapis/test/appengine/v1_test.dart
index 0e64648..29de5f5 100644
--- a/generated/googleapis/test/appengine/v1_test.dart
+++ b/generated/googleapis/test/appengine/v1_test.dart
@@ -3112,7 +3112,9 @@
   unittest.group('obj-schema-ApiConfigHandler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiConfigHandler();
-      var od = api.ApiConfigHandler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApiConfigHandler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApiConfigHandler(od as api.ApiConfigHandler);
     });
   });
@@ -3120,7 +3122,9 @@
   unittest.group('obj-schema-ApiEndpointHandler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiEndpointHandler();
-      var od = api.ApiEndpointHandler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApiEndpointHandler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApiEndpointHandler(od as api.ApiEndpointHandler);
     });
   });
@@ -3128,7 +3132,9 @@
   unittest.group('obj-schema-Application', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplication();
-      var od = api.Application.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Application.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplication(od as api.Application);
     });
   });
@@ -3136,7 +3142,9 @@
   unittest.group('obj-schema-AuthorizedCertificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizedCertificate();
-      var od = api.AuthorizedCertificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizedCertificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizedCertificate(od as api.AuthorizedCertificate);
     });
   });
@@ -3144,7 +3152,9 @@
   unittest.group('obj-schema-AuthorizedDomain', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizedDomain();
-      var od = api.AuthorizedDomain.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizedDomain.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizedDomain(od as api.AuthorizedDomain);
     });
   });
@@ -3152,7 +3162,9 @@
   unittest.group('obj-schema-AutomaticScaling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutomaticScaling();
-      var od = api.AutomaticScaling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutomaticScaling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutomaticScaling(od as api.AutomaticScaling);
     });
   });
@@ -3160,7 +3172,9 @@
   unittest.group('obj-schema-BasicScaling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicScaling();
-      var od = api.BasicScaling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicScaling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicScaling(od as api.BasicScaling);
     });
   });
@@ -3168,7 +3182,9 @@
   unittest.group('obj-schema-BatchUpdateIngressRulesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateIngressRulesRequest();
-      var od = api.BatchUpdateIngressRulesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateIngressRulesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateIngressRulesRequest(
           od as api.BatchUpdateIngressRulesRequest);
     });
@@ -3177,7 +3193,9 @@
   unittest.group('obj-schema-BatchUpdateIngressRulesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateIngressRulesResponse();
-      var od = api.BatchUpdateIngressRulesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateIngressRulesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateIngressRulesResponse(
           od as api.BatchUpdateIngressRulesResponse);
     });
@@ -3186,7 +3204,9 @@
   unittest.group('obj-schema-CertificateRawData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCertificateRawData();
-      var od = api.CertificateRawData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CertificateRawData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCertificateRawData(od as api.CertificateRawData);
     });
   });
@@ -3194,7 +3214,9 @@
   unittest.group('obj-schema-CloudBuildOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudBuildOptions();
-      var od = api.CloudBuildOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudBuildOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudBuildOptions(od as api.CloudBuildOptions);
     });
   });
@@ -3202,7 +3224,9 @@
   unittest.group('obj-schema-ContainerInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerInfo();
-      var od = api.ContainerInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerInfo(od as api.ContainerInfo);
     });
   });
@@ -3210,7 +3234,9 @@
   unittest.group('obj-schema-CpuUtilization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCpuUtilization();
-      var od = api.CpuUtilization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CpuUtilization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCpuUtilization(od as api.CpuUtilization);
     });
   });
@@ -3218,7 +3244,9 @@
   unittest.group('obj-schema-CreateVersionMetadataV1', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateVersionMetadataV1();
-      var od = api.CreateVersionMetadataV1.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateVersionMetadataV1.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateVersionMetadataV1(od as api.CreateVersionMetadataV1);
     });
   });
@@ -3226,7 +3254,9 @@
   unittest.group('obj-schema-CreateVersionMetadataV1Alpha', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateVersionMetadataV1Alpha();
-      var od = api.CreateVersionMetadataV1Alpha.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateVersionMetadataV1Alpha.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateVersionMetadataV1Alpha(od as api.CreateVersionMetadataV1Alpha);
     });
   });
@@ -3234,7 +3264,9 @@
   unittest.group('obj-schema-CreateVersionMetadataV1Beta', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateVersionMetadataV1Beta();
-      var od = api.CreateVersionMetadataV1Beta.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateVersionMetadataV1Beta.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateVersionMetadataV1Beta(od as api.CreateVersionMetadataV1Beta);
     });
   });
@@ -3242,7 +3274,9 @@
   unittest.group('obj-schema-DebugInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDebugInstanceRequest();
-      var od = api.DebugInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DebugInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDebugInstanceRequest(od as api.DebugInstanceRequest);
     });
   });
@@ -3250,7 +3284,9 @@
   unittest.group('obj-schema-Deployment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployment();
-      var od = api.Deployment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Deployment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeployment(od as api.Deployment);
     });
   });
@@ -3258,7 +3294,9 @@
   unittest.group('obj-schema-DiskUtilization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskUtilization();
-      var od = api.DiskUtilization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskUtilization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskUtilization(od as api.DiskUtilization);
     });
   });
@@ -3266,7 +3304,9 @@
   unittest.group('obj-schema-DomainMapping', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainMapping();
-      var od = api.DomainMapping.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DomainMapping.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDomainMapping(od as api.DomainMapping);
     });
   });
@@ -3274,7 +3314,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -3282,7 +3323,9 @@
   unittest.group('obj-schema-EndpointsApiService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndpointsApiService();
-      var od = api.EndpointsApiService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EndpointsApiService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEndpointsApiService(od as api.EndpointsApiService);
     });
   });
@@ -3290,7 +3333,9 @@
   unittest.group('obj-schema-Entrypoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntrypoint();
-      var od = api.Entrypoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Entrypoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEntrypoint(od as api.Entrypoint);
     });
   });
@@ -3298,7 +3343,9 @@
   unittest.group('obj-schema-ErrorHandler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorHandler();
-      var od = api.ErrorHandler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ErrorHandler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkErrorHandler(od as api.ErrorHandler);
     });
   });
@@ -3306,7 +3353,9 @@
   unittest.group('obj-schema-FeatureSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeatureSettings();
-      var od = api.FeatureSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FeatureSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFeatureSettings(od as api.FeatureSettings);
     });
   });
@@ -3314,7 +3363,9 @@
   unittest.group('obj-schema-FileInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileInfo();
-      var od = api.FileInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FileInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFileInfo(od as api.FileInfo);
     });
   });
@@ -3322,7 +3373,9 @@
   unittest.group('obj-schema-FirewallRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallRule();
-      var od = api.FirewallRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallRule(od as api.FirewallRule);
     });
   });
@@ -3330,7 +3383,9 @@
   unittest.group('obj-schema-HealthCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheck();
-      var od = api.HealthCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheck(od as api.HealthCheck);
     });
   });
@@ -3338,7 +3393,9 @@
   unittest.group('obj-schema-IdentityAwareProxy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentityAwareProxy();
-      var od = api.IdentityAwareProxy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IdentityAwareProxy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentityAwareProxy(od as api.IdentityAwareProxy);
     });
   });
@@ -3346,7 +3403,9 @@
   unittest.group('obj-schema-Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstance();
-      var od = api.Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Instance.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstance(od as api.Instance);
     });
   });
@@ -3354,7 +3413,9 @@
   unittest.group('obj-schema-Library', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLibrary();
-      var od = api.Library.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Library.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLibrary(od as api.Library);
     });
   });
@@ -3362,7 +3423,9 @@
   unittest.group('obj-schema-ListAuthorizedCertificatesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAuthorizedCertificatesResponse();
-      var od = api.ListAuthorizedCertificatesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAuthorizedCertificatesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAuthorizedCertificatesResponse(
           od as api.ListAuthorizedCertificatesResponse);
     });
@@ -3371,7 +3434,9 @@
   unittest.group('obj-schema-ListAuthorizedDomainsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAuthorizedDomainsResponse();
-      var od = api.ListAuthorizedDomainsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAuthorizedDomainsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAuthorizedDomainsResponse(
           od as api.ListAuthorizedDomainsResponse);
     });
@@ -3380,7 +3445,9 @@
   unittest.group('obj-schema-ListDomainMappingsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDomainMappingsResponse();
-      var od = api.ListDomainMappingsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDomainMappingsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDomainMappingsResponse(od as api.ListDomainMappingsResponse);
     });
   });
@@ -3388,7 +3455,9 @@
   unittest.group('obj-schema-ListIngressRulesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListIngressRulesResponse();
-      var od = api.ListIngressRulesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListIngressRulesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListIngressRulesResponse(od as api.ListIngressRulesResponse);
     });
   });
@@ -3396,7 +3465,9 @@
   unittest.group('obj-schema-ListInstancesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInstancesResponse();
-      var od = api.ListInstancesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInstancesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
@@ -3404,7 +3475,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -3412,7 +3485,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -3420,7 +3495,9 @@
   unittest.group('obj-schema-ListServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServicesResponse();
-      var od = api.ListServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
@@ -3428,7 +3505,9 @@
   unittest.group('obj-schema-ListVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListVersionsResponse();
-      var od = api.ListVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListVersionsResponse(od as api.ListVersionsResponse);
     });
   });
@@ -3436,7 +3515,9 @@
   unittest.group('obj-schema-LivenessCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLivenessCheck();
-      var od = api.LivenessCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LivenessCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLivenessCheck(od as api.LivenessCheck);
     });
   });
@@ -3444,7 +3525,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -3452,7 +3535,9 @@
   unittest.group('obj-schema-LocationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationMetadata();
-      var od = api.LocationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationMetadata(od as api.LocationMetadata);
     });
   });
@@ -3460,7 +3545,9 @@
   unittest.group('obj-schema-ManagedCertificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedCertificate();
-      var od = api.ManagedCertificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedCertificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedCertificate(od as api.ManagedCertificate);
     });
   });
@@ -3468,7 +3555,9 @@
   unittest.group('obj-schema-ManualScaling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManualScaling();
-      var od = api.ManualScaling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManualScaling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManualScaling(od as api.ManualScaling);
     });
   });
@@ -3476,7 +3565,9 @@
   unittest.group('obj-schema-Network', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetwork();
-      var od = api.Network.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Network.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNetwork(od as api.Network);
     });
   });
@@ -3484,7 +3575,9 @@
   unittest.group('obj-schema-NetworkSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkSettings();
-      var od = api.NetworkSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkSettings(od as api.NetworkSettings);
     });
   });
@@ -3492,7 +3585,9 @@
   unittest.group('obj-schema-NetworkUtilization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkUtilization();
-      var od = api.NetworkUtilization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkUtilization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkUtilization(od as api.NetworkUtilization);
     });
   });
@@ -3500,7 +3595,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -3508,7 +3605,9 @@
   unittest.group('obj-schema-OperationMetadataV1', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadataV1();
-      var od = api.OperationMetadataV1.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadataV1.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadataV1(od as api.OperationMetadataV1);
     });
   });
@@ -3516,7 +3615,9 @@
   unittest.group('obj-schema-OperationMetadataV1Alpha', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadataV1Alpha();
-      var od = api.OperationMetadataV1Alpha.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadataV1Alpha.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadataV1Alpha(od as api.OperationMetadataV1Alpha);
     });
   });
@@ -3524,7 +3625,9 @@
   unittest.group('obj-schema-OperationMetadataV1Beta', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadataV1Beta();
-      var od = api.OperationMetadataV1Beta.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadataV1Beta.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadataV1Beta(od as api.OperationMetadataV1Beta);
     });
   });
@@ -3532,7 +3635,9 @@
   unittest.group('obj-schema-ReadinessCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadinessCheck();
-      var od = api.ReadinessCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReadinessCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReadinessCheck(od as api.ReadinessCheck);
     });
   });
@@ -3540,7 +3645,9 @@
   unittest.group('obj-schema-RepairApplicationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepairApplicationRequest();
-      var od = api.RepairApplicationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepairApplicationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepairApplicationRequest(od as api.RepairApplicationRequest);
     });
   });
@@ -3548,7 +3655,9 @@
   unittest.group('obj-schema-RequestUtilization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestUtilization();
-      var od = api.RequestUtilization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestUtilization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestUtilization(od as api.RequestUtilization);
     });
   });
@@ -3556,7 +3665,9 @@
   unittest.group('obj-schema-ResourceRecord', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceRecord();
-      var od = api.ResourceRecord.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceRecord.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceRecord(od as api.ResourceRecord);
     });
   });
@@ -3564,7 +3675,9 @@
   unittest.group('obj-schema-Resources', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResources();
-      var od = api.Resources.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Resources.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResources(od as api.Resources);
     });
   });
@@ -3572,7 +3685,9 @@
   unittest.group('obj-schema-ScriptHandler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScriptHandler();
-      var od = api.ScriptHandler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScriptHandler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScriptHandler(od as api.ScriptHandler);
     });
   });
@@ -3580,7 +3695,9 @@
   unittest.group('obj-schema-Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildService();
-      var od = api.Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Service.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkService(od as api.Service);
     });
   });
@@ -3588,7 +3705,9 @@
   unittest.group('obj-schema-SslSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslSettings();
-      var od = api.SslSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslSettings(od as api.SslSettings);
     });
   });
@@ -3596,7 +3715,9 @@
   unittest.group('obj-schema-StandardSchedulerSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStandardSchedulerSettings();
-      var od = api.StandardSchedulerSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StandardSchedulerSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStandardSchedulerSettings(od as api.StandardSchedulerSettings);
     });
   });
@@ -3604,7 +3725,9 @@
   unittest.group('obj-schema-StaticFilesHandler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStaticFilesHandler();
-      var od = api.StaticFilesHandler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StaticFilesHandler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStaticFilesHandler(od as api.StaticFilesHandler);
     });
   });
@@ -3612,7 +3735,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -3620,7 +3745,9 @@
   unittest.group('obj-schema-TrafficSplit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrafficSplit();
-      var od = api.TrafficSplit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrafficSplit.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrafficSplit(od as api.TrafficSplit);
     });
   });
@@ -3628,7 +3755,9 @@
   unittest.group('obj-schema-UrlDispatchRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlDispatchRule();
-      var od = api.UrlDispatchRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlDispatchRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlDispatchRule(od as api.UrlDispatchRule);
     });
   });
@@ -3636,7 +3765,9 @@
   unittest.group('obj-schema-UrlMap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMap();
-      var od = api.UrlMap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UrlMap.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUrlMap(od as api.UrlMap);
     });
   });
@@ -3644,7 +3775,9 @@
   unittest.group('obj-schema-Version', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVersion();
-      var od = api.Version.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Version.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVersion(od as api.Version);
     });
   });
@@ -3652,7 +3785,9 @@
   unittest.group('obj-schema-Volume', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolume();
-      var od = api.Volume.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Volume.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVolume(od as api.Volume);
     });
   });
@@ -3660,7 +3795,9 @@
   unittest.group('obj-schema-VpcAccessConnector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpcAccessConnector();
-      var od = api.VpcAccessConnector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpcAccessConnector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpcAccessConnector(od as api.VpcAccessConnector);
     });
   });
@@ -3668,7 +3805,9 @@
   unittest.group('obj-schema-ZipInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZipInfo();
-      var od = api.ZipInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ZipInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkZipInfo(od as api.ZipInfo);
     });
   });
diff --git a/generated/googleapis/test/artifactregistry/v1_test.dart b/generated/googleapis/test/artifactregistry/v1_test.dart
index f0cca51..e6a0f3e 100644
--- a/generated/googleapis/test/artifactregistry/v1_test.dart
+++ b/generated/googleapis/test/artifactregistry/v1_test.dart
@@ -374,7 +374,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -382,7 +384,9 @@
   unittest.group('obj-schema-DockerImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDockerImage();
-      var od = api.DockerImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DockerImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDockerImage(od as api.DockerImage);
     });
   });
@@ -390,7 +394,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -398,7 +403,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -406,7 +413,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -414,7 +423,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
diff --git a/generated/googleapis/test/assuredworkloads/v1_test.dart b/generated/googleapis/test/assuredworkloads/v1_test.dart
index 87d6d08..6e37ecc 100644
--- a/generated/googleapis/test/assuredworkloads/v1_test.dart
+++ b/generated/googleapis/test/assuredworkloads/v1_test.dart
@@ -859,8 +859,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudAssuredworkloadsV1CreateWorkloadOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudAssuredworkloadsV1CreateWorkloadOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1CreateWorkloadOperationMetadata(od
           as api.GoogleCloudAssuredworkloadsV1CreateWorkloadOperationMetadata);
     });
@@ -870,8 +871,9 @@
       'obj-schema-GoogleCloudAssuredworkloadsV1ListWorkloadsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssuredworkloadsV1ListWorkloadsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudAssuredworkloadsV1ListWorkloadsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1ListWorkloadsResponse(
           od as api.GoogleCloudAssuredworkloadsV1ListWorkloadsResponse);
     });
@@ -880,7 +882,9 @@
   unittest.group('obj-schema-GoogleCloudAssuredworkloadsV1Workload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssuredworkloadsV1Workload();
-      var od = api.GoogleCloudAssuredworkloadsV1Workload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudAssuredworkloadsV1Workload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1Workload(
           od as api.GoogleCloudAssuredworkloadsV1Workload);
     });
@@ -890,8 +894,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssuredworkloadsV1WorkloadKMSSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudAssuredworkloadsV1WorkloadKMSSettings.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1WorkloadKMSSettings(
           od as api.GoogleCloudAssuredworkloadsV1WorkloadKMSSettings);
     });
@@ -901,8 +906,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssuredworkloadsV1WorkloadResourceInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudAssuredworkloadsV1WorkloadResourceInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1WorkloadResourceInfo(
           od as api.GoogleCloudAssuredworkloadsV1WorkloadResourceInfo);
     });
@@ -914,9 +920,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudAssuredworkloadsV1beta1CreateWorkloadOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudAssuredworkloadsV1beta1CreateWorkloadOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1beta1CreateWorkloadOperationMetadata(od
           as api
               .GoogleCloudAssuredworkloadsV1beta1CreateWorkloadOperationMetadata);
@@ -926,8 +933,9 @@
   unittest.group('obj-schema-GoogleCloudAssuredworkloadsV1beta1Workload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssuredworkloadsV1beta1Workload();
-      var od =
-          api.GoogleCloudAssuredworkloadsV1beta1Workload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudAssuredworkloadsV1beta1Workload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1beta1Workload(
           od as api.GoogleCloudAssuredworkloadsV1beta1Workload);
     });
@@ -937,9 +945,10 @@
       'obj-schema-GoogleCloudAssuredworkloadsV1beta1WorkloadCJISSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssuredworkloadsV1beta1WorkloadCJISSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudAssuredworkloadsV1beta1WorkloadCJISSettings.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1beta1WorkloadCJISSettings(
           od as api.GoogleCloudAssuredworkloadsV1beta1WorkloadCJISSettings);
     });
@@ -951,8 +960,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudAssuredworkloadsV1beta1WorkloadFedrampHighSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudAssuredworkloadsV1beta1WorkloadFedrampHighSettings
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1beta1WorkloadFedrampHighSettings(od
           as api.GoogleCloudAssuredworkloadsV1beta1WorkloadFedrampHighSettings);
     });
@@ -964,9 +974,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudAssuredworkloadsV1beta1WorkloadFedrampModerateSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudAssuredworkloadsV1beta1WorkloadFedrampModerateSettings
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1beta1WorkloadFedrampModerateSettings(od
           as api
               .GoogleCloudAssuredworkloadsV1beta1WorkloadFedrampModerateSettings);
@@ -977,9 +988,10 @@
       'obj-schema-GoogleCloudAssuredworkloadsV1beta1WorkloadIL4Settings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssuredworkloadsV1beta1WorkloadIL4Settings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudAssuredworkloadsV1beta1WorkloadIL4Settings.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1beta1WorkloadIL4Settings(
           od as api.GoogleCloudAssuredworkloadsV1beta1WorkloadIL4Settings);
     });
@@ -989,9 +1001,10 @@
       'obj-schema-GoogleCloudAssuredworkloadsV1beta1WorkloadKMSSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssuredworkloadsV1beta1WorkloadKMSSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudAssuredworkloadsV1beta1WorkloadKMSSettings.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1beta1WorkloadKMSSettings(
           od as api.GoogleCloudAssuredworkloadsV1beta1WorkloadKMSSettings);
     });
@@ -1001,9 +1014,10 @@
       'obj-schema-GoogleCloudAssuredworkloadsV1beta1WorkloadResourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssuredworkloadsV1beta1WorkloadResourceInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudAssuredworkloadsV1beta1WorkloadResourceInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssuredworkloadsV1beta1WorkloadResourceInfo(
           od as api.GoogleCloudAssuredworkloadsV1beta1WorkloadResourceInfo);
     });
@@ -1012,7 +1026,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -1021,7 +1037,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -1029,7 +1047,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -1037,7 +1057,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
diff --git a/generated/googleapis/test/bigquery/v2_test.dart b/generated/googleapis/test/bigquery/v2_test.dart
index d4549d1..8ba8af6 100644
--- a/generated/googleapis/test/bigquery/v2_test.dart
+++ b/generated/googleapis/test/bigquery/v2_test.dart
@@ -6906,7 +6906,9 @@
   unittest.group('obj-schema-AggregateClassificationMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAggregateClassificationMetrics();
-      var od = api.AggregateClassificationMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AggregateClassificationMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAggregateClassificationMetrics(
           od as api.AggregateClassificationMetrics);
     });
@@ -6915,7 +6917,9 @@
   unittest.group('obj-schema-Argument', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArgument();
-      var od = api.Argument.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Argument.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkArgument(od as api.Argument);
     });
   });
@@ -6923,7 +6927,9 @@
   unittest.group('obj-schema-ArimaCoefficients', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArimaCoefficients();
-      var od = api.ArimaCoefficients.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ArimaCoefficients.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkArimaCoefficients(od as api.ArimaCoefficients);
     });
   });
@@ -6931,7 +6937,9 @@
   unittest.group('obj-schema-ArimaFittingMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArimaFittingMetrics();
-      var od = api.ArimaFittingMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ArimaFittingMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkArimaFittingMetrics(od as api.ArimaFittingMetrics);
     });
   });
@@ -6939,7 +6947,9 @@
   unittest.group('obj-schema-ArimaForecastingMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArimaForecastingMetrics();
-      var od = api.ArimaForecastingMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ArimaForecastingMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkArimaForecastingMetrics(od as api.ArimaForecastingMetrics);
     });
   });
@@ -6947,7 +6957,9 @@
   unittest.group('obj-schema-ArimaModelInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArimaModelInfo();
-      var od = api.ArimaModelInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ArimaModelInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkArimaModelInfo(od as api.ArimaModelInfo);
     });
   });
@@ -6955,7 +6967,9 @@
   unittest.group('obj-schema-ArimaOrder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArimaOrder();
-      var od = api.ArimaOrder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ArimaOrder.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkArimaOrder(od as api.ArimaOrder);
     });
   });
@@ -6963,7 +6977,9 @@
   unittest.group('obj-schema-ArimaResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArimaResult();
-      var od = api.ArimaResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ArimaResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkArimaResult(od as api.ArimaResult);
     });
   });
@@ -6971,7 +6987,9 @@
   unittest.group('obj-schema-ArimaSingleModelForecastingMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArimaSingleModelForecastingMetrics();
-      var od = api.ArimaSingleModelForecastingMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ArimaSingleModelForecastingMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkArimaSingleModelForecastingMetrics(
           od as api.ArimaSingleModelForecastingMetrics);
     });
@@ -6980,7 +6998,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -6988,7 +7008,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -6996,7 +7018,9 @@
   unittest.group('obj-schema-BigQueryModelTraining', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigQueryModelTraining();
-      var od = api.BigQueryModelTraining.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigQueryModelTraining.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigQueryModelTraining(od as api.BigQueryModelTraining);
     });
   });
@@ -7004,7 +7028,9 @@
   unittest.group('obj-schema-BigtableColumn', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigtableColumn();
-      var od = api.BigtableColumn.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigtableColumn.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigtableColumn(od as api.BigtableColumn);
     });
   });
@@ -7012,7 +7038,9 @@
   unittest.group('obj-schema-BigtableColumnFamily', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigtableColumnFamily();
-      var od = api.BigtableColumnFamily.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigtableColumnFamily.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigtableColumnFamily(od as api.BigtableColumnFamily);
     });
   });
@@ -7020,7 +7048,9 @@
   unittest.group('obj-schema-BigtableOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigtableOptions();
-      var od = api.BigtableOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigtableOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigtableOptions(od as api.BigtableOptions);
     });
   });
@@ -7028,7 +7058,9 @@
   unittest.group('obj-schema-BinaryClassificationMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinaryClassificationMetrics();
-      var od = api.BinaryClassificationMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BinaryClassificationMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBinaryClassificationMetrics(od as api.BinaryClassificationMetrics);
     });
   });
@@ -7036,7 +7068,9 @@
   unittest.group('obj-schema-BinaryConfusionMatrix', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinaryConfusionMatrix();
-      var od = api.BinaryConfusionMatrix.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BinaryConfusionMatrix.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBinaryConfusionMatrix(od as api.BinaryConfusionMatrix);
     });
   });
@@ -7044,7 +7078,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -7052,7 +7088,9 @@
   unittest.group('obj-schema-BqmlIterationResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBqmlIterationResult();
-      var od = api.BqmlIterationResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BqmlIterationResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBqmlIterationResult(od as api.BqmlIterationResult);
     });
   });
@@ -7060,7 +7098,9 @@
   unittest.group('obj-schema-BqmlTrainingRunTrainingOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBqmlTrainingRunTrainingOptions();
-      var od = api.BqmlTrainingRunTrainingOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BqmlTrainingRunTrainingOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBqmlTrainingRunTrainingOptions(
           od as api.BqmlTrainingRunTrainingOptions);
     });
@@ -7069,7 +7109,9 @@
   unittest.group('obj-schema-BqmlTrainingRun', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBqmlTrainingRun();
-      var od = api.BqmlTrainingRun.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BqmlTrainingRun.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBqmlTrainingRun(od as api.BqmlTrainingRun);
     });
   });
@@ -7077,7 +7119,9 @@
   unittest.group('obj-schema-CategoricalValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategoricalValue();
-      var od = api.CategoricalValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CategoricalValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCategoricalValue(od as api.CategoricalValue);
     });
   });
@@ -7085,7 +7129,9 @@
   unittest.group('obj-schema-CategoryCount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategoryCount();
-      var od = api.CategoryCount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CategoryCount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCategoryCount(od as api.CategoryCount);
     });
   });
@@ -7093,7 +7139,9 @@
   unittest.group('obj-schema-Cluster', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCluster();
-      var od = api.Cluster.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Cluster.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCluster(od as api.Cluster);
     });
   });
@@ -7101,7 +7149,9 @@
   unittest.group('obj-schema-ClusterInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterInfo();
-      var od = api.ClusterInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterInfo(od as api.ClusterInfo);
     });
   });
@@ -7109,7 +7159,9 @@
   unittest.group('obj-schema-Clustering', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClustering();
-      var od = api.Clustering.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Clustering.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkClustering(od as api.Clustering);
     });
   });
@@ -7117,7 +7169,9 @@
   unittest.group('obj-schema-ClusteringMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusteringMetrics();
-      var od = api.ClusteringMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusteringMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusteringMetrics(od as api.ClusteringMetrics);
     });
   });
@@ -7125,7 +7179,9 @@
   unittest.group('obj-schema-ConfusionMatrix', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfusionMatrix();
-      var od = api.ConfusionMatrix.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfusionMatrix.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfusionMatrix(od as api.ConfusionMatrix);
     });
   });
@@ -7133,7 +7189,9 @@
   unittest.group('obj-schema-ConnectionProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConnectionProperty();
-      var od = api.ConnectionProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConnectionProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConnectionProperty(od as api.ConnectionProperty);
     });
   });
@@ -7141,7 +7199,9 @@
   unittest.group('obj-schema-CsvOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCsvOptions();
-      var od = api.CsvOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CsvOptions.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCsvOptions(od as api.CsvOptions);
     });
   });
@@ -7149,7 +7209,9 @@
   unittest.group('obj-schema-DataSplitResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSplitResult();
-      var od = api.DataSplitResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSplitResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSplitResult(od as api.DataSplitResult);
     });
   });
@@ -7157,7 +7219,9 @@
   unittest.group('obj-schema-DatasetAccess', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatasetAccess();
-      var od = api.DatasetAccess.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatasetAccess.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatasetAccess(od as api.DatasetAccess);
     });
   });
@@ -7165,7 +7229,9 @@
   unittest.group('obj-schema-Dataset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataset();
-      var od = api.Dataset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Dataset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataset(od as api.Dataset);
     });
   });
@@ -7173,7 +7239,9 @@
   unittest.group('obj-schema-DatasetAccessEntryTargetTypes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatasetAccessEntryTargetTypes();
-      var od = api.DatasetAccessEntryTargetTypes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatasetAccessEntryTargetTypes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatasetAccessEntryTargetTypes(
           od as api.DatasetAccessEntryTargetTypes);
     });
@@ -7182,7 +7250,9 @@
   unittest.group('obj-schema-DatasetAccessEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatasetAccessEntry();
-      var od = api.DatasetAccessEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatasetAccessEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatasetAccessEntry(od as api.DatasetAccessEntry);
     });
   });
@@ -7190,7 +7260,9 @@
   unittest.group('obj-schema-DatasetListDatasets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatasetListDatasets();
-      var od = api.DatasetListDatasets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatasetListDatasets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatasetListDatasets(od as api.DatasetListDatasets);
     });
   });
@@ -7198,7 +7270,9 @@
   unittest.group('obj-schema-DatasetList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatasetList();
-      var od = api.DatasetList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatasetList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatasetList(od as api.DatasetList);
     });
   });
@@ -7206,7 +7280,9 @@
   unittest.group('obj-schema-DatasetReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatasetReference();
-      var od = api.DatasetReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatasetReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatasetReference(od as api.DatasetReference);
     });
   });
@@ -7214,7 +7290,9 @@
   unittest.group('obj-schema-DestinationTableProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDestinationTableProperties();
-      var od = api.DestinationTableProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DestinationTableProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDestinationTableProperties(od as api.DestinationTableProperties);
     });
   });
@@ -7222,7 +7300,9 @@
   unittest.group('obj-schema-DimensionalityReductionMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionalityReductionMetrics();
-      var od = api.DimensionalityReductionMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionalityReductionMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionalityReductionMetrics(
           od as api.DimensionalityReductionMetrics);
     });
@@ -7231,7 +7311,9 @@
   unittest.group('obj-schema-EncryptionConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncryptionConfiguration();
-      var od = api.EncryptionConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EncryptionConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEncryptionConfiguration(od as api.EncryptionConfiguration);
     });
   });
@@ -7239,7 +7321,8 @@
   unittest.group('obj-schema-Entry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntry();
-      var od = api.Entry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Entry.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEntry(od as api.Entry);
     });
   });
@@ -7247,7 +7330,9 @@
   unittest.group('obj-schema-ErrorProto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorProto();
-      var od = api.ErrorProto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ErrorProto.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkErrorProto(od as api.ErrorProto);
     });
   });
@@ -7255,7 +7340,9 @@
   unittest.group('obj-schema-EvaluationMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEvaluationMetrics();
-      var od = api.EvaluationMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EvaluationMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEvaluationMetrics(od as api.EvaluationMetrics);
     });
   });
@@ -7263,7 +7350,9 @@
   unittest.group('obj-schema-ExplainQueryStage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExplainQueryStage();
-      var od = api.ExplainQueryStage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExplainQueryStage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExplainQueryStage(od as api.ExplainQueryStage);
     });
   });
@@ -7271,7 +7360,9 @@
   unittest.group('obj-schema-ExplainQueryStep', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExplainQueryStep();
-      var od = api.ExplainQueryStep.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExplainQueryStep.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExplainQueryStep(od as api.ExplainQueryStep);
     });
   });
@@ -7279,7 +7370,9 @@
   unittest.group('obj-schema-Explanation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExplanation();
-      var od = api.Explanation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Explanation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExplanation(od as api.Explanation);
     });
   });
@@ -7287,7 +7380,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -7295,7 +7389,9 @@
   unittest.group('obj-schema-ExternalDataConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExternalDataConfiguration();
-      var od = api.ExternalDataConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExternalDataConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExternalDataConfiguration(od as api.ExternalDataConfiguration);
     });
   });
@@ -7303,7 +7399,9 @@
   unittest.group('obj-schema-FeatureValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeatureValue();
-      var od = api.FeatureValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FeatureValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFeatureValue(od as api.FeatureValue);
     });
   });
@@ -7311,7 +7409,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -7319,7 +7419,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -7327,7 +7429,9 @@
   unittest.group('obj-schema-GetQueryResultsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetQueryResultsResponse();
-      var od = api.GetQueryResultsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetQueryResultsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetQueryResultsResponse(od as api.GetQueryResultsResponse);
     });
   });
@@ -7335,7 +7439,9 @@
   unittest.group('obj-schema-GetServiceAccountResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetServiceAccountResponse();
-      var od = api.GetServiceAccountResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetServiceAccountResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetServiceAccountResponse(od as api.GetServiceAccountResponse);
     });
   });
@@ -7343,7 +7449,9 @@
   unittest.group('obj-schema-GlobalExplanation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlobalExplanation();
-      var od = api.GlobalExplanation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GlobalExplanation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGlobalExplanation(od as api.GlobalExplanation);
     });
   });
@@ -7351,7 +7459,9 @@
   unittest.group('obj-schema-GoogleSheetsOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSheetsOptions();
-      var od = api.GoogleSheetsOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleSheetsOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSheetsOptions(od as api.GoogleSheetsOptions);
     });
   });
@@ -7359,7 +7469,9 @@
   unittest.group('obj-schema-HivePartitioningOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHivePartitioningOptions();
-      var od = api.HivePartitioningOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HivePartitioningOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHivePartitioningOptions(od as api.HivePartitioningOptions);
     });
   });
@@ -7367,7 +7479,9 @@
   unittest.group('obj-schema-IterationResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIterationResult();
-      var od = api.IterationResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IterationResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIterationResult(od as api.IterationResult);
     });
   });
@@ -7375,7 +7489,8 @@
   unittest.group('obj-schema-Job', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJob();
-      var od = api.Job.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Job.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJob(od as api.Job);
     });
   });
@@ -7383,7 +7498,9 @@
   unittest.group('obj-schema-JobCancelResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobCancelResponse();
-      var od = api.JobCancelResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobCancelResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobCancelResponse(od as api.JobCancelResponse);
     });
   });
@@ -7391,7 +7508,9 @@
   unittest.group('obj-schema-JobConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobConfiguration();
-      var od = api.JobConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobConfiguration(od as api.JobConfiguration);
     });
   });
@@ -7399,7 +7518,9 @@
   unittest.group('obj-schema-JobConfigurationExtract', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobConfigurationExtract();
-      var od = api.JobConfigurationExtract.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobConfigurationExtract.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobConfigurationExtract(od as api.JobConfigurationExtract);
     });
   });
@@ -7407,7 +7528,9 @@
   unittest.group('obj-schema-JobConfigurationLoad', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobConfigurationLoad();
-      var od = api.JobConfigurationLoad.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobConfigurationLoad.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobConfigurationLoad(od as api.JobConfigurationLoad);
     });
   });
@@ -7415,7 +7538,9 @@
   unittest.group('obj-schema-JobConfigurationQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobConfigurationQuery();
-      var od = api.JobConfigurationQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobConfigurationQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobConfigurationQuery(od as api.JobConfigurationQuery);
     });
   });
@@ -7423,7 +7548,9 @@
   unittest.group('obj-schema-JobConfigurationTableCopy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobConfigurationTableCopy();
-      var od = api.JobConfigurationTableCopy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobConfigurationTableCopy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobConfigurationTableCopy(od as api.JobConfigurationTableCopy);
     });
   });
@@ -7431,7 +7558,9 @@
   unittest.group('obj-schema-JobListJobs', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobListJobs();
-      var od = api.JobListJobs.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobListJobs.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobListJobs(od as api.JobListJobs);
     });
   });
@@ -7439,7 +7568,9 @@
   unittest.group('obj-schema-JobList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobList();
-      var od = api.JobList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobList(od as api.JobList);
     });
   });
@@ -7447,7 +7578,9 @@
   unittest.group('obj-schema-JobReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobReference();
-      var od = api.JobReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobReference(od as api.JobReference);
     });
   });
@@ -7455,7 +7588,9 @@
   unittest.group('obj-schema-JobStatisticsReservationUsage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobStatisticsReservationUsage();
-      var od = api.JobStatisticsReservationUsage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobStatisticsReservationUsage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobStatisticsReservationUsage(
           od as api.JobStatisticsReservationUsage);
     });
@@ -7464,7 +7599,9 @@
   unittest.group('obj-schema-JobStatistics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobStatistics();
-      var od = api.JobStatistics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobStatistics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobStatistics(od as api.JobStatistics);
     });
   });
@@ -7472,7 +7609,9 @@
   unittest.group('obj-schema-JobStatistics2ReservationUsage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobStatistics2ReservationUsage();
-      var od = api.JobStatistics2ReservationUsage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobStatistics2ReservationUsage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobStatistics2ReservationUsage(
           od as api.JobStatistics2ReservationUsage);
     });
@@ -7481,7 +7620,9 @@
   unittest.group('obj-schema-JobStatistics2', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobStatistics2();
-      var od = api.JobStatistics2.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobStatistics2.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobStatistics2(od as api.JobStatistics2);
     });
   });
@@ -7489,7 +7630,9 @@
   unittest.group('obj-schema-JobStatistics3', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobStatistics3();
-      var od = api.JobStatistics3.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobStatistics3.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobStatistics3(od as api.JobStatistics3);
     });
   });
@@ -7497,7 +7640,9 @@
   unittest.group('obj-schema-JobStatistics4', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobStatistics4();
-      var od = api.JobStatistics4.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobStatistics4.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobStatistics4(od as api.JobStatistics4);
     });
   });
@@ -7505,7 +7650,9 @@
   unittest.group('obj-schema-JobStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobStatus();
-      var od = api.JobStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobStatus.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobStatus(od as api.JobStatus);
     });
   });
@@ -7513,7 +7660,9 @@
   unittest.group('obj-schema-JsonObject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJsonObject();
-      var od = api.JsonObject.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JsonObject.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJsonObject(od as api.JsonObject);
     });
   });
@@ -7521,7 +7670,9 @@
   unittest.group('obj-schema-ListModelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListModelsResponse();
-      var od = api.ListModelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListModelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListModelsResponse(od as api.ListModelsResponse);
     });
   });
@@ -7529,7 +7680,9 @@
   unittest.group('obj-schema-ListRoutinesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRoutinesResponse();
-      var od = api.ListRoutinesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRoutinesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRoutinesResponse(od as api.ListRoutinesResponse);
     });
   });
@@ -7537,7 +7690,9 @@
   unittest.group('obj-schema-ListRowAccessPoliciesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRowAccessPoliciesResponse();
-      var od = api.ListRowAccessPoliciesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRowAccessPoliciesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRowAccessPoliciesResponse(
           od as api.ListRowAccessPoliciesResponse);
     });
@@ -7546,7 +7701,9 @@
   unittest.group('obj-schema-LocationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationMetadata();
-      var od = api.LocationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationMetadata(od as api.LocationMetadata);
     });
   });
@@ -7554,7 +7711,9 @@
   unittest.group('obj-schema-MaterializedViewDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaterializedViewDefinition();
-      var od = api.MaterializedViewDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaterializedViewDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaterializedViewDefinition(od as api.MaterializedViewDefinition);
     });
   });
@@ -7562,7 +7721,8 @@
   unittest.group('obj-schema-Model', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModel();
-      var od = api.Model.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Model.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkModel(od as api.Model);
     });
   });
@@ -7570,7 +7730,9 @@
   unittest.group('obj-schema-ModelDefinitionModelOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModelDefinitionModelOptions();
-      var od = api.ModelDefinitionModelOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModelDefinitionModelOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModelDefinitionModelOptions(od as api.ModelDefinitionModelOptions);
     });
   });
@@ -7578,7 +7740,9 @@
   unittest.group('obj-schema-ModelDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModelDefinition();
-      var od = api.ModelDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModelDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModelDefinition(od as api.ModelDefinition);
     });
   });
@@ -7586,7 +7750,9 @@
   unittest.group('obj-schema-ModelReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModelReference();
-      var od = api.ModelReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModelReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModelReference(od as api.ModelReference);
     });
   });
@@ -7594,7 +7760,9 @@
   unittest.group('obj-schema-MultiClassClassificationMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMultiClassClassificationMetrics();
-      var od = api.MultiClassClassificationMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MultiClassClassificationMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMultiClassClassificationMetrics(
           od as api.MultiClassClassificationMetrics);
     });
@@ -7603,7 +7771,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -7611,7 +7781,9 @@
   unittest.group('obj-schema-PrincipalComponentInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrincipalComponentInfo();
-      var od = api.PrincipalComponentInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PrincipalComponentInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPrincipalComponentInfo(od as api.PrincipalComponentInfo);
     });
   });
@@ -7619,7 +7791,9 @@
   unittest.group('obj-schema-ProjectListProjects', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectListProjects();
-      var od = api.ProjectListProjects.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectListProjects.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectListProjects(od as api.ProjectListProjects);
     });
   });
@@ -7627,7 +7801,9 @@
   unittest.group('obj-schema-ProjectList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectList();
-      var od = api.ProjectList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectList(od as api.ProjectList);
     });
   });
@@ -7635,7 +7811,9 @@
   unittest.group('obj-schema-ProjectReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectReference();
-      var od = api.ProjectReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectReference(od as api.ProjectReference);
     });
   });
@@ -7643,7 +7821,9 @@
   unittest.group('obj-schema-QueryParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryParameter();
-      var od = api.QueryParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryParameter(od as api.QueryParameter);
     });
   });
@@ -7651,7 +7831,9 @@
   unittest.group('obj-schema-QueryParameterTypeStructTypes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryParameterTypeStructTypes();
-      var od = api.QueryParameterTypeStructTypes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryParameterTypeStructTypes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryParameterTypeStructTypes(
           od as api.QueryParameterTypeStructTypes);
     });
@@ -7660,7 +7842,9 @@
   unittest.group('obj-schema-QueryParameterType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryParameterType();
-      var od = api.QueryParameterType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryParameterType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryParameterType(od as api.QueryParameterType);
     });
   });
@@ -7668,7 +7852,9 @@
   unittest.group('obj-schema-QueryParameterValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryParameterValue();
-      var od = api.QueryParameterValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryParameterValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryParameterValue(od as api.QueryParameterValue);
     });
   });
@@ -7676,7 +7862,9 @@
   unittest.group('obj-schema-QueryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryRequest();
-      var od = api.QueryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryRequest(od as api.QueryRequest);
     });
   });
@@ -7684,7 +7872,9 @@
   unittest.group('obj-schema-QueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryResponse();
-      var od = api.QueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryResponse(od as api.QueryResponse);
     });
   });
@@ -7692,7 +7882,9 @@
   unittest.group('obj-schema-QueryTimelineSample', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryTimelineSample();
-      var od = api.QueryTimelineSample.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryTimelineSample.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryTimelineSample(od as api.QueryTimelineSample);
     });
   });
@@ -7700,7 +7892,9 @@
   unittest.group('obj-schema-RangePartitioningRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRangePartitioningRange();
-      var od = api.RangePartitioningRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RangePartitioningRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRangePartitioningRange(od as api.RangePartitioningRange);
     });
   });
@@ -7708,7 +7902,9 @@
   unittest.group('obj-schema-RangePartitioning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRangePartitioning();
-      var od = api.RangePartitioning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RangePartitioning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRangePartitioning(od as api.RangePartitioning);
     });
   });
@@ -7716,7 +7912,9 @@
   unittest.group('obj-schema-RankingMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRankingMetrics();
-      var od = api.RankingMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RankingMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRankingMetrics(od as api.RankingMetrics);
     });
   });
@@ -7724,7 +7922,9 @@
   unittest.group('obj-schema-RegressionMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegressionMetrics();
-      var od = api.RegressionMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegressionMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegressionMetrics(od as api.RegressionMetrics);
     });
   });
@@ -7732,7 +7932,9 @@
   unittest.group('obj-schema-Routine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoutine();
-      var od = api.Routine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Routine.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRoutine(od as api.Routine);
     });
   });
@@ -7740,7 +7942,9 @@
   unittest.group('obj-schema-RoutineReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoutineReference();
-      var od = api.RoutineReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoutineReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoutineReference(od as api.RoutineReference);
     });
   });
@@ -7748,7 +7952,8 @@
   unittest.group('obj-schema-Row', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRow();
-      var od = api.Row.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Row.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRow(od as api.Row);
     });
   });
@@ -7756,7 +7961,9 @@
   unittest.group('obj-schema-RowAccessPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRowAccessPolicy();
-      var od = api.RowAccessPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RowAccessPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRowAccessPolicy(od as api.RowAccessPolicy);
     });
   });
@@ -7764,7 +7971,9 @@
   unittest.group('obj-schema-RowAccessPolicyReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRowAccessPolicyReference();
-      var od = api.RowAccessPolicyReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RowAccessPolicyReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRowAccessPolicyReference(od as api.RowAccessPolicyReference);
     });
   });
@@ -7772,7 +7981,9 @@
   unittest.group('obj-schema-RowLevelSecurityStatistics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRowLevelSecurityStatistics();
-      var od = api.RowLevelSecurityStatistics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RowLevelSecurityStatistics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRowLevelSecurityStatistics(od as api.RowLevelSecurityStatistics);
     });
   });
@@ -7780,7 +7991,9 @@
   unittest.group('obj-schema-ScriptStackFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScriptStackFrame();
-      var od = api.ScriptStackFrame.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScriptStackFrame.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScriptStackFrame(od as api.ScriptStackFrame);
     });
   });
@@ -7788,7 +8001,9 @@
   unittest.group('obj-schema-ScriptStatistics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScriptStatistics();
-      var od = api.ScriptStatistics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScriptStatistics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScriptStatistics(od as api.ScriptStatistics);
     });
   });
@@ -7796,7 +8011,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -7804,7 +8021,9 @@
   unittest.group('obj-schema-SnapshotDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotDefinition();
-      var od = api.SnapshotDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotDefinition(od as api.SnapshotDefinition);
     });
   });
@@ -7812,7 +8031,9 @@
   unittest.group('obj-schema-StandardSqlDataType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStandardSqlDataType();
-      var od = api.StandardSqlDataType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StandardSqlDataType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStandardSqlDataType(od as api.StandardSqlDataType);
     });
   });
@@ -7820,7 +8041,9 @@
   unittest.group('obj-schema-StandardSqlField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStandardSqlField();
-      var od = api.StandardSqlField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StandardSqlField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStandardSqlField(od as api.StandardSqlField);
     });
   });
@@ -7828,7 +8051,9 @@
   unittest.group('obj-schema-StandardSqlStructType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStandardSqlStructType();
-      var od = api.StandardSqlStructType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StandardSqlStructType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStandardSqlStructType(od as api.StandardSqlStructType);
     });
   });
@@ -7836,7 +8061,9 @@
   unittest.group('obj-schema-Streamingbuffer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamingbuffer();
-      var od = api.Streamingbuffer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Streamingbuffer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamingbuffer(od as api.Streamingbuffer);
     });
   });
@@ -7844,7 +8071,8 @@
   unittest.group('obj-schema-Table', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTable();
-      var od = api.Table.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Table.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTable(od as api.Table);
     });
   });
@@ -7852,7 +8080,9 @@
   unittest.group('obj-schema-TableCell', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableCell();
-      var od = api.TableCell.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TableCell.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTableCell(od as api.TableCell);
     });
   });
@@ -7860,7 +8090,9 @@
   unittest.group('obj-schema-TableDataInsertAllRequestRows', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableDataInsertAllRequestRows();
-      var od = api.TableDataInsertAllRequestRows.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableDataInsertAllRequestRows.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableDataInsertAllRequestRows(
           od as api.TableDataInsertAllRequestRows);
     });
@@ -7869,7 +8101,9 @@
   unittest.group('obj-schema-TableDataInsertAllRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableDataInsertAllRequest();
-      var od = api.TableDataInsertAllRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableDataInsertAllRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableDataInsertAllRequest(od as api.TableDataInsertAllRequest);
     });
   });
@@ -7877,7 +8111,9 @@
   unittest.group('obj-schema-TableDataInsertAllResponseInsertErrors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableDataInsertAllResponseInsertErrors();
-      var od = api.TableDataInsertAllResponseInsertErrors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableDataInsertAllResponseInsertErrors.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableDataInsertAllResponseInsertErrors(
           od as api.TableDataInsertAllResponseInsertErrors);
     });
@@ -7886,7 +8122,9 @@
   unittest.group('obj-schema-TableDataInsertAllResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableDataInsertAllResponse();
-      var od = api.TableDataInsertAllResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableDataInsertAllResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableDataInsertAllResponse(od as api.TableDataInsertAllResponse);
     });
   });
@@ -7894,7 +8132,9 @@
   unittest.group('obj-schema-TableDataList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableDataList();
-      var od = api.TableDataList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableDataList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableDataList(od as api.TableDataList);
     });
   });
@@ -7902,7 +8142,9 @@
   unittest.group('obj-schema-TableFieldSchemaCategories', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableFieldSchemaCategories();
-      var od = api.TableFieldSchemaCategories.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableFieldSchemaCategories.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableFieldSchemaCategories(od as api.TableFieldSchemaCategories);
     });
   });
@@ -7910,7 +8152,9 @@
   unittest.group('obj-schema-TableFieldSchemaPolicyTags', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableFieldSchemaPolicyTags();
-      var od = api.TableFieldSchemaPolicyTags.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableFieldSchemaPolicyTags.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableFieldSchemaPolicyTags(od as api.TableFieldSchemaPolicyTags);
     });
   });
@@ -7918,7 +8162,9 @@
   unittest.group('obj-schema-TableFieldSchema', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableFieldSchema();
-      var od = api.TableFieldSchema.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableFieldSchema.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableFieldSchema(od as api.TableFieldSchema);
     });
   });
@@ -7926,7 +8172,9 @@
   unittest.group('obj-schema-TableListTablesView', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableListTablesView();
-      var od = api.TableListTablesView.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableListTablesView.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableListTablesView(od as api.TableListTablesView);
     });
   });
@@ -7934,7 +8182,9 @@
   unittest.group('obj-schema-TableListTables', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableListTables();
-      var od = api.TableListTables.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableListTables.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableListTables(od as api.TableListTables);
     });
   });
@@ -7942,7 +8192,9 @@
   unittest.group('obj-schema-TableList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableList();
-      var od = api.TableList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TableList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTableList(od as api.TableList);
     });
   });
@@ -7950,7 +8202,9 @@
   unittest.group('obj-schema-TableReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableReference();
-      var od = api.TableReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableReference(od as api.TableReference);
     });
   });
@@ -7958,7 +8212,9 @@
   unittest.group('obj-schema-TableRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableRow();
-      var od = api.TableRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TableRow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTableRow(od as api.TableRow);
     });
   });
@@ -7966,7 +8222,9 @@
   unittest.group('obj-schema-TableSchema', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableSchema();
-      var od = api.TableSchema.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableSchema.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableSchema(od as api.TableSchema);
     });
   });
@@ -7974,7 +8232,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -7982,7 +8242,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -7990,7 +8252,9 @@
   unittest.group('obj-schema-TimePartitioning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimePartitioning();
-      var od = api.TimePartitioning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimePartitioning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimePartitioning(od as api.TimePartitioning);
     });
   });
@@ -7998,7 +8262,9 @@
   unittest.group('obj-schema-TrainingOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrainingOptions();
-      var od = api.TrainingOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrainingOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrainingOptions(od as api.TrainingOptions);
     });
   });
@@ -8006,7 +8272,9 @@
   unittest.group('obj-schema-TrainingRun', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrainingRun();
-      var od = api.TrainingRun.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrainingRun.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrainingRun(od as api.TrainingRun);
     });
   });
@@ -8014,7 +8282,9 @@
   unittest.group('obj-schema-TransactionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransactionInfo();
-      var od = api.TransactionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransactionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransactionInfo(od as api.TransactionInfo);
     });
   });
@@ -8022,7 +8292,9 @@
   unittest.group('obj-schema-UserDefinedFunctionResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserDefinedFunctionResource();
-      var od = api.UserDefinedFunctionResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserDefinedFunctionResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserDefinedFunctionResource(od as api.UserDefinedFunctionResource);
     });
   });
@@ -8030,7 +8302,9 @@
   unittest.group('obj-schema-ViewDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildViewDefinition();
-      var od = api.ViewDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ViewDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkViewDefinition(od as api.ViewDefinition);
     });
   });
diff --git a/generated/googleapis/test/bigquerydatatransfer/v1_test.dart b/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
index 624db54..edd98bb 100644
--- a/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
+++ b/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
@@ -1287,7 +1287,9 @@
   unittest.group('obj-schema-CheckValidCredsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckValidCredsRequest();
-      var od = api.CheckValidCredsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckValidCredsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckValidCredsRequest(od as api.CheckValidCredsRequest);
     });
   });
@@ -1295,7 +1297,9 @@
   unittest.group('obj-schema-CheckValidCredsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckValidCredsResponse();
-      var od = api.CheckValidCredsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckValidCredsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckValidCredsResponse(od as api.CheckValidCredsResponse);
     });
   });
@@ -1303,7 +1307,9 @@
   unittest.group('obj-schema-DataSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSource();
-      var od = api.DataSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DataSource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataSource(od as api.DataSource);
     });
   });
@@ -1311,7 +1317,9 @@
   unittest.group('obj-schema-DataSourceParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceParameter();
-      var od = api.DataSourceParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceParameter(od as api.DataSourceParameter);
     });
   });
@@ -1319,7 +1327,9 @@
   unittest.group('obj-schema-EmailPreferences', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmailPreferences();
-      var od = api.EmailPreferences.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmailPreferences.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmailPreferences(od as api.EmailPreferences);
     });
   });
@@ -1327,7 +1337,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1335,7 +1346,9 @@
   unittest.group('obj-schema-ListDataSourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDataSourcesResponse();
-      var od = api.ListDataSourcesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDataSourcesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDataSourcesResponse(od as api.ListDataSourcesResponse);
     });
   });
@@ -1343,7 +1356,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1351,7 +1366,9 @@
   unittest.group('obj-schema-ListTransferConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTransferConfigsResponse();
-      var od = api.ListTransferConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTransferConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTransferConfigsResponse(od as api.ListTransferConfigsResponse);
     });
   });
@@ -1359,7 +1376,9 @@
   unittest.group('obj-schema-ListTransferLogsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTransferLogsResponse();
-      var od = api.ListTransferLogsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTransferLogsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTransferLogsResponse(od as api.ListTransferLogsResponse);
     });
   });
@@ -1367,7 +1386,9 @@
   unittest.group('obj-schema-ListTransferRunsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTransferRunsResponse();
-      var od = api.ListTransferRunsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTransferRunsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTransferRunsResponse(od as api.ListTransferRunsResponse);
     });
   });
@@ -1375,7 +1396,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1383,7 +1406,9 @@
   unittest.group('obj-schema-ScheduleOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScheduleOptions();
-      var od = api.ScheduleOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScheduleOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScheduleOptions(od as api.ScheduleOptions);
     });
   });
@@ -1391,7 +1416,9 @@
   unittest.group('obj-schema-ScheduleTransferRunsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScheduleTransferRunsRequest();
-      var od = api.ScheduleTransferRunsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScheduleTransferRunsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScheduleTransferRunsRequest(od as api.ScheduleTransferRunsRequest);
     });
   });
@@ -1399,7 +1426,9 @@
   unittest.group('obj-schema-ScheduleTransferRunsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScheduleTransferRunsResponse();
-      var od = api.ScheduleTransferRunsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScheduleTransferRunsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScheduleTransferRunsResponse(od as api.ScheduleTransferRunsResponse);
     });
   });
@@ -1407,7 +1436,9 @@
   unittest.group('obj-schema-StartManualTransferRunsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartManualTransferRunsRequest();
-      var od = api.StartManualTransferRunsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartManualTransferRunsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartManualTransferRunsRequest(
           od as api.StartManualTransferRunsRequest);
     });
@@ -1416,7 +1447,9 @@
   unittest.group('obj-schema-StartManualTransferRunsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartManualTransferRunsResponse();
-      var od = api.StartManualTransferRunsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartManualTransferRunsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartManualTransferRunsResponse(
           od as api.StartManualTransferRunsResponse);
     });
@@ -1425,7 +1458,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1433,7 +1468,9 @@
   unittest.group('obj-schema-TimeRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeRange();
-      var od = api.TimeRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeRange(od as api.TimeRange);
     });
   });
@@ -1441,7 +1478,9 @@
   unittest.group('obj-schema-TransferConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransferConfig();
-      var od = api.TransferConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransferConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransferConfig(od as api.TransferConfig);
     });
   });
@@ -1449,7 +1488,9 @@
   unittest.group('obj-schema-TransferMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransferMessage();
-      var od = api.TransferMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransferMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransferMessage(od as api.TransferMessage);
     });
   });
@@ -1457,7 +1498,9 @@
   unittest.group('obj-schema-TransferRun', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransferRun();
-      var od = api.TransferRun.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransferRun.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransferRun(od as api.TransferRun);
     });
   });
diff --git a/generated/googleapis/test/bigqueryreservation/v1_test.dart b/generated/googleapis/test/bigqueryreservation/v1_test.dart
index b891742..1562730 100644
--- a/generated/googleapis/test/bigqueryreservation/v1_test.dart
+++ b/generated/googleapis/test/bigqueryreservation/v1_test.dart
@@ -771,7 +771,9 @@
   unittest.group('obj-schema-Assignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssignment();
-      var od = api.Assignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Assignment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAssignment(od as api.Assignment);
     });
   });
@@ -779,7 +781,9 @@
   unittest.group('obj-schema-BiReservation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBiReservation();
-      var od = api.BiReservation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BiReservation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBiReservation(od as api.BiReservation);
     });
   });
@@ -787,7 +791,9 @@
   unittest.group('obj-schema-CapacityCommitment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCapacityCommitment();
-      var od = api.CapacityCommitment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CapacityCommitment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCapacityCommitment(od as api.CapacityCommitment);
     });
   });
@@ -795,7 +801,9 @@
   unittest.group('obj-schema-CreateSlotPoolMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateSlotPoolMetadata();
-      var od = api.CreateSlotPoolMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateSlotPoolMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateSlotPoolMetadata(od as api.CreateSlotPoolMetadata);
     });
   });
@@ -803,7 +811,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -811,7 +820,9 @@
   unittest.group('obj-schema-ListAssignmentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAssignmentsResponse();
-      var od = api.ListAssignmentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAssignmentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAssignmentsResponse(od as api.ListAssignmentsResponse);
     });
   });
@@ -819,7 +830,9 @@
   unittest.group('obj-schema-ListCapacityCommitmentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCapacityCommitmentsResponse();
-      var od = api.ListCapacityCommitmentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCapacityCommitmentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCapacityCommitmentsResponse(
           od as api.ListCapacityCommitmentsResponse);
     });
@@ -828,7 +841,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -836,7 +851,9 @@
   unittest.group('obj-schema-ListReservationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListReservationsResponse();
-      var od = api.ListReservationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListReservationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListReservationsResponse(od as api.ListReservationsResponse);
     });
   });
@@ -844,7 +861,9 @@
   unittest.group('obj-schema-MergeCapacityCommitmentsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMergeCapacityCommitmentsRequest();
-      var od = api.MergeCapacityCommitmentsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MergeCapacityCommitmentsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMergeCapacityCommitmentsRequest(
           od as api.MergeCapacityCommitmentsRequest);
     });
@@ -853,7 +872,9 @@
   unittest.group('obj-schema-MoveAssignmentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoveAssignmentRequest();
-      var od = api.MoveAssignmentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MoveAssignmentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMoveAssignmentRequest(od as api.MoveAssignmentRequest);
     });
   });
@@ -861,7 +882,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -869,7 +892,9 @@
   unittest.group('obj-schema-Reservation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservation();
-      var od = api.Reservation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Reservation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservation(od as api.Reservation);
     });
   });
@@ -877,7 +902,9 @@
   unittest.group('obj-schema-SearchAllAssignmentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchAllAssignmentsResponse();
-      var od = api.SearchAllAssignmentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchAllAssignmentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchAllAssignmentsResponse(od as api.SearchAllAssignmentsResponse);
     });
   });
@@ -885,7 +912,9 @@
   unittest.group('obj-schema-SearchAssignmentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchAssignmentsResponse();
-      var od = api.SearchAssignmentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchAssignmentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchAssignmentsResponse(od as api.SearchAssignmentsResponse);
     });
   });
@@ -893,7 +922,9 @@
   unittest.group('obj-schema-SplitCapacityCommitmentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSplitCapacityCommitmentRequest();
-      var od = api.SplitCapacityCommitmentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SplitCapacityCommitmentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSplitCapacityCommitmentRequest(
           od as api.SplitCapacityCommitmentRequest);
     });
@@ -902,7 +933,9 @@
   unittest.group('obj-schema-SplitCapacityCommitmentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSplitCapacityCommitmentResponse();
-      var od = api.SplitCapacityCommitmentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SplitCapacityCommitmentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSplitCapacityCommitmentResponse(
           od as api.SplitCapacityCommitmentResponse);
     });
@@ -911,7 +944,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
diff --git a/generated/googleapis/test/bigtableadmin/v2_test.dart b/generated/googleapis/test/bigtableadmin/v2_test.dart
index b06c398..34496ab 100644
--- a/generated/googleapis/test/bigtableadmin/v2_test.dart
+++ b/generated/googleapis/test/bigtableadmin/v2_test.dart
@@ -2249,7 +2249,9 @@
   unittest.group('obj-schema-AppProfile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppProfile();
-      var od = api.AppProfile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AppProfile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAppProfile(od as api.AppProfile);
     });
   });
@@ -2257,7 +2259,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -2265,7 +2269,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -2273,7 +2279,9 @@
   unittest.group('obj-schema-Backup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackup();
-      var od = api.Backup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Backup.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackup(od as api.Backup);
     });
   });
@@ -2281,7 +2289,9 @@
   unittest.group('obj-schema-BackupInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackupInfo();
-      var od = api.BackupInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BackupInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackupInfo(od as api.BackupInfo);
     });
   });
@@ -2289,7 +2299,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -2297,7 +2309,9 @@
   unittest.group('obj-schema-CheckConsistencyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckConsistencyRequest();
-      var od = api.CheckConsistencyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckConsistencyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckConsistencyRequest(od as api.CheckConsistencyRequest);
     });
   });
@@ -2305,7 +2319,9 @@
   unittest.group('obj-schema-CheckConsistencyResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckConsistencyResponse();
-      var od = api.CheckConsistencyResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckConsistencyResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckConsistencyResponse(od as api.CheckConsistencyResponse);
     });
   });
@@ -2313,7 +2329,9 @@
   unittest.group('obj-schema-Cluster', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCluster();
-      var od = api.Cluster.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Cluster.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCluster(od as api.Cluster);
     });
   });
@@ -2321,7 +2339,9 @@
   unittest.group('obj-schema-ClusterState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterState();
-      var od = api.ClusterState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterState(od as api.ClusterState);
     });
   });
@@ -2329,7 +2349,9 @@
   unittest.group('obj-schema-ColumnFamily', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColumnFamily();
-      var od = api.ColumnFamily.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ColumnFamily.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkColumnFamily(od as api.ColumnFamily);
     });
   });
@@ -2337,7 +2359,9 @@
   unittest.group('obj-schema-CreateBackupMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateBackupMetadata();
-      var od = api.CreateBackupMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateBackupMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateBackupMetadata(od as api.CreateBackupMetadata);
     });
   });
@@ -2345,7 +2369,9 @@
   unittest.group('obj-schema-CreateClusterMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateClusterMetadata();
-      var od = api.CreateClusterMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateClusterMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateClusterMetadata(od as api.CreateClusterMetadata);
     });
   });
@@ -2353,7 +2379,9 @@
   unittest.group('obj-schema-CreateClusterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateClusterRequest();
-      var od = api.CreateClusterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateClusterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateClusterRequest(od as api.CreateClusterRequest);
     });
   });
@@ -2361,7 +2389,9 @@
   unittest.group('obj-schema-CreateInstanceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateInstanceMetadata();
-      var od = api.CreateInstanceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateInstanceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateInstanceMetadata(od as api.CreateInstanceMetadata);
     });
   });
@@ -2369,7 +2399,9 @@
   unittest.group('obj-schema-CreateInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateInstanceRequest();
-      var od = api.CreateInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateInstanceRequest(od as api.CreateInstanceRequest);
     });
   });
@@ -2377,7 +2409,9 @@
   unittest.group('obj-schema-CreateTableRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTableRequest();
-      var od = api.CreateTableRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTableRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTableRequest(od as api.CreateTableRequest);
     });
   });
@@ -2385,7 +2419,9 @@
   unittest.group('obj-schema-DropRowRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDropRowRangeRequest();
-      var od = api.DropRowRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DropRowRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDropRowRangeRequest(od as api.DropRowRangeRequest);
     });
   });
@@ -2393,7 +2429,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2401,7 +2438,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -2409,7 +2447,9 @@
   unittest.group('obj-schema-FailureTrace', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFailureTrace();
-      var od = api.FailureTrace.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FailureTrace.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFailureTrace(od as api.FailureTrace);
     });
   });
@@ -2417,7 +2457,8 @@
   unittest.group('obj-schema-Frame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFrame();
-      var od = api.Frame.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Frame.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFrame(od as api.Frame);
     });
   });
@@ -2425,7 +2466,9 @@
   unittest.group('obj-schema-GcRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcRule();
-      var od = api.GcRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GcRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGcRule(od as api.GcRule);
     });
   });
@@ -2433,7 +2476,9 @@
   unittest.group('obj-schema-GenerateConsistencyTokenRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateConsistencyTokenRequest();
-      var od = api.GenerateConsistencyTokenRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateConsistencyTokenRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateConsistencyTokenRequest(
           od as api.GenerateConsistencyTokenRequest);
     });
@@ -2442,7 +2487,9 @@
   unittest.group('obj-schema-GenerateConsistencyTokenResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateConsistencyTokenResponse();
-      var od = api.GenerateConsistencyTokenResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateConsistencyTokenResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateConsistencyTokenResponse(
           od as api.GenerateConsistencyTokenResponse);
     });
@@ -2451,7 +2498,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -2459,7 +2508,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -2467,7 +2518,9 @@
   unittest.group('obj-schema-Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstance();
-      var od = api.Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Instance.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstance(od as api.Instance);
     });
   });
@@ -2475,7 +2528,9 @@
   unittest.group('obj-schema-Intersection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntersection();
-      var od = api.Intersection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Intersection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntersection(od as api.Intersection);
     });
   });
@@ -2483,7 +2538,9 @@
   unittest.group('obj-schema-ListAppProfilesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAppProfilesResponse();
-      var od = api.ListAppProfilesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAppProfilesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAppProfilesResponse(od as api.ListAppProfilesResponse);
     });
   });
@@ -2491,7 +2548,9 @@
   unittest.group('obj-schema-ListBackupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBackupsResponse();
-      var od = api.ListBackupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBackupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBackupsResponse(od as api.ListBackupsResponse);
     });
   });
@@ -2499,7 +2558,9 @@
   unittest.group('obj-schema-ListClustersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListClustersResponse();
-      var od = api.ListClustersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListClustersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListClustersResponse(od as api.ListClustersResponse);
     });
   });
@@ -2507,7 +2568,9 @@
   unittest.group('obj-schema-ListInstancesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInstancesResponse();
-      var od = api.ListInstancesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInstancesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
@@ -2515,7 +2578,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -2523,7 +2588,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -2531,7 +2598,9 @@
   unittest.group('obj-schema-ListTablesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTablesResponse();
-      var od = api.ListTablesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTablesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTablesResponse(od as api.ListTablesResponse);
     });
   });
@@ -2539,7 +2608,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2547,7 +2618,9 @@
   unittest.group('obj-schema-Modification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModification();
-      var od = api.Modification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Modification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModification(od as api.Modification);
     });
   });
@@ -2555,7 +2628,9 @@
   unittest.group('obj-schema-ModifyColumnFamiliesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyColumnFamiliesRequest();
-      var od = api.ModifyColumnFamiliesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyColumnFamiliesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyColumnFamiliesRequest(od as api.ModifyColumnFamiliesRequest);
     });
   });
@@ -2563,7 +2638,9 @@
   unittest.group('obj-schema-MultiClusterRoutingUseAny', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMultiClusterRoutingUseAny();
-      var od = api.MultiClusterRoutingUseAny.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MultiClusterRoutingUseAny.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMultiClusterRoutingUseAny(od as api.MultiClusterRoutingUseAny);
     });
   });
@@ -2571,7 +2648,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2579,7 +2658,9 @@
   unittest.group('obj-schema-OperationProgress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationProgress();
-      var od = api.OperationProgress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationProgress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationProgress(od as api.OperationProgress);
     });
   });
@@ -2587,7 +2668,9 @@
   unittest.group('obj-schema-OptimizeRestoredTableMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOptimizeRestoredTableMetadata();
-      var od = api.OptimizeRestoredTableMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OptimizeRestoredTableMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOptimizeRestoredTableMetadata(
           od as api.OptimizeRestoredTableMetadata);
     });
@@ -2596,7 +2679,9 @@
   unittest.group('obj-schema-PartialUpdateInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartialUpdateInstanceRequest();
-      var od = api.PartialUpdateInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartialUpdateInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartialUpdateInstanceRequest(od as api.PartialUpdateInstanceRequest);
     });
   });
@@ -2604,7 +2689,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2612,7 +2699,9 @@
   unittest.group('obj-schema-RestoreInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreInfo();
-      var od = api.RestoreInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreInfo(od as api.RestoreInfo);
     });
   });
@@ -2620,7 +2709,9 @@
   unittest.group('obj-schema-RestoreTableMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreTableMetadata();
-      var od = api.RestoreTableMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreTableMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreTableMetadata(od as api.RestoreTableMetadata);
     });
   });
@@ -2628,7 +2719,9 @@
   unittest.group('obj-schema-RestoreTableRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreTableRequest();
-      var od = api.RestoreTableRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreTableRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreTableRequest(od as api.RestoreTableRequest);
     });
   });
@@ -2636,7 +2729,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -2644,7 +2739,9 @@
   unittest.group('obj-schema-SingleClusterRouting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSingleClusterRouting();
-      var od = api.SingleClusterRouting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SingleClusterRouting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSingleClusterRouting(od as api.SingleClusterRouting);
     });
   });
@@ -2652,7 +2749,8 @@
   unittest.group('obj-schema-Split', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSplit();
-      var od = api.Split.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Split.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSplit(od as api.Split);
     });
   });
@@ -2660,7 +2758,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2668,7 +2768,8 @@
   unittest.group('obj-schema-Table', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTable();
-      var od = api.Table.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Table.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTable(od as api.Table);
     });
   });
@@ -2676,7 +2777,9 @@
   unittest.group('obj-schema-TableProgress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableProgress();
-      var od = api.TableProgress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableProgress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableProgress(od as api.TableProgress);
     });
   });
@@ -2684,7 +2787,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2692,7 +2797,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -2700,7 +2807,8 @@
   unittest.group('obj-schema-Union', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnion();
-      var od = api.Union.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Union.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUnion(od as api.Union);
     });
   });
@@ -2708,7 +2816,9 @@
   unittest.group('obj-schema-UpdateAppProfileMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateAppProfileMetadata();
-      var od = api.UpdateAppProfileMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateAppProfileMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateAppProfileMetadata(od as api.UpdateAppProfileMetadata);
     });
   });
@@ -2716,7 +2826,9 @@
   unittest.group('obj-schema-UpdateClusterMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateClusterMetadata();
-      var od = api.UpdateClusterMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateClusterMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateClusterMetadata(od as api.UpdateClusterMetadata);
     });
   });
@@ -2724,7 +2836,9 @@
   unittest.group('obj-schema-UpdateInstanceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateInstanceMetadata();
-      var od = api.UpdateInstanceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateInstanceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateInstanceMetadata(od as api.UpdateInstanceMetadata);
     });
   });
diff --git a/generated/googleapis/test/billingbudgets/v1_test.dart b/generated/googleapis/test/billingbudgets/v1_test.dart
index c3f7fcf..a12a63e 100644
--- a/generated/googleapis/test/billingbudgets/v1_test.dart
+++ b/generated/googleapis/test/billingbudgets/v1_test.dart
@@ -533,7 +533,9 @@
   unittest.group('obj-schema-GoogleCloudBillingBudgetsV1Budget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudBillingBudgetsV1Budget();
-      var od = api.GoogleCloudBillingBudgetsV1Budget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudBillingBudgetsV1Budget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudBillingBudgetsV1Budget(
           od as api.GoogleCloudBillingBudgetsV1Budget);
     });
@@ -542,7 +544,9 @@
   unittest.group('obj-schema-GoogleCloudBillingBudgetsV1BudgetAmount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudBillingBudgetsV1BudgetAmount();
-      var od = api.GoogleCloudBillingBudgetsV1BudgetAmount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudBillingBudgetsV1BudgetAmount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudBillingBudgetsV1BudgetAmount(
           od as api.GoogleCloudBillingBudgetsV1BudgetAmount);
     });
@@ -551,7 +555,9 @@
   unittest.group('obj-schema-GoogleCloudBillingBudgetsV1CustomPeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudBillingBudgetsV1CustomPeriod();
-      var od = api.GoogleCloudBillingBudgetsV1CustomPeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudBillingBudgetsV1CustomPeriod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudBillingBudgetsV1CustomPeriod(
           od as api.GoogleCloudBillingBudgetsV1CustomPeriod);
     });
@@ -560,7 +566,9 @@
   unittest.group('obj-schema-GoogleCloudBillingBudgetsV1Filter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudBillingBudgetsV1Filter();
-      var od = api.GoogleCloudBillingBudgetsV1Filter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudBillingBudgetsV1Filter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudBillingBudgetsV1Filter(
           od as api.GoogleCloudBillingBudgetsV1Filter);
     });
@@ -569,8 +577,9 @@
   unittest.group('obj-schema-GoogleCloudBillingBudgetsV1LastPeriodAmount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudBillingBudgetsV1LastPeriodAmount();
-      var od =
-          api.GoogleCloudBillingBudgetsV1LastPeriodAmount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudBillingBudgetsV1LastPeriodAmount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudBillingBudgetsV1LastPeriodAmount(
           od as api.GoogleCloudBillingBudgetsV1LastPeriodAmount);
     });
@@ -580,8 +589,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudBillingBudgetsV1ListBudgetsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudBillingBudgetsV1ListBudgetsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudBillingBudgetsV1ListBudgetsResponse(
           od as api.GoogleCloudBillingBudgetsV1ListBudgetsResponse);
     });
@@ -590,8 +600,9 @@
   unittest.group('obj-schema-GoogleCloudBillingBudgetsV1NotificationsRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudBillingBudgetsV1NotificationsRule();
-      var od =
-          api.GoogleCloudBillingBudgetsV1NotificationsRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudBillingBudgetsV1NotificationsRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudBillingBudgetsV1NotificationsRule(
           od as api.GoogleCloudBillingBudgetsV1NotificationsRule);
     });
@@ -600,8 +611,9 @@
   unittest.group('obj-schema-GoogleCloudBillingBudgetsV1ThresholdRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudBillingBudgetsV1ThresholdRule();
-      var od =
-          api.GoogleCloudBillingBudgetsV1ThresholdRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudBillingBudgetsV1ThresholdRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudBillingBudgetsV1ThresholdRule(
           od as api.GoogleCloudBillingBudgetsV1ThresholdRule);
     });
@@ -610,7 +622,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -618,7 +632,9 @@
   unittest.group('obj-schema-GoogleTypeDate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeDate();
-      var od = api.GoogleTypeDate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeDate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeDate(od as api.GoogleTypeDate);
     });
   });
@@ -626,7 +642,9 @@
   unittest.group('obj-schema-GoogleTypeMoney', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeMoney();
-      var od = api.GoogleTypeMoney.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeMoney.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeMoney(od as api.GoogleTypeMoney);
     });
   });
diff --git a/generated/googleapis/test/binaryauthorization/v1_test.dart b/generated/googleapis/test/binaryauthorization/v1_test.dart
index 15ec9ef..999ce0c 100644
--- a/generated/googleapis/test/binaryauthorization/v1_test.dart
+++ b/generated/googleapis/test/binaryauthorization/v1_test.dart
@@ -785,7 +785,9 @@
   unittest.group('obj-schema-AdmissionRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdmissionRule();
-      var od = api.AdmissionRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdmissionRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdmissionRule(od as api.AdmissionRule);
     });
   });
@@ -793,7 +795,9 @@
   unittest.group('obj-schema-AdmissionWhitelistPattern', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdmissionWhitelistPattern();
-      var od = api.AdmissionWhitelistPattern.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdmissionWhitelistPattern.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdmissionWhitelistPattern(od as api.AdmissionWhitelistPattern);
     });
   });
@@ -801,7 +805,9 @@
   unittest.group('obj-schema-AttestationOccurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttestationOccurrence();
-      var od = api.AttestationOccurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttestationOccurrence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttestationOccurrence(od as api.AttestationOccurrence);
     });
   });
@@ -809,7 +815,9 @@
   unittest.group('obj-schema-Attestor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttestor();
-      var od = api.Attestor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Attestor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAttestor(od as api.Attestor);
     });
   });
@@ -817,7 +825,9 @@
   unittest.group('obj-schema-AttestorPublicKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttestorPublicKey();
-      var od = api.AttestorPublicKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttestorPublicKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttestorPublicKey(od as api.AttestorPublicKey);
     });
   });
@@ -825,7 +835,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -833,7 +845,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -841,7 +854,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -849,7 +863,9 @@
   unittest.group('obj-schema-IamPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIamPolicy();
-      var od = api.IamPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IamPolicy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIamPolicy(od as api.IamPolicy);
     });
   });
@@ -857,7 +873,8 @@
   unittest.group('obj-schema-Jwt', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJwt();
-      var od = api.Jwt.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Jwt.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJwt(od as api.Jwt);
     });
   });
@@ -865,7 +882,9 @@
   unittest.group('obj-schema-ListAttestorsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAttestorsResponse();
-      var od = api.ListAttestorsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAttestorsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAttestorsResponse(od as api.ListAttestorsResponse);
     });
   });
@@ -873,7 +892,9 @@
   unittest.group('obj-schema-PkixPublicKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPkixPublicKey();
-      var od = api.PkixPublicKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PkixPublicKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPkixPublicKey(od as api.PkixPublicKey);
     });
   });
@@ -881,7 +902,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -889,7 +912,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -897,7 +922,9 @@
   unittest.group('obj-schema-Signature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignature();
-      var od = api.Signature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Signature.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSignature(od as api.Signature);
     });
   });
@@ -905,7 +932,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -913,7 +942,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -921,7 +952,9 @@
   unittest.group('obj-schema-UserOwnedGrafeasNote', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserOwnedGrafeasNote();
-      var od = api.UserOwnedGrafeasNote.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserOwnedGrafeasNote.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserOwnedGrafeasNote(od as api.UserOwnedGrafeasNote);
     });
   });
@@ -929,7 +962,9 @@
   unittest.group('obj-schema-ValidateAttestationOccurrenceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValidateAttestationOccurrenceRequest();
-      var od = api.ValidateAttestationOccurrenceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValidateAttestationOccurrenceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValidateAttestationOccurrenceRequest(
           od as api.ValidateAttestationOccurrenceRequest);
     });
@@ -938,7 +973,9 @@
   unittest.group('obj-schema-ValidateAttestationOccurrenceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValidateAttestationOccurrenceResponse();
-      var od = api.ValidateAttestationOccurrenceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValidateAttestationOccurrenceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValidateAttestationOccurrenceResponse(
           od as api.ValidateAttestationOccurrenceResponse);
     });
diff --git a/generated/googleapis/test/blogger/v3_test.dart b/generated/googleapis/test/blogger/v3_test.dart
index 57ff87d..53ba007 100644
--- a/generated/googleapis/test/blogger/v3_test.dart
+++ b/generated/googleapis/test/blogger/v3_test.dart
@@ -1533,7 +1533,9 @@
   unittest.group('obj-schema-BlogLocale', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlogLocale();
-      var od = api.BlogLocale.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BlogLocale.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBlogLocale(od as api.BlogLocale);
     });
   });
@@ -1541,7 +1543,9 @@
   unittest.group('obj-schema-BlogPages', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlogPages();
-      var od = api.BlogPages.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BlogPages.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBlogPages(od as api.BlogPages);
     });
   });
@@ -1549,7 +1553,9 @@
   unittest.group('obj-schema-BlogPosts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlogPosts();
-      var od = api.BlogPosts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BlogPosts.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBlogPosts(od as api.BlogPosts);
     });
   });
@@ -1557,7 +1563,8 @@
   unittest.group('obj-schema-Blog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlog();
-      var od = api.Blog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Blog.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBlog(od as api.Blog);
     });
   });
@@ -1565,7 +1572,9 @@
   unittest.group('obj-schema-BlogList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlogList();
-      var od = api.BlogList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BlogList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBlogList(od as api.BlogList);
     });
   });
@@ -1573,7 +1582,9 @@
   unittest.group('obj-schema-BlogPerUserInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlogPerUserInfo();
-      var od = api.BlogPerUserInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BlogPerUserInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBlogPerUserInfo(od as api.BlogPerUserInfo);
     });
   });
@@ -1581,7 +1592,9 @@
   unittest.group('obj-schema-BlogUserInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlogUserInfo();
-      var od = api.BlogUserInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BlogUserInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBlogUserInfo(od as api.BlogUserInfo);
     });
   });
@@ -1589,7 +1602,9 @@
   unittest.group('obj-schema-CommentAuthorImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentAuthorImage();
-      var od = api.CommentAuthorImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentAuthorImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentAuthorImage(od as api.CommentAuthorImage);
     });
   });
@@ -1597,7 +1612,9 @@
   unittest.group('obj-schema-CommentAuthor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentAuthor();
-      var od = api.CommentAuthor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentAuthor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentAuthor(od as api.CommentAuthor);
     });
   });
@@ -1605,7 +1622,9 @@
   unittest.group('obj-schema-CommentBlog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentBlog();
-      var od = api.CommentBlog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentBlog.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentBlog(od as api.CommentBlog);
     });
   });
@@ -1613,7 +1632,9 @@
   unittest.group('obj-schema-CommentInReplyTo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentInReplyTo();
-      var od = api.CommentInReplyTo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentInReplyTo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentInReplyTo(od as api.CommentInReplyTo);
     });
   });
@@ -1621,7 +1642,9 @@
   unittest.group('obj-schema-CommentPost', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentPost();
-      var od = api.CommentPost.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentPost.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentPost(od as api.CommentPost);
     });
   });
@@ -1629,7 +1652,9 @@
   unittest.group('obj-schema-Comment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComment();
-      var od = api.Comment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Comment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkComment(od as api.Comment);
     });
   });
@@ -1637,7 +1662,9 @@
   unittest.group('obj-schema-CommentList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentList();
-      var od = api.CommentList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentList(od as api.CommentList);
     });
   });
@@ -1645,7 +1672,9 @@
   unittest.group('obj-schema-PageAuthorImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageAuthorImage();
-      var od = api.PageAuthorImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PageAuthorImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPageAuthorImage(od as api.PageAuthorImage);
     });
   });
@@ -1653,7 +1682,9 @@
   unittest.group('obj-schema-PageAuthor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageAuthor();
-      var od = api.PageAuthor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PageAuthor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPageAuthor(od as api.PageAuthor);
     });
   });
@@ -1661,7 +1692,9 @@
   unittest.group('obj-schema-PageBlog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageBlog();
-      var od = api.PageBlog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PageBlog.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPageBlog(od as api.PageBlog);
     });
   });
@@ -1669,7 +1702,8 @@
   unittest.group('obj-schema-Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPage();
-      var od = api.Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Page.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPage(od as api.Page);
     });
   });
@@ -1677,7 +1711,9 @@
   unittest.group('obj-schema-PageList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageList();
-      var od = api.PageList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PageList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPageList(od as api.PageList);
     });
   });
@@ -1685,7 +1721,9 @@
   unittest.group('obj-schema-PageviewsCounts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageviewsCounts();
-      var od = api.PageviewsCounts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PageviewsCounts.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPageviewsCounts(od as api.PageviewsCounts);
     });
   });
@@ -1693,7 +1731,9 @@
   unittest.group('obj-schema-Pageviews', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageviews();
-      var od = api.Pageviews.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Pageviews.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPageviews(od as api.Pageviews);
     });
   });
@@ -1701,7 +1741,9 @@
   unittest.group('obj-schema-PostAuthorImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostAuthorImage();
-      var od = api.PostAuthorImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostAuthorImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostAuthorImage(od as api.PostAuthorImage);
     });
   });
@@ -1709,7 +1751,9 @@
   unittest.group('obj-schema-PostAuthor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostAuthor();
-      var od = api.PostAuthor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PostAuthor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPostAuthor(od as api.PostAuthor);
     });
   });
@@ -1717,7 +1761,9 @@
   unittest.group('obj-schema-PostBlog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostBlog();
-      var od = api.PostBlog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PostBlog.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPostBlog(od as api.PostBlog);
     });
   });
@@ -1725,7 +1771,9 @@
   unittest.group('obj-schema-PostImages', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostImages();
-      var od = api.PostImages.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PostImages.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPostImages(od as api.PostImages);
     });
   });
@@ -1733,7 +1781,9 @@
   unittest.group('obj-schema-PostLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostLocation();
-      var od = api.PostLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostLocation(od as api.PostLocation);
     });
   });
@@ -1741,7 +1791,9 @@
   unittest.group('obj-schema-PostReplies', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostReplies();
-      var od = api.PostReplies.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostReplies.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostReplies(od as api.PostReplies);
     });
   });
@@ -1749,7 +1801,8 @@
   unittest.group('obj-schema-Post', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPost();
-      var od = api.Post.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Post.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPost(od as api.Post);
     });
   });
@@ -1757,7 +1810,9 @@
   unittest.group('obj-schema-PostList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostList();
-      var od = api.PostList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PostList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPostList(od as api.PostList);
     });
   });
@@ -1765,7 +1820,9 @@
   unittest.group('obj-schema-PostPerUserInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostPerUserInfo();
-      var od = api.PostPerUserInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostPerUserInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostPerUserInfo(od as api.PostPerUserInfo);
     });
   });
@@ -1773,7 +1830,9 @@
   unittest.group('obj-schema-PostUserInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostUserInfo();
-      var od = api.PostUserInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostUserInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostUserInfo(od as api.PostUserInfo);
     });
   });
@@ -1781,7 +1840,9 @@
   unittest.group('obj-schema-PostUserInfosList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostUserInfosList();
-      var od = api.PostUserInfosList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostUserInfosList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostUserInfosList(od as api.PostUserInfosList);
     });
   });
@@ -1789,7 +1850,9 @@
   unittest.group('obj-schema-UserBlogs', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserBlogs();
-      var od = api.UserBlogs.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserBlogs.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserBlogs(od as api.UserBlogs);
     });
   });
@@ -1797,7 +1860,9 @@
   unittest.group('obj-schema-UserLocale', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserLocale();
-      var od = api.UserLocale.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserLocale.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserLocale(od as api.UserLocale);
     });
   });
@@ -1805,7 +1870,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
diff --git a/generated/googleapis/test/books/v1_test.dart b/generated/googleapis/test/books/v1_test.dart
index 79113ed..efa60a4 100644
--- a/generated/googleapis/test/books/v1_test.dart
+++ b/generated/googleapis/test/books/v1_test.dart
@@ -4793,7 +4793,9 @@
   unittest.group('obj-schema-AnnotationClientVersionRanges', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotationClientVersionRanges();
-      var od = api.AnnotationClientVersionRanges.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotationClientVersionRanges.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotationClientVersionRanges(
           od as api.AnnotationClientVersionRanges);
     });
@@ -4802,7 +4804,9 @@
   unittest.group('obj-schema-AnnotationCurrentVersionRanges', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotationCurrentVersionRanges();
-      var od = api.AnnotationCurrentVersionRanges.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotationCurrentVersionRanges.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotationCurrentVersionRanges(
           od as api.AnnotationCurrentVersionRanges);
     });
@@ -4811,7 +4815,9 @@
   unittest.group('obj-schema-AnnotationLayerSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotationLayerSummary();
-      var od = api.AnnotationLayerSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotationLayerSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotationLayerSummary(od as api.AnnotationLayerSummary);
     });
   });
@@ -4819,7 +4825,9 @@
   unittest.group('obj-schema-Annotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotation();
-      var od = api.Annotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Annotation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAnnotation(od as api.Annotation);
     });
   });
@@ -4827,7 +4835,9 @@
   unittest.group('obj-schema-Annotations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotations();
-      var od = api.Annotations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Annotations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotations(od as api.Annotations);
     });
   });
@@ -4835,7 +4845,9 @@
   unittest.group('obj-schema-AnnotationsSummaryLayers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotationsSummaryLayers();
-      var od = api.AnnotationsSummaryLayers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotationsSummaryLayers.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotationsSummaryLayers(od as api.AnnotationsSummaryLayers);
     });
   });
@@ -4843,7 +4855,9 @@
   unittest.group('obj-schema-AnnotationsSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotationsSummary();
-      var od = api.AnnotationsSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotationsSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotationsSummary(od as api.AnnotationsSummary);
     });
   });
@@ -4851,7 +4865,9 @@
   unittest.group('obj-schema-Annotationsdata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotationsdata();
-      var od = api.Annotationsdata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Annotationsdata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotationsdata(od as api.Annotationsdata);
     });
   });
@@ -4859,7 +4875,9 @@
   unittest.group('obj-schema-BooksAnnotationsRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBooksAnnotationsRange();
-      var od = api.BooksAnnotationsRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BooksAnnotationsRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBooksAnnotationsRange(od as api.BooksAnnotationsRange);
     });
   });
@@ -4867,7 +4885,9 @@
   unittest.group('obj-schema-BooksCloudloadingResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBooksCloudloadingResource();
-      var od = api.BooksCloudloadingResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BooksCloudloadingResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBooksCloudloadingResource(od as api.BooksCloudloadingResource);
     });
   });
@@ -4875,7 +4895,9 @@
   unittest.group('obj-schema-BooksVolumesRecommendedRateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBooksVolumesRecommendedRateResponse();
-      var od = api.BooksVolumesRecommendedRateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BooksVolumesRecommendedRateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBooksVolumesRecommendedRateResponse(
           od as api.BooksVolumesRecommendedRateResponse);
     });
@@ -4884,7 +4906,9 @@
   unittest.group('obj-schema-Bookshelf', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBookshelf();
-      var od = api.Bookshelf.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Bookshelf.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBookshelf(od as api.Bookshelf);
     });
   });
@@ -4892,7 +4916,9 @@
   unittest.group('obj-schema-Bookshelves', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBookshelves();
-      var od = api.Bookshelves.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Bookshelves.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBookshelves(od as api.Bookshelves);
     });
   });
@@ -4900,7 +4926,9 @@
   unittest.group('obj-schema-CategoryItems', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategoryItems();
-      var od = api.CategoryItems.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CategoryItems.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCategoryItems(od as api.CategoryItems);
     });
   });
@@ -4908,7 +4936,9 @@
   unittest.group('obj-schema-Category', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategory();
-      var od = api.Category.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Category.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCategory(od as api.Category);
     });
   });
@@ -4916,7 +4946,9 @@
   unittest.group('obj-schema-ConcurrentAccessRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConcurrentAccessRestriction();
-      var od = api.ConcurrentAccessRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConcurrentAccessRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConcurrentAccessRestriction(od as api.ConcurrentAccessRestriction);
     });
   });
@@ -4924,7 +4956,9 @@
   unittest.group('obj-schema-DictionaryAnnotationdata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictionaryAnnotationdata();
-      var od = api.DictionaryAnnotationdata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictionaryAnnotationdata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictionaryAnnotationdata(od as api.DictionaryAnnotationdata);
     });
   });
@@ -4932,7 +4966,9 @@
   unittest.group('obj-schema-DictlayerdataCommon', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataCommon();
-      var od = api.DictlayerdataCommon.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataCommon.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataCommon(od as api.DictlayerdataCommon);
     });
   });
@@ -4940,7 +4976,9 @@
   unittest.group('obj-schema-DictlayerdataDictSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictSource();
-      var od = api.DictlayerdataDictSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictSource(od as api.DictlayerdataDictSource);
     });
   });
@@ -4948,7 +4986,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsDerivativesSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsDerivativesSource();
-      var od = api.DictlayerdataDictWordsDerivativesSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsDerivativesSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsDerivativesSource(
           od as api.DictlayerdataDictWordsDerivativesSource);
     });
@@ -4957,7 +4997,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsDerivatives', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsDerivatives();
-      var od = api.DictlayerdataDictWordsDerivatives.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsDerivatives.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsDerivatives(
           od as api.DictlayerdataDictWordsDerivatives);
     });
@@ -4966,7 +5008,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsExamplesSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsExamplesSource();
-      var od = api.DictlayerdataDictWordsExamplesSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsExamplesSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsExamplesSource(
           od as api.DictlayerdataDictWordsExamplesSource);
     });
@@ -4975,7 +5019,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsExamples', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsExamples();
-      var od = api.DictlayerdataDictWordsExamples.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsExamples.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsExamples(
           od as api.DictlayerdataDictWordsExamples);
     });
@@ -4984,8 +5030,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsSensesConjugations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsSensesConjugations();
-      var od =
-          api.DictlayerdataDictWordsSensesConjugations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsSensesConjugations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsSensesConjugations(
           od as api.DictlayerdataDictWordsSensesConjugations);
     });
@@ -4995,9 +5042,10 @@
       'obj-schema-DictlayerdataDictWordsSensesDefinitionsExamplesSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsSensesDefinitionsExamplesSource();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.DictlayerdataDictWordsSensesDefinitionsExamplesSource.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsSensesDefinitionsExamplesSource(
           od as api.DictlayerdataDictWordsSensesDefinitionsExamplesSource);
     });
@@ -5007,8 +5055,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsSensesDefinitionsExamples();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.DictlayerdataDictWordsSensesDefinitionsExamples.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsSensesDefinitionsExamples(
           od as api.DictlayerdataDictWordsSensesDefinitionsExamples);
     });
@@ -5017,7 +5066,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsSensesDefinitions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsSensesDefinitions();
-      var od = api.DictlayerdataDictWordsSensesDefinitions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsSensesDefinitions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsSensesDefinitions(
           od as api.DictlayerdataDictWordsSensesDefinitions);
     });
@@ -5026,7 +5077,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsSensesSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsSensesSource();
-      var od = api.DictlayerdataDictWordsSensesSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsSensesSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsSensesSource(
           od as api.DictlayerdataDictWordsSensesSource);
     });
@@ -5035,8 +5088,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsSensesSynonymsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsSensesSynonymsSource();
-      var od =
-          api.DictlayerdataDictWordsSensesSynonymsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsSensesSynonymsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsSensesSynonymsSource(
           od as api.DictlayerdataDictWordsSensesSynonymsSource);
     });
@@ -5045,7 +5099,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsSensesSynonyms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsSensesSynonyms();
-      var od = api.DictlayerdataDictWordsSensesSynonyms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsSensesSynonyms.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsSensesSynonyms(
           od as api.DictlayerdataDictWordsSensesSynonyms);
     });
@@ -5054,7 +5110,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsSenses', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsSenses();
-      var od = api.DictlayerdataDictWordsSenses.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsSenses.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsSenses(od as api.DictlayerdataDictWordsSenses);
     });
   });
@@ -5062,7 +5120,9 @@
   unittest.group('obj-schema-DictlayerdataDictWordsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWordsSource();
-      var od = api.DictlayerdataDictWordsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWordsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWordsSource(od as api.DictlayerdataDictWordsSource);
     });
   });
@@ -5070,7 +5130,9 @@
   unittest.group('obj-schema-DictlayerdataDictWords', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDictWords();
-      var od = api.DictlayerdataDictWords.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDictWords.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDictWords(od as api.DictlayerdataDictWords);
     });
   });
@@ -5078,7 +5140,9 @@
   unittest.group('obj-schema-DictlayerdataDict', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdataDict();
-      var od = api.DictlayerdataDict.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DictlayerdataDict.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdataDict(od as api.DictlayerdataDict);
     });
   });
@@ -5086,7 +5150,9 @@
   unittest.group('obj-schema-Dictlayerdata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDictlayerdata();
-      var od = api.Dictlayerdata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Dictlayerdata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDictlayerdata(od as api.Dictlayerdata);
     });
   });
@@ -5095,8 +5161,9 @@
       'obj-schema-DiscoveryclustersClustersBannerWithContentContainer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiscoveryclustersClustersBannerWithContentContainer();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.DiscoveryclustersClustersBannerWithContentContainer.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiscoveryclustersClustersBannerWithContentContainer(
           od as api.DiscoveryclustersClustersBannerWithContentContainer);
     });
@@ -5105,7 +5172,9 @@
   unittest.group('obj-schema-DiscoveryclustersClusters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiscoveryclustersClusters();
-      var od = api.DiscoveryclustersClusters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiscoveryclustersClusters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiscoveryclustersClusters(od as api.DiscoveryclustersClusters);
     });
   });
@@ -5113,7 +5182,9 @@
   unittest.group('obj-schema-Discoveryclusters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiscoveryclusters();
-      var od = api.Discoveryclusters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Discoveryclusters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiscoveryclusters(od as api.Discoveryclusters);
     });
   });
@@ -5121,7 +5192,9 @@
   unittest.group('obj-schema-DownloadAccessRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDownloadAccessRestriction();
-      var od = api.DownloadAccessRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DownloadAccessRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDownloadAccessRestriction(od as api.DownloadAccessRestriction);
     });
   });
@@ -5129,7 +5202,9 @@
   unittest.group('obj-schema-DownloadAccesses', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDownloadAccesses();
-      var od = api.DownloadAccesses.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DownloadAccesses.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDownloadAccesses(od as api.DownloadAccesses);
     });
   });
@@ -5137,7 +5212,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -5145,7 +5221,9 @@
   unittest.group('obj-schema-FamilyInfoMembership', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFamilyInfoMembership();
-      var od = api.FamilyInfoMembership.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FamilyInfoMembership.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFamilyInfoMembership(od as api.FamilyInfoMembership);
     });
   });
@@ -5153,7 +5231,9 @@
   unittest.group('obj-schema-FamilyInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFamilyInfo();
-      var od = api.FamilyInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FamilyInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFamilyInfo(od as api.FamilyInfo);
     });
   });
@@ -5161,7 +5241,9 @@
   unittest.group('obj-schema-GeoAnnotationdata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeoAnnotationdata();
-      var od = api.GeoAnnotationdata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeoAnnotationdata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeoAnnotationdata(od as api.GeoAnnotationdata);
     });
   });
@@ -5169,7 +5251,9 @@
   unittest.group('obj-schema-GeolayerdataCommon', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeolayerdataCommon();
-      var od = api.GeolayerdataCommon.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeolayerdataCommon.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeolayerdataCommon(od as api.GeolayerdataCommon);
     });
   });
@@ -5177,7 +5261,9 @@
   unittest.group('obj-schema-GeolayerdataGeoViewportHi', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeolayerdataGeoViewportHi();
-      var od = api.GeolayerdataGeoViewportHi.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeolayerdataGeoViewportHi.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeolayerdataGeoViewportHi(od as api.GeolayerdataGeoViewportHi);
     });
   });
@@ -5185,7 +5271,9 @@
   unittest.group('obj-schema-GeolayerdataGeoViewportLo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeolayerdataGeoViewportLo();
-      var od = api.GeolayerdataGeoViewportLo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeolayerdataGeoViewportLo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeolayerdataGeoViewportLo(od as api.GeolayerdataGeoViewportLo);
     });
   });
@@ -5193,7 +5281,9 @@
   unittest.group('obj-schema-GeolayerdataGeoViewport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeolayerdataGeoViewport();
-      var od = api.GeolayerdataGeoViewport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeolayerdataGeoViewport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeolayerdataGeoViewport(od as api.GeolayerdataGeoViewport);
     });
   });
@@ -5201,7 +5291,9 @@
   unittest.group('obj-schema-GeolayerdataGeo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeolayerdataGeo();
-      var od = api.GeolayerdataGeo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeolayerdataGeo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeolayerdataGeo(od as api.GeolayerdataGeo);
     });
   });
@@ -5209,7 +5301,9 @@
   unittest.group('obj-schema-Geolayerdata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeolayerdata();
-      var od = api.Geolayerdata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Geolayerdata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeolayerdata(od as api.Geolayerdata);
     });
   });
@@ -5217,7 +5311,9 @@
   unittest.group('obj-schema-Layersummaries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLayersummaries();
-      var od = api.Layersummaries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Layersummaries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLayersummaries(od as api.Layersummaries);
     });
   });
@@ -5225,7 +5321,9 @@
   unittest.group('obj-schema-Layersummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLayersummary();
-      var od = api.Layersummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Layersummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLayersummary(od as api.Layersummary);
     });
   });
@@ -5233,7 +5331,9 @@
   unittest.group('obj-schema-MetadataItems', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadataItems();
-      var od = api.MetadataItems.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetadataItems.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetadataItems(od as api.MetadataItems);
     });
   });
@@ -5241,7 +5341,9 @@
   unittest.group('obj-schema-Metadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadata();
-      var od = api.Metadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metadata.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetadata(od as api.Metadata);
     });
   });
@@ -5249,7 +5351,9 @@
   unittest.group('obj-schema-Notification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotification();
-      var od = api.Notification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Notification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotification(od as api.Notification);
     });
   });
@@ -5257,7 +5361,9 @@
   unittest.group('obj-schema-OffersItemsItems', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOffersItemsItems();
-      var od = api.OffersItemsItems.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OffersItemsItems.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOffersItemsItems(od as api.OffersItemsItems);
     });
   });
@@ -5265,7 +5371,9 @@
   unittest.group('obj-schema-OffersItems', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOffersItems();
-      var od = api.OffersItems.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OffersItems.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOffersItems(od as api.OffersItems);
     });
   });
@@ -5273,7 +5381,9 @@
   unittest.group('obj-schema-Offers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOffers();
-      var od = api.Offers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Offers.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOffers(od as api.Offers);
     });
   });
@@ -5281,7 +5391,9 @@
   unittest.group('obj-schema-ReadingPosition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadingPosition();
-      var od = api.ReadingPosition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReadingPosition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReadingPosition(od as api.ReadingPosition);
     });
   });
@@ -5289,7 +5401,9 @@
   unittest.group('obj-schema-RequestAccessData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestAccessData();
-      var od = api.RequestAccessData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestAccessData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestAccessData(od as api.RequestAccessData);
     });
   });
@@ -5297,7 +5411,9 @@
   unittest.group('obj-schema-ReviewAuthor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReviewAuthor();
-      var od = api.ReviewAuthor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReviewAuthor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReviewAuthor(od as api.ReviewAuthor);
     });
   });
@@ -5305,7 +5421,9 @@
   unittest.group('obj-schema-ReviewSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReviewSource();
-      var od = api.ReviewSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReviewSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReviewSource(od as api.ReviewSource);
     });
   });
@@ -5313,7 +5431,9 @@
   unittest.group('obj-schema-Review', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReview();
-      var od = api.Review.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Review.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReview(od as api.Review);
     });
   });
@@ -5324,8 +5444,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildSeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.SeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo(od
           as api.SeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo);
     });
@@ -5336,9 +5457,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.SeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkSeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo(
           od as api.SeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo);
     });
@@ -5347,8 +5469,9 @@
   unittest.group('obj-schema-SeriesSeriesSeriesSubscriptionReleaseInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeriesSeriesSeriesSubscriptionReleaseInfo();
-      var od =
-          api.SeriesSeriesSeriesSubscriptionReleaseInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SeriesSeriesSeriesSubscriptionReleaseInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSeriesSeriesSeriesSubscriptionReleaseInfo(
           od as api.SeriesSeriesSeriesSubscriptionReleaseInfo);
     });
@@ -5357,7 +5480,9 @@
   unittest.group('obj-schema-SeriesSeries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeriesSeries();
-      var od = api.SeriesSeries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SeriesSeries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSeriesSeries(od as api.SeriesSeries);
     });
   });
@@ -5365,7 +5490,9 @@
   unittest.group('obj-schema-Series', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeries();
-      var od = api.Series.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Series.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSeries(od as api.Series);
     });
   });
@@ -5373,7 +5500,9 @@
   unittest.group('obj-schema-Seriesmembership', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeriesmembership();
-      var od = api.Seriesmembership.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Seriesmembership.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSeriesmembership(od as api.Seriesmembership);
     });
   });
@@ -5381,7 +5510,9 @@
   unittest.group('obj-schema-UsersettingsNotesExport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsersettingsNotesExport();
-      var od = api.UsersettingsNotesExport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsersettingsNotesExport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsersettingsNotesExport(od as api.UsersettingsNotesExport);
     });
   });
@@ -5389,8 +5520,9 @@
   unittest.group('obj-schema-UsersettingsNotificationMatchMyInterests', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsersettingsNotificationMatchMyInterests();
-      var od =
-          api.UsersettingsNotificationMatchMyInterests.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsersettingsNotificationMatchMyInterests.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsersettingsNotificationMatchMyInterests(
           od as api.UsersettingsNotificationMatchMyInterests);
     });
@@ -5399,7 +5531,9 @@
   unittest.group('obj-schema-UsersettingsNotificationMoreFromAuthors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsersettingsNotificationMoreFromAuthors();
-      var od = api.UsersettingsNotificationMoreFromAuthors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsersettingsNotificationMoreFromAuthors.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsersettingsNotificationMoreFromAuthors(
           od as api.UsersettingsNotificationMoreFromAuthors);
     });
@@ -5408,7 +5542,9 @@
   unittest.group('obj-schema-UsersettingsNotificationMoreFromSeries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsersettingsNotificationMoreFromSeries();
-      var od = api.UsersettingsNotificationMoreFromSeries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsersettingsNotificationMoreFromSeries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsersettingsNotificationMoreFromSeries(
           od as api.UsersettingsNotificationMoreFromSeries);
     });
@@ -5417,7 +5553,9 @@
   unittest.group('obj-schema-UsersettingsNotificationPriceDrop', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsersettingsNotificationPriceDrop();
-      var od = api.UsersettingsNotificationPriceDrop.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsersettingsNotificationPriceDrop.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsersettingsNotificationPriceDrop(
           od as api.UsersettingsNotificationPriceDrop);
     });
@@ -5426,8 +5564,9 @@
   unittest.group('obj-schema-UsersettingsNotificationRewardExpirations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsersettingsNotificationRewardExpirations();
-      var od =
-          api.UsersettingsNotificationRewardExpirations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsersettingsNotificationRewardExpirations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsersettingsNotificationRewardExpirations(
           od as api.UsersettingsNotificationRewardExpirations);
     });
@@ -5436,7 +5575,9 @@
   unittest.group('obj-schema-UsersettingsNotification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsersettingsNotification();
-      var od = api.UsersettingsNotification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsersettingsNotification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsersettingsNotification(od as api.UsersettingsNotification);
     });
   });
@@ -5444,7 +5585,9 @@
   unittest.group('obj-schema-Usersettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsersettings();
-      var od = api.Usersettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Usersettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsersettings(od as api.Usersettings);
     });
   });
@@ -5452,7 +5595,9 @@
   unittest.group('obj-schema-VolumeAccessInfoEpub', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeAccessInfoEpub();
-      var od = api.VolumeAccessInfoEpub.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeAccessInfoEpub.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeAccessInfoEpub(od as api.VolumeAccessInfoEpub);
     });
   });
@@ -5460,7 +5605,9 @@
   unittest.group('obj-schema-VolumeAccessInfoPdf', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeAccessInfoPdf();
-      var od = api.VolumeAccessInfoPdf.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeAccessInfoPdf.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeAccessInfoPdf(od as api.VolumeAccessInfoPdf);
     });
   });
@@ -5468,7 +5615,9 @@
   unittest.group('obj-schema-VolumeAccessInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeAccessInfo();
-      var od = api.VolumeAccessInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeAccessInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeAccessInfo(od as api.VolumeAccessInfo);
     });
   });
@@ -5476,7 +5625,9 @@
   unittest.group('obj-schema-VolumeLayerInfoLayers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeLayerInfoLayers();
-      var od = api.VolumeLayerInfoLayers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeLayerInfoLayers.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeLayerInfoLayers(od as api.VolumeLayerInfoLayers);
     });
   });
@@ -5484,7 +5635,9 @@
   unittest.group('obj-schema-VolumeLayerInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeLayerInfo();
-      var od = api.VolumeLayerInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeLayerInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeLayerInfo(od as api.VolumeLayerInfo);
     });
   });
@@ -5492,7 +5645,9 @@
   unittest.group('obj-schema-VolumeRecommendedInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeRecommendedInfo();
-      var od = api.VolumeRecommendedInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeRecommendedInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeRecommendedInfo(od as api.VolumeRecommendedInfo);
     });
   });
@@ -5500,7 +5655,9 @@
   unittest.group('obj-schema-VolumeSaleInfoListPrice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeSaleInfoListPrice();
-      var od = api.VolumeSaleInfoListPrice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeSaleInfoListPrice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeSaleInfoListPrice(od as api.VolumeSaleInfoListPrice);
     });
   });
@@ -5508,7 +5665,9 @@
   unittest.group('obj-schema-VolumeSaleInfoOffersListPrice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeSaleInfoOffersListPrice();
-      var od = api.VolumeSaleInfoOffersListPrice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeSaleInfoOffersListPrice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeSaleInfoOffersListPrice(
           od as api.VolumeSaleInfoOffersListPrice);
     });
@@ -5517,7 +5676,9 @@
   unittest.group('obj-schema-VolumeSaleInfoOffersRentalDuration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeSaleInfoOffersRentalDuration();
-      var od = api.VolumeSaleInfoOffersRentalDuration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeSaleInfoOffersRentalDuration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeSaleInfoOffersRentalDuration(
           od as api.VolumeSaleInfoOffersRentalDuration);
     });
@@ -5526,7 +5687,9 @@
   unittest.group('obj-schema-VolumeSaleInfoOffersRetailPrice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeSaleInfoOffersRetailPrice();
-      var od = api.VolumeSaleInfoOffersRetailPrice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeSaleInfoOffersRetailPrice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeSaleInfoOffersRetailPrice(
           od as api.VolumeSaleInfoOffersRetailPrice);
     });
@@ -5535,7 +5698,9 @@
   unittest.group('obj-schema-VolumeSaleInfoOffers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeSaleInfoOffers();
-      var od = api.VolumeSaleInfoOffers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeSaleInfoOffers.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeSaleInfoOffers(od as api.VolumeSaleInfoOffers);
     });
   });
@@ -5543,7 +5708,9 @@
   unittest.group('obj-schema-VolumeSaleInfoRetailPrice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeSaleInfoRetailPrice();
-      var od = api.VolumeSaleInfoRetailPrice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeSaleInfoRetailPrice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeSaleInfoRetailPrice(od as api.VolumeSaleInfoRetailPrice);
     });
   });
@@ -5551,7 +5718,9 @@
   unittest.group('obj-schema-VolumeSaleInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeSaleInfo();
-      var od = api.VolumeSaleInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeSaleInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeSaleInfo(od as api.VolumeSaleInfo);
     });
   });
@@ -5559,7 +5728,9 @@
   unittest.group('obj-schema-VolumeSearchInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeSearchInfo();
-      var od = api.VolumeSearchInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeSearchInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeSearchInfo(od as api.VolumeSearchInfo);
     });
   });
@@ -5567,7 +5738,9 @@
   unittest.group('obj-schema-VolumeUserInfoCopy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeUserInfoCopy();
-      var od = api.VolumeUserInfoCopy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeUserInfoCopy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeUserInfoCopy(od as api.VolumeUserInfoCopy);
     });
   });
@@ -5575,7 +5748,9 @@
   unittest.group('obj-schema-VolumeUserInfoFamilySharing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeUserInfoFamilySharing();
-      var od = api.VolumeUserInfoFamilySharing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeUserInfoFamilySharing.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeUserInfoFamilySharing(od as api.VolumeUserInfoFamilySharing);
     });
   });
@@ -5583,7 +5758,9 @@
   unittest.group('obj-schema-VolumeUserInfoRentalPeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeUserInfoRentalPeriod();
-      var od = api.VolumeUserInfoRentalPeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeUserInfoRentalPeriod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeUserInfoRentalPeriod(od as api.VolumeUserInfoRentalPeriod);
     });
   });
@@ -5591,7 +5768,9 @@
   unittest.group('obj-schema-VolumeUserInfoUserUploadedVolumeInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeUserInfoUserUploadedVolumeInfo();
-      var od = api.VolumeUserInfoUserUploadedVolumeInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeUserInfoUserUploadedVolumeInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeUserInfoUserUploadedVolumeInfo(
           od as api.VolumeUserInfoUserUploadedVolumeInfo);
     });
@@ -5600,7 +5779,9 @@
   unittest.group('obj-schema-VolumeUserInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeUserInfo();
-      var od = api.VolumeUserInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeUserInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeUserInfo(od as api.VolumeUserInfo);
     });
   });
@@ -5608,7 +5789,9 @@
   unittest.group('obj-schema-VolumeVolumeInfoDimensions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeVolumeInfoDimensions();
-      var od = api.VolumeVolumeInfoDimensions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeVolumeInfoDimensions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeVolumeInfoDimensions(od as api.VolumeVolumeInfoDimensions);
     });
   });
@@ -5616,7 +5799,9 @@
   unittest.group('obj-schema-VolumeVolumeInfoImageLinks', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeVolumeInfoImageLinks();
-      var od = api.VolumeVolumeInfoImageLinks.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeVolumeInfoImageLinks.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeVolumeInfoImageLinks(od as api.VolumeVolumeInfoImageLinks);
     });
   });
@@ -5624,7 +5809,9 @@
   unittest.group('obj-schema-VolumeVolumeInfoIndustryIdentifiers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeVolumeInfoIndustryIdentifiers();
-      var od = api.VolumeVolumeInfoIndustryIdentifiers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeVolumeInfoIndustryIdentifiers.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeVolumeInfoIndustryIdentifiers(
           od as api.VolumeVolumeInfoIndustryIdentifiers);
     });
@@ -5633,7 +5820,9 @@
   unittest.group('obj-schema-VolumeVolumeInfoPanelizationSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeVolumeInfoPanelizationSummary();
-      var od = api.VolumeVolumeInfoPanelizationSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeVolumeInfoPanelizationSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeVolumeInfoPanelizationSummary(
           od as api.VolumeVolumeInfoPanelizationSummary);
     });
@@ -5642,7 +5831,9 @@
   unittest.group('obj-schema-VolumeVolumeInfoReadingModes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeVolumeInfoReadingModes();
-      var od = api.VolumeVolumeInfoReadingModes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeVolumeInfoReadingModes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeVolumeInfoReadingModes(od as api.VolumeVolumeInfoReadingModes);
     });
   });
@@ -5650,7 +5841,9 @@
   unittest.group('obj-schema-VolumeVolumeInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeVolumeInfo();
-      var od = api.VolumeVolumeInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeVolumeInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeVolumeInfo(od as api.VolumeVolumeInfo);
     });
   });
@@ -5658,7 +5851,9 @@
   unittest.group('obj-schema-Volume', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolume();
-      var od = api.Volume.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Volume.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVolume(od as api.Volume);
     });
   });
@@ -5666,7 +5861,9 @@
   unittest.group('obj-schema-Volume2', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolume2();
-      var od = api.Volume2.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Volume2.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVolume2(od as api.Volume2);
     });
   });
@@ -5674,7 +5871,9 @@
   unittest.group('obj-schema-VolumeannotationContentRanges', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeannotationContentRanges();
-      var od = api.VolumeannotationContentRanges.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeannotationContentRanges.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeannotationContentRanges(
           od as api.VolumeannotationContentRanges);
     });
@@ -5683,7 +5882,9 @@
   unittest.group('obj-schema-Volumeannotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeannotation();
-      var od = api.Volumeannotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Volumeannotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeannotation(od as api.Volumeannotation);
     });
   });
@@ -5691,7 +5892,9 @@
   unittest.group('obj-schema-Volumeannotations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeannotations();
-      var od = api.Volumeannotations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Volumeannotations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeannotations(od as api.Volumeannotations);
     });
   });
@@ -5699,7 +5902,9 @@
   unittest.group('obj-schema-Volumes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumes();
-      var od = api.Volumes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Volumes.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVolumes(od as api.Volumes);
     });
   });
@@ -5707,7 +5912,9 @@
   unittest.group('obj-schema-VolumeseriesinfoVolumeSeriesIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeseriesinfoVolumeSeriesIssue();
-      var od = api.VolumeseriesinfoVolumeSeriesIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeseriesinfoVolumeSeriesIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeseriesinfoVolumeSeriesIssue(
           od as api.VolumeseriesinfoVolumeSeriesIssue);
     });
@@ -5716,7 +5923,9 @@
   unittest.group('obj-schema-VolumeseriesinfoVolumeSeries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeseriesinfoVolumeSeries();
-      var od = api.VolumeseriesinfoVolumeSeries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeseriesinfoVolumeSeries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeseriesinfoVolumeSeries(od as api.VolumeseriesinfoVolumeSeries);
     });
   });
@@ -5724,7 +5933,9 @@
   unittest.group('obj-schema-Volumeseriesinfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeseriesinfo();
-      var od = api.Volumeseriesinfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Volumeseriesinfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeseriesinfo(od as api.Volumeseriesinfo);
     });
   });
diff --git a/generated/googleapis/test/calendar/v3_test.dart b/generated/googleapis/test/calendar/v3_test.dart
index a65c52c..2ca1593 100644
--- a/generated/googleapis/test/calendar/v3_test.dart
+++ b/generated/googleapis/test/calendar/v3_test.dart
@@ -2086,7 +2086,8 @@
   unittest.group('obj-schema-Acl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcl();
-      var od = api.Acl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Acl.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAcl(od as api.Acl);
     });
   });
@@ -2094,7 +2095,9 @@
   unittest.group('obj-schema-AclRuleScope', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAclRuleScope();
-      var od = api.AclRuleScope.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AclRuleScope.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAclRuleScope(od as api.AclRuleScope);
     });
   });
@@ -2102,7 +2105,9 @@
   unittest.group('obj-schema-AclRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAclRule();
-      var od = api.AclRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AclRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAclRule(od as api.AclRule);
     });
   });
@@ -2110,7 +2115,9 @@
   unittest.group('obj-schema-Calendar', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCalendar();
-      var od = api.Calendar.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Calendar.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCalendar(od as api.Calendar);
     });
   });
@@ -2118,7 +2125,9 @@
   unittest.group('obj-schema-CalendarList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCalendarList();
-      var od = api.CalendarList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CalendarList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCalendarList(od as api.CalendarList);
     });
   });
@@ -2126,7 +2135,9 @@
   unittest.group('obj-schema-CalendarListEntryNotificationSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCalendarListEntryNotificationSettings();
-      var od = api.CalendarListEntryNotificationSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CalendarListEntryNotificationSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCalendarListEntryNotificationSettings(
           od as api.CalendarListEntryNotificationSettings);
     });
@@ -2135,7 +2146,9 @@
   unittest.group('obj-schema-CalendarListEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCalendarListEntry();
-      var od = api.CalendarListEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CalendarListEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCalendarListEntry(od as api.CalendarListEntry);
     });
   });
@@ -2143,7 +2156,9 @@
   unittest.group('obj-schema-CalendarNotification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCalendarNotification();
-      var od = api.CalendarNotification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CalendarNotification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCalendarNotification(od as api.CalendarNotification);
     });
   });
@@ -2151,7 +2166,9 @@
   unittest.group('obj-schema-Channel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannel();
-      var od = api.Channel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Channel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChannel(od as api.Channel);
     });
   });
@@ -2159,7 +2176,9 @@
   unittest.group('obj-schema-ColorDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColorDefinition();
-      var od = api.ColorDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ColorDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkColorDefinition(od as api.ColorDefinition);
     });
   });
@@ -2167,7 +2186,9 @@
   unittest.group('obj-schema-Colors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColors();
-      var od = api.Colors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Colors.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColors(od as api.Colors);
     });
   });
@@ -2175,7 +2196,9 @@
   unittest.group('obj-schema-ConferenceData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConferenceData();
-      var od = api.ConferenceData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConferenceData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConferenceData(od as api.ConferenceData);
     });
   });
@@ -2183,7 +2206,9 @@
   unittest.group('obj-schema-ConferenceParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConferenceParameters();
-      var od = api.ConferenceParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConferenceParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConferenceParameters(od as api.ConferenceParameters);
     });
   });
@@ -2191,7 +2216,9 @@
   unittest.group('obj-schema-ConferenceParametersAddOnParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConferenceParametersAddOnParameters();
-      var od = api.ConferenceParametersAddOnParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConferenceParametersAddOnParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConferenceParametersAddOnParameters(
           od as api.ConferenceParametersAddOnParameters);
     });
@@ -2200,7 +2227,9 @@
   unittest.group('obj-schema-ConferenceProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConferenceProperties();
-      var od = api.ConferenceProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConferenceProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConferenceProperties(od as api.ConferenceProperties);
     });
   });
@@ -2208,7 +2237,9 @@
   unittest.group('obj-schema-ConferenceRequestStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConferenceRequestStatus();
-      var od = api.ConferenceRequestStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConferenceRequestStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConferenceRequestStatus(od as api.ConferenceRequestStatus);
     });
   });
@@ -2216,7 +2247,9 @@
   unittest.group('obj-schema-ConferenceSolution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConferenceSolution();
-      var od = api.ConferenceSolution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConferenceSolution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConferenceSolution(od as api.ConferenceSolution);
     });
   });
@@ -2224,7 +2257,9 @@
   unittest.group('obj-schema-ConferenceSolutionKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConferenceSolutionKey();
-      var od = api.ConferenceSolutionKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConferenceSolutionKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConferenceSolutionKey(od as api.ConferenceSolutionKey);
     });
   });
@@ -2232,7 +2267,9 @@
   unittest.group('obj-schema-CreateConferenceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateConferenceRequest();
-      var od = api.CreateConferenceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateConferenceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateConferenceRequest(od as api.CreateConferenceRequest);
     });
   });
@@ -2240,7 +2277,9 @@
   unittest.group('obj-schema-EntryPoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntryPoint();
-      var od = api.EntryPoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EntryPoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEntryPoint(od as api.EntryPoint);
     });
   });
@@ -2248,7 +2287,8 @@
   unittest.group('obj-schema-Error', () {
     unittest.test('to-json--from-json', () async {
       var o = buildError();
-      var od = api.Error.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Error.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkError(od as api.Error);
     });
   });
@@ -2256,7 +2296,9 @@
   unittest.group('obj-schema-EventCreator', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventCreator();
-      var od = api.EventCreator.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventCreator.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventCreator(od as api.EventCreator);
     });
   });
@@ -2264,7 +2306,9 @@
   unittest.group('obj-schema-EventExtendedProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventExtendedProperties();
-      var od = api.EventExtendedProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventExtendedProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventExtendedProperties(od as api.EventExtendedProperties);
     });
   });
@@ -2272,7 +2316,9 @@
   unittest.group('obj-schema-EventGadget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventGadget();
-      var od = api.EventGadget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventGadget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventGadget(od as api.EventGadget);
     });
   });
@@ -2280,7 +2326,9 @@
   unittest.group('obj-schema-EventOrganizer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventOrganizer();
-      var od = api.EventOrganizer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventOrganizer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventOrganizer(od as api.EventOrganizer);
     });
   });
@@ -2288,7 +2336,9 @@
   unittest.group('obj-schema-EventReminders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventReminders();
-      var od = api.EventReminders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventReminders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventReminders(od as api.EventReminders);
     });
   });
@@ -2296,7 +2346,9 @@
   unittest.group('obj-schema-EventSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventSource();
-      var od = api.EventSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventSource(od as api.EventSource);
     });
   });
@@ -2304,7 +2356,8 @@
   unittest.group('obj-schema-Event', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEvent();
-      var od = api.Event.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Event.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEvent(od as api.Event);
     });
   });
@@ -2312,7 +2365,9 @@
   unittest.group('obj-schema-EventAttachment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventAttachment();
-      var od = api.EventAttachment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventAttachment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventAttachment(od as api.EventAttachment);
     });
   });
@@ -2320,7 +2375,9 @@
   unittest.group('obj-schema-EventAttendee', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventAttendee();
-      var od = api.EventAttendee.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventAttendee.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventAttendee(od as api.EventAttendee);
     });
   });
@@ -2328,7 +2385,9 @@
   unittest.group('obj-schema-EventDateTime', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventDateTime();
-      var od = api.EventDateTime.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventDateTime.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventDateTime(od as api.EventDateTime);
     });
   });
@@ -2336,7 +2395,9 @@
   unittest.group('obj-schema-EventReminder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventReminder();
-      var od = api.EventReminder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventReminder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventReminder(od as api.EventReminder);
     });
   });
@@ -2344,7 +2405,9 @@
   unittest.group('obj-schema-Events', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEvents();
-      var od = api.Events.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Events.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEvents(od as api.Events);
     });
   });
@@ -2352,7 +2415,9 @@
   unittest.group('obj-schema-FreeBusyCalendar', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFreeBusyCalendar();
-      var od = api.FreeBusyCalendar.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FreeBusyCalendar.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFreeBusyCalendar(od as api.FreeBusyCalendar);
     });
   });
@@ -2360,7 +2425,9 @@
   unittest.group('obj-schema-FreeBusyGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFreeBusyGroup();
-      var od = api.FreeBusyGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FreeBusyGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFreeBusyGroup(od as api.FreeBusyGroup);
     });
   });
@@ -2368,7 +2435,9 @@
   unittest.group('obj-schema-FreeBusyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFreeBusyRequest();
-      var od = api.FreeBusyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FreeBusyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFreeBusyRequest(od as api.FreeBusyRequest);
     });
   });
@@ -2376,7 +2445,9 @@
   unittest.group('obj-schema-FreeBusyRequestItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFreeBusyRequestItem();
-      var od = api.FreeBusyRequestItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FreeBusyRequestItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFreeBusyRequestItem(od as api.FreeBusyRequestItem);
     });
   });
@@ -2384,7 +2455,9 @@
   unittest.group('obj-schema-FreeBusyResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFreeBusyResponse();
-      var od = api.FreeBusyResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FreeBusyResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFreeBusyResponse(od as api.FreeBusyResponse);
     });
   });
@@ -2392,7 +2465,9 @@
   unittest.group('obj-schema-Setting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetting();
-      var od = api.Setting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Setting.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSetting(od as api.Setting);
     });
   });
@@ -2400,7 +2475,9 @@
   unittest.group('obj-schema-Settings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettings();
-      var od = api.Settings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Settings.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSettings(od as api.Settings);
     });
   });
@@ -2408,7 +2485,9 @@
   unittest.group('obj-schema-TimePeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimePeriod();
-      var od = api.TimePeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimePeriod.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimePeriod(od as api.TimePeriod);
     });
   });
diff --git a/generated/googleapis/test/chat/v1_test.dart b/generated/googleapis/test/chat/v1_test.dart
index f23b923..3da32fa 100644
--- a/generated/googleapis/test/chat/v1_test.dart
+++ b/generated/googleapis/test/chat/v1_test.dart
@@ -1140,7 +1140,9 @@
   unittest.group('obj-schema-ActionParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActionParameter();
-      var od = api.ActionParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActionParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActionParameter(od as api.ActionParameter);
     });
   });
@@ -1148,7 +1150,9 @@
   unittest.group('obj-schema-ActionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActionResponse();
-      var od = api.ActionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActionResponse(od as api.ActionResponse);
     });
   });
@@ -1156,7 +1160,9 @@
   unittest.group('obj-schema-Annotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotation();
-      var od = api.Annotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Annotation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAnnotation(od as api.Annotation);
     });
   });
@@ -1164,7 +1170,9 @@
   unittest.group('obj-schema-Attachment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttachment();
-      var od = api.Attachment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Attachment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAttachment(od as api.Attachment);
     });
   });
@@ -1172,7 +1180,9 @@
   unittest.group('obj-schema-AttachmentDataRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttachmentDataRef();
-      var od = api.AttachmentDataRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttachmentDataRef.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttachmentDataRef(od as api.AttachmentDataRef);
     });
   });
@@ -1180,7 +1190,9 @@
   unittest.group('obj-schema-Button', () {
     unittest.test('to-json--from-json', () async {
       var o = buildButton();
-      var od = api.Button.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Button.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkButton(od as api.Button);
     });
   });
@@ -1188,7 +1200,8 @@
   unittest.group('obj-schema-Card', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCard();
-      var od = api.Card.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Card.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCard(od as api.Card);
     });
   });
@@ -1196,7 +1209,9 @@
   unittest.group('obj-schema-CardAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCardAction();
-      var od = api.CardAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CardAction.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCardAction(od as api.CardAction);
     });
   });
@@ -1204,7 +1219,9 @@
   unittest.group('obj-schema-CardHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCardHeader();
-      var od = api.CardHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CardHeader.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCardHeader(od as api.CardHeader);
     });
   });
@@ -1212,7 +1229,9 @@
   unittest.group('obj-schema-DeprecatedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeprecatedEvent();
-      var od = api.DeprecatedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeprecatedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeprecatedEvent(od as api.DeprecatedEvent);
     });
   });
@@ -1220,7 +1239,9 @@
   unittest.group('obj-schema-DriveDataRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveDataRef();
-      var od = api.DriveDataRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveDataRef.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveDataRef(od as api.DriveDataRef);
     });
   });
@@ -1228,7 +1249,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1236,7 +1258,9 @@
   unittest.group('obj-schema-FormAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFormAction();
-      var od = api.FormAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FormAction.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFormAction(od as api.FormAction);
     });
   });
@@ -1244,7 +1268,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -1252,7 +1277,9 @@
   unittest.group('obj-schema-ImageButton', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageButton();
-      var od = api.ImageButton.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageButton.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageButton(od as api.ImageButton);
     });
   });
@@ -1260,7 +1287,9 @@
   unittest.group('obj-schema-KeyValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyValue();
-      var od = api.KeyValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.KeyValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKeyValue(od as api.KeyValue);
     });
   });
@@ -1268,7 +1297,9 @@
   unittest.group('obj-schema-ListMembershipsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMembershipsResponse();
-      var od = api.ListMembershipsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMembershipsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMembershipsResponse(od as api.ListMembershipsResponse);
     });
   });
@@ -1276,7 +1307,9 @@
   unittest.group('obj-schema-ListSpacesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSpacesResponse();
-      var od = api.ListSpacesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSpacesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSpacesResponse(od as api.ListSpacesResponse);
     });
   });
@@ -1284,7 +1317,8 @@
   unittest.group('obj-schema-Media', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMedia();
-      var od = api.Media.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Media.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMedia(od as api.Media);
     });
   });
@@ -1292,7 +1326,9 @@
   unittest.group('obj-schema-Membership', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembership();
-      var od = api.Membership.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Membership.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMembership(od as api.Membership);
     });
   });
@@ -1300,7 +1336,9 @@
   unittest.group('obj-schema-Message', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMessage();
-      var od = api.Message.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Message.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMessage(od as api.Message);
     });
   });
@@ -1308,7 +1346,9 @@
   unittest.group('obj-schema-OnClick', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOnClick();
-      var od = api.OnClick.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OnClick.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOnClick(od as api.OnClick);
     });
   });
@@ -1316,7 +1356,9 @@
   unittest.group('obj-schema-OpenLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOpenLink();
-      var od = api.OpenLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OpenLink.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOpenLink(od as api.OpenLink);
     });
   });
@@ -1324,7 +1366,9 @@
   unittest.group('obj-schema-Section', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSection();
-      var od = api.Section.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Section.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSection(od as api.Section);
     });
   });
@@ -1332,7 +1376,9 @@
   unittest.group('obj-schema-SlashCommand', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSlashCommand();
-      var od = api.SlashCommand.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SlashCommand.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSlashCommand(od as api.SlashCommand);
     });
   });
@@ -1340,7 +1386,9 @@
   unittest.group('obj-schema-SlashCommandMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSlashCommandMetadata();
-      var od = api.SlashCommandMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SlashCommandMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSlashCommandMetadata(od as api.SlashCommandMetadata);
     });
   });
@@ -1348,7 +1396,8 @@
   unittest.group('obj-schema-Space', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpace();
-      var od = api.Space.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Space.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSpace(od as api.Space);
     });
   });
@@ -1356,7 +1405,9 @@
   unittest.group('obj-schema-TextButton', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextButton();
-      var od = api.TextButton.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextButton.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextButton(od as api.TextButton);
     });
   });
@@ -1364,7 +1415,9 @@
   unittest.group('obj-schema-TextParagraph', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextParagraph();
-      var od = api.TextParagraph.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextParagraph.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextParagraph(od as api.TextParagraph);
     });
   });
@@ -1372,7 +1425,9 @@
   unittest.group('obj-schema-Thread', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThread();
-      var od = api.Thread.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Thread.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkThread(od as api.Thread);
     });
   });
@@ -1380,7 +1435,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
@@ -1388,7 +1444,9 @@
   unittest.group('obj-schema-UserMentionMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserMentionMetadata();
-      var od = api.UserMentionMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserMentionMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserMentionMetadata(od as api.UserMentionMetadata);
     });
   });
@@ -1396,7 +1454,9 @@
   unittest.group('obj-schema-WidgetMarkup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWidgetMarkup();
-      var od = api.WidgetMarkup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WidgetMarkup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWidgetMarkup(od as api.WidgetMarkup);
     });
   });
diff --git a/generated/googleapis/test/chromemanagement/v1_test.dart b/generated/googleapis/test/chromemanagement/v1_test.dart
index 3f2dab3..b0de731 100644
--- a/generated/googleapis/test/chromemanagement/v1_test.dart
+++ b/generated/googleapis/test/chromemanagement/v1_test.dart
@@ -328,7 +328,9 @@
   unittest.group('obj-schema-GoogleChromeManagementV1BrowserVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleChromeManagementV1BrowserVersion();
-      var od = api.GoogleChromeManagementV1BrowserVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleChromeManagementV1BrowserVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleChromeManagementV1BrowserVersion(
           od as api.GoogleChromeManagementV1BrowserVersion);
     });
@@ -338,8 +340,9 @@
       'obj-schema-GoogleChromeManagementV1CountChromeVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleChromeManagementV1CountChromeVersionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleChromeManagementV1CountChromeVersionsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleChromeManagementV1CountChromeVersionsResponse(
           od as api.GoogleChromeManagementV1CountChromeVersionsResponse);
     });
@@ -349,8 +352,9 @@
       'obj-schema-GoogleChromeManagementV1CountInstalledAppsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleChromeManagementV1CountInstalledAppsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleChromeManagementV1CountInstalledAppsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleChromeManagementV1CountInstalledAppsResponse(
           od as api.GoogleChromeManagementV1CountInstalledAppsResponse);
     });
@@ -359,7 +363,9 @@
   unittest.group('obj-schema-GoogleChromeManagementV1Device', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleChromeManagementV1Device();
-      var od = api.GoogleChromeManagementV1Device.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleChromeManagementV1Device.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleChromeManagementV1Device(
           od as api.GoogleChromeManagementV1Device);
     });
@@ -369,9 +375,10 @@
       'obj-schema-GoogleChromeManagementV1FindInstalledAppDevicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleChromeManagementV1FindInstalledAppDevicesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleChromeManagementV1FindInstalledAppDevicesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleChromeManagementV1FindInstalledAppDevicesResponse(
           od as api.GoogleChromeManagementV1FindInstalledAppDevicesResponse);
     });
@@ -380,7 +387,9 @@
   unittest.group('obj-schema-GoogleChromeManagementV1InstalledApp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleChromeManagementV1InstalledApp();
-      var od = api.GoogleChromeManagementV1InstalledApp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleChromeManagementV1InstalledApp.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleChromeManagementV1InstalledApp(
           od as api.GoogleChromeManagementV1InstalledApp);
     });
diff --git a/generated/googleapis/test/chromeuxreport/v1_test.dart b/generated/googleapis/test/chromeuxreport/v1_test.dart
index c5fc05b..718e785 100644
--- a/generated/googleapis/test/chromeuxreport/v1_test.dart
+++ b/generated/googleapis/test/chromeuxreport/v1_test.dart
@@ -338,7 +338,8 @@
   unittest.group('obj-schema-Bin', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBin();
-      var od = api.Bin.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Bin.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBin(od as api.Bin);
     });
   });
@@ -346,7 +347,8 @@
   unittest.group('obj-schema-Key', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKey();
-      var od = api.Key.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Key.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKey(od as api.Key);
     });
   });
@@ -354,7 +356,9 @@
   unittest.group('obj-schema-Metric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetric();
-      var od = api.Metric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metric.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetric(od as api.Metric);
     });
   });
@@ -362,7 +366,9 @@
   unittest.group('obj-schema-Percentiles', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPercentiles();
-      var od = api.Percentiles.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Percentiles.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPercentiles(od as api.Percentiles);
     });
   });
@@ -370,7 +376,9 @@
   unittest.group('obj-schema-QueryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryRequest();
-      var od = api.QueryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryRequest(od as api.QueryRequest);
     });
   });
@@ -378,7 +386,9 @@
   unittest.group('obj-schema-QueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryResponse();
-      var od = api.QueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryResponse(od as api.QueryResponse);
     });
   });
@@ -386,7 +396,9 @@
   unittest.group('obj-schema-Record', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecord();
-      var od = api.Record.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Record.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRecord(od as api.Record);
     });
   });
@@ -394,7 +406,9 @@
   unittest.group('obj-schema-UrlNormalization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlNormalization();
-      var od = api.UrlNormalization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlNormalization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlNormalization(od as api.UrlNormalization);
     });
   });
diff --git a/generated/googleapis/test/civicinfo/v2_test.dart b/generated/googleapis/test/civicinfo/v2_test.dart
index 4e1fca5..666de8e 100644
--- a/generated/googleapis/test/civicinfo/v2_test.dart
+++ b/generated/googleapis/test/civicinfo/v2_test.dart
@@ -1509,7 +1509,9 @@
   unittest.group('obj-schema-AdministrationRegion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministrationRegion();
-      var od = api.AdministrationRegion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdministrationRegion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministrationRegion(od as api.AdministrationRegion);
     });
   });
@@ -1517,7 +1519,9 @@
   unittest.group('obj-schema-AdministrativeBody', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministrativeBody();
-      var od = api.AdministrativeBody.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdministrativeBody.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministrativeBody(od as api.AdministrativeBody);
     });
   });
@@ -1525,7 +1529,9 @@
   unittest.group('obj-schema-Candidate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCandidate();
-      var od = api.Candidate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Candidate.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCandidate(od as api.Candidate);
     });
   });
@@ -1533,7 +1539,9 @@
   unittest.group('obj-schema-Channel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannel();
-      var od = api.Channel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Channel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChannel(od as api.Channel);
     });
   });
@@ -1541,7 +1549,9 @@
   unittest.group('obj-schema-Contest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContest();
-      var od = api.Contest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Contest.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkContest(od as api.Contest);
     });
   });
@@ -1549,7 +1559,9 @@
   unittest.group('obj-schema-DivisionSearchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDivisionSearchResponse();
-      var od = api.DivisionSearchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DivisionSearchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDivisionSearchResponse(od as api.DivisionSearchResponse);
     });
   });
@@ -1557,7 +1569,9 @@
   unittest.group('obj-schema-DivisionSearchResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDivisionSearchResult();
-      var od = api.DivisionSearchResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DivisionSearchResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDivisionSearchResult(od as api.DivisionSearchResult);
     });
   });
@@ -1565,7 +1579,9 @@
   unittest.group('obj-schema-Election', () {
     unittest.test('to-json--from-json', () async {
       var o = buildElection();
-      var od = api.Election.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Election.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkElection(od as api.Election);
     });
   });
@@ -1573,7 +1589,9 @@
   unittest.group('obj-schema-ElectionOfficial', () {
     unittest.test('to-json--from-json', () async {
       var o = buildElectionOfficial();
-      var od = api.ElectionOfficial.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ElectionOfficial.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkElectionOfficial(od as api.ElectionOfficial);
     });
   });
@@ -1581,7 +1599,9 @@
   unittest.group('obj-schema-ElectionsQueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildElectionsQueryResponse();
-      var od = api.ElectionsQueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ElectionsQueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkElectionsQueryResponse(od as api.ElectionsQueryResponse);
     });
   });
@@ -1589,7 +1609,9 @@
   unittest.group('obj-schema-ElectoralDistrict', () {
     unittest.test('to-json--from-json', () async {
       var o = buildElectoralDistrict();
-      var od = api.ElectoralDistrict.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ElectoralDistrict.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkElectoralDistrict(od as api.ElectoralDistrict);
     });
   });
@@ -1597,7 +1619,9 @@
   unittest.group('obj-schema-GeographicDivision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeographicDivision();
-      var od = api.GeographicDivision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeographicDivision.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeographicDivision(od as api.GeographicDivision);
     });
   });
@@ -1605,7 +1629,9 @@
   unittest.group('obj-schema-Office', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOffice();
-      var od = api.Office.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Office.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOffice(od as api.Office);
     });
   });
@@ -1613,7 +1639,9 @@
   unittest.group('obj-schema-Official', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOfficial();
-      var od = api.Official.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Official.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOfficial(od as api.Official);
     });
   });
@@ -1621,7 +1649,9 @@
   unittest.group('obj-schema-PollingLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPollingLocation();
-      var od = api.PollingLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PollingLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPollingLocation(od as api.PollingLocation);
     });
   });
@@ -1629,7 +1659,9 @@
   unittest.group('obj-schema-RepresentativeInfoData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepresentativeInfoData();
-      var od = api.RepresentativeInfoData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepresentativeInfoData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepresentativeInfoData(od as api.RepresentativeInfoData);
     });
   });
@@ -1637,7 +1669,9 @@
   unittest.group('obj-schema-RepresentativeInfoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepresentativeInfoResponse();
-      var od = api.RepresentativeInfoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepresentativeInfoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepresentativeInfoResponse(od as api.RepresentativeInfoResponse);
     });
   });
@@ -1645,7 +1679,9 @@
   unittest.group('obj-schema-SimpleAddressType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSimpleAddressType();
-      var od = api.SimpleAddressType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SimpleAddressType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSimpleAddressType(od as api.SimpleAddressType);
     });
   });
@@ -1653,7 +1689,9 @@
   unittest.group('obj-schema-Source', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSource();
-      var od = api.Source.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Source.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSource(od as api.Source);
     });
   });
@@ -1661,7 +1699,9 @@
   unittest.group('obj-schema-VoterInfoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVoterInfoResponse();
-      var od = api.VoterInfoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VoterInfoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVoterInfoResponse(od as api.VoterInfoResponse);
     });
   });
diff --git a/generated/googleapis/test/classroom/v1_test.dart b/generated/googleapis/test/classroom/v1_test.dart
index 2b2494f..5f8784a 100644
--- a/generated/googleapis/test/classroom/v1_test.dart
+++ b/generated/googleapis/test/classroom/v1_test.dart
@@ -2416,7 +2416,9 @@
   unittest.group('obj-schema-Announcement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnouncement();
-      var od = api.Announcement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Announcement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnouncement(od as api.Announcement);
     });
   });
@@ -2424,7 +2426,9 @@
   unittest.group('obj-schema-Assignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssignment();
-      var od = api.Assignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Assignment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAssignment(od as api.Assignment);
     });
   });
@@ -2432,7 +2436,9 @@
   unittest.group('obj-schema-AssignmentSubmission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssignmentSubmission();
-      var od = api.AssignmentSubmission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AssignmentSubmission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAssignmentSubmission(od as api.AssignmentSubmission);
     });
   });
@@ -2440,7 +2446,9 @@
   unittest.group('obj-schema-Attachment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttachment();
-      var od = api.Attachment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Attachment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAttachment(od as api.Attachment);
     });
   });
@@ -2448,7 +2456,9 @@
   unittest.group('obj-schema-CloudPubsubTopic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudPubsubTopic();
-      var od = api.CloudPubsubTopic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudPubsubTopic.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudPubsubTopic(od as api.CloudPubsubTopic);
     });
   });
@@ -2456,7 +2466,9 @@
   unittest.group('obj-schema-Course', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCourse();
-      var od = api.Course.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Course.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCourse(od as api.Course);
     });
   });
@@ -2464,7 +2476,9 @@
   unittest.group('obj-schema-CourseAlias', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCourseAlias();
-      var od = api.CourseAlias.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CourseAlias.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCourseAlias(od as api.CourseAlias);
     });
   });
@@ -2472,7 +2486,9 @@
   unittest.group('obj-schema-CourseMaterial', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCourseMaterial();
-      var od = api.CourseMaterial.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CourseMaterial.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCourseMaterial(od as api.CourseMaterial);
     });
   });
@@ -2480,7 +2496,9 @@
   unittest.group('obj-schema-CourseMaterialSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCourseMaterialSet();
-      var od = api.CourseMaterialSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CourseMaterialSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCourseMaterialSet(od as api.CourseMaterialSet);
     });
   });
@@ -2488,7 +2506,9 @@
   unittest.group('obj-schema-CourseRosterChangesInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCourseRosterChangesInfo();
-      var od = api.CourseRosterChangesInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CourseRosterChangesInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCourseRosterChangesInfo(od as api.CourseRosterChangesInfo);
     });
   });
@@ -2496,7 +2516,9 @@
   unittest.group('obj-schema-CourseWork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCourseWork();
-      var od = api.CourseWork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CourseWork.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCourseWork(od as api.CourseWork);
     });
   });
@@ -2504,7 +2526,9 @@
   unittest.group('obj-schema-CourseWorkChangesInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCourseWorkChangesInfo();
-      var od = api.CourseWorkChangesInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CourseWorkChangesInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCourseWorkChangesInfo(od as api.CourseWorkChangesInfo);
     });
   });
@@ -2512,7 +2536,9 @@
   unittest.group('obj-schema-CourseWorkMaterial', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCourseWorkMaterial();
-      var od = api.CourseWorkMaterial.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CourseWorkMaterial.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCourseWorkMaterial(od as api.CourseWorkMaterial);
     });
   });
@@ -2520,7 +2546,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -2528,7 +2555,9 @@
   unittest.group('obj-schema-DriveFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveFile();
-      var od = api.DriveFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DriveFile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDriveFile(od as api.DriveFile);
     });
   });
@@ -2536,7 +2565,9 @@
   unittest.group('obj-schema-DriveFolder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveFolder();
-      var od = api.DriveFolder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveFolder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveFolder(od as api.DriveFolder);
     });
   });
@@ -2544,7 +2575,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2552,7 +2584,8 @@
   unittest.group('obj-schema-Feed', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeed();
-      var od = api.Feed.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Feed.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFeed(od as api.Feed);
     });
   });
@@ -2560,7 +2593,8 @@
   unittest.group('obj-schema-Form', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForm();
-      var od = api.Form.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Form.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkForm(od as api.Form);
     });
   });
@@ -2568,7 +2602,9 @@
   unittest.group('obj-schema-GlobalPermission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlobalPermission();
-      var od = api.GlobalPermission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GlobalPermission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGlobalPermission(od as api.GlobalPermission);
     });
   });
@@ -2576,7 +2612,9 @@
   unittest.group('obj-schema-GradeHistory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGradeHistory();
-      var od = api.GradeHistory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GradeHistory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGradeHistory(od as api.GradeHistory);
     });
   });
@@ -2584,7 +2622,9 @@
   unittest.group('obj-schema-Guardian', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGuardian();
-      var od = api.Guardian.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Guardian.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGuardian(od as api.Guardian);
     });
   });
@@ -2592,7 +2632,9 @@
   unittest.group('obj-schema-GuardianInvitation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGuardianInvitation();
-      var od = api.GuardianInvitation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GuardianInvitation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGuardianInvitation(od as api.GuardianInvitation);
     });
   });
@@ -2600,7 +2642,9 @@
   unittest.group('obj-schema-IndividualStudentsOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIndividualStudentsOptions();
-      var od = api.IndividualStudentsOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IndividualStudentsOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIndividualStudentsOptions(od as api.IndividualStudentsOptions);
     });
   });
@@ -2608,7 +2652,9 @@
   unittest.group('obj-schema-Invitation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInvitation();
-      var od = api.Invitation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Invitation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInvitation(od as api.Invitation);
     });
   });
@@ -2616,7 +2662,8 @@
   unittest.group('obj-schema-Link', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLink();
-      var od = api.Link.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Link.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLink(od as api.Link);
     });
   });
@@ -2624,7 +2671,9 @@
   unittest.group('obj-schema-ListAnnouncementsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAnnouncementsResponse();
-      var od = api.ListAnnouncementsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAnnouncementsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAnnouncementsResponse(od as api.ListAnnouncementsResponse);
     });
   });
@@ -2632,7 +2681,9 @@
   unittest.group('obj-schema-ListCourseAliasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCourseAliasesResponse();
-      var od = api.ListCourseAliasesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCourseAliasesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCourseAliasesResponse(od as api.ListCourseAliasesResponse);
     });
   });
@@ -2640,7 +2691,9 @@
   unittest.group('obj-schema-ListCourseWorkMaterialResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCourseWorkMaterialResponse();
-      var od = api.ListCourseWorkMaterialResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCourseWorkMaterialResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCourseWorkMaterialResponse(
           od as api.ListCourseWorkMaterialResponse);
     });
@@ -2649,7 +2702,9 @@
   unittest.group('obj-schema-ListCourseWorkResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCourseWorkResponse();
-      var od = api.ListCourseWorkResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCourseWorkResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCourseWorkResponse(od as api.ListCourseWorkResponse);
     });
   });
@@ -2657,7 +2712,9 @@
   unittest.group('obj-schema-ListCoursesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCoursesResponse();
-      var od = api.ListCoursesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCoursesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCoursesResponse(od as api.ListCoursesResponse);
     });
   });
@@ -2665,7 +2722,9 @@
   unittest.group('obj-schema-ListGuardianInvitationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGuardianInvitationsResponse();
-      var od = api.ListGuardianInvitationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGuardianInvitationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGuardianInvitationsResponse(
           od as api.ListGuardianInvitationsResponse);
     });
@@ -2674,7 +2733,9 @@
   unittest.group('obj-schema-ListGuardiansResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGuardiansResponse();
-      var od = api.ListGuardiansResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGuardiansResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGuardiansResponse(od as api.ListGuardiansResponse);
     });
   });
@@ -2682,7 +2743,9 @@
   unittest.group('obj-schema-ListInvitationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInvitationsResponse();
-      var od = api.ListInvitationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInvitationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInvitationsResponse(od as api.ListInvitationsResponse);
     });
   });
@@ -2690,7 +2753,9 @@
   unittest.group('obj-schema-ListStudentSubmissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListStudentSubmissionsResponse();
-      var od = api.ListStudentSubmissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListStudentSubmissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListStudentSubmissionsResponse(
           od as api.ListStudentSubmissionsResponse);
     });
@@ -2699,7 +2764,9 @@
   unittest.group('obj-schema-ListStudentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListStudentsResponse();
-      var od = api.ListStudentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListStudentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListStudentsResponse(od as api.ListStudentsResponse);
     });
   });
@@ -2707,7 +2774,9 @@
   unittest.group('obj-schema-ListTeachersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTeachersResponse();
-      var od = api.ListTeachersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTeachersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTeachersResponse(od as api.ListTeachersResponse);
     });
   });
@@ -2715,7 +2784,9 @@
   unittest.group('obj-schema-ListTopicResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTopicResponse();
-      var od = api.ListTopicResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTopicResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTopicResponse(od as api.ListTopicResponse);
     });
   });
@@ -2723,7 +2794,9 @@
   unittest.group('obj-schema-Material', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaterial();
-      var od = api.Material.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Material.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMaterial(od as api.Material);
     });
   });
@@ -2731,7 +2804,9 @@
   unittest.group('obj-schema-ModifyAnnouncementAssigneesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyAnnouncementAssigneesRequest();
-      var od = api.ModifyAnnouncementAssigneesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyAnnouncementAssigneesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyAnnouncementAssigneesRequest(
           od as api.ModifyAnnouncementAssigneesRequest);
     });
@@ -2740,7 +2815,9 @@
   unittest.group('obj-schema-ModifyAttachmentsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyAttachmentsRequest();
-      var od = api.ModifyAttachmentsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyAttachmentsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyAttachmentsRequest(od as api.ModifyAttachmentsRequest);
     });
   });
@@ -2748,7 +2825,9 @@
   unittest.group('obj-schema-ModifyCourseWorkAssigneesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyCourseWorkAssigneesRequest();
-      var od = api.ModifyCourseWorkAssigneesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyCourseWorkAssigneesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyCourseWorkAssigneesRequest(
           od as api.ModifyCourseWorkAssigneesRequest);
     });
@@ -2757,7 +2836,9 @@
   unittest.group('obj-schema-ModifyIndividualStudentsOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyIndividualStudentsOptions();
-      var od = api.ModifyIndividualStudentsOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyIndividualStudentsOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyIndividualStudentsOptions(
           od as api.ModifyIndividualStudentsOptions);
     });
@@ -2766,7 +2847,9 @@
   unittest.group('obj-schema-MultipleChoiceQuestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMultipleChoiceQuestion();
-      var od = api.MultipleChoiceQuestion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MultipleChoiceQuestion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMultipleChoiceQuestion(od as api.MultipleChoiceQuestion);
     });
   });
@@ -2774,7 +2857,9 @@
   unittest.group('obj-schema-MultipleChoiceSubmission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMultipleChoiceSubmission();
-      var od = api.MultipleChoiceSubmission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MultipleChoiceSubmission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMultipleChoiceSubmission(od as api.MultipleChoiceSubmission);
     });
   });
@@ -2782,7 +2867,8 @@
   unittest.group('obj-schema-Name', () {
     unittest.test('to-json--from-json', () async {
       var o = buildName();
-      var od = api.Name.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Name.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkName(od as api.Name);
     });
   });
@@ -2790,7 +2876,9 @@
   unittest.group('obj-schema-ReclaimStudentSubmissionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReclaimStudentSubmissionRequest();
-      var od = api.ReclaimStudentSubmissionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReclaimStudentSubmissionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReclaimStudentSubmissionRequest(
           od as api.ReclaimStudentSubmissionRequest);
     });
@@ -2799,7 +2887,9 @@
   unittest.group('obj-schema-Registration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegistration();
-      var od = api.Registration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Registration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegistration(od as api.Registration);
     });
   });
@@ -2807,7 +2897,9 @@
   unittest.group('obj-schema-ReturnStudentSubmissionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnStudentSubmissionRequest();
-      var od = api.ReturnStudentSubmissionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnStudentSubmissionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnStudentSubmissionRequest(
           od as api.ReturnStudentSubmissionRequest);
     });
@@ -2816,7 +2908,9 @@
   unittest.group('obj-schema-SharedDriveFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSharedDriveFile();
-      var od = api.SharedDriveFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SharedDriveFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSharedDriveFile(od as api.SharedDriveFile);
     });
   });
@@ -2824,7 +2918,9 @@
   unittest.group('obj-schema-ShortAnswerSubmission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShortAnswerSubmission();
-      var od = api.ShortAnswerSubmission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShortAnswerSubmission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShortAnswerSubmission(od as api.ShortAnswerSubmission);
     });
   });
@@ -2832,7 +2928,9 @@
   unittest.group('obj-schema-StateHistory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStateHistory();
-      var od = api.StateHistory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StateHistory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStateHistory(od as api.StateHistory);
     });
   });
@@ -2840,7 +2938,9 @@
   unittest.group('obj-schema-Student', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStudent();
-      var od = api.Student.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Student.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStudent(od as api.Student);
     });
   });
@@ -2848,7 +2948,9 @@
   unittest.group('obj-schema-StudentSubmission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStudentSubmission();
-      var od = api.StudentSubmission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StudentSubmission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStudentSubmission(od as api.StudentSubmission);
     });
   });
@@ -2856,7 +2958,9 @@
   unittest.group('obj-schema-SubmissionHistory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubmissionHistory();
-      var od = api.SubmissionHistory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubmissionHistory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubmissionHistory(od as api.SubmissionHistory);
     });
   });
@@ -2864,7 +2968,9 @@
   unittest.group('obj-schema-Teacher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeacher();
-      var od = api.Teacher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Teacher.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTeacher(od as api.Teacher);
     });
   });
@@ -2872,7 +2978,9 @@
   unittest.group('obj-schema-TimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeOfDay();
-      var od = api.TimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeOfDay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeOfDay(od as api.TimeOfDay);
     });
   });
@@ -2880,7 +2988,8 @@
   unittest.group('obj-schema-Topic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTopic();
-      var od = api.Topic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Topic.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTopic(od as api.Topic);
     });
   });
@@ -2888,7 +2997,9 @@
   unittest.group('obj-schema-TurnInStudentSubmissionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTurnInStudentSubmissionRequest();
-      var od = api.TurnInStudentSubmissionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TurnInStudentSubmissionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTurnInStudentSubmissionRequest(
           od as api.TurnInStudentSubmissionRequest);
     });
@@ -2897,7 +3008,9 @@
   unittest.group('obj-schema-UserProfile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserProfile();
-      var od = api.UserProfile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserProfile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserProfile(od as api.UserProfile);
     });
   });
@@ -2905,7 +3018,9 @@
   unittest.group('obj-schema-YouTubeVideo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildYouTubeVideo();
-      var od = api.YouTubeVideo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.YouTubeVideo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkYouTubeVideo(od as api.YouTubeVideo);
     });
   });
diff --git a/generated/googleapis/test/cloudasset/v1_test.dart b/generated/googleapis/test/cloudasset/v1_test.dart
index d24f3b2..bd7c371 100644
--- a/generated/googleapis/test/cloudasset/v1_test.dart
+++ b/generated/googleapis/test/cloudasset/v1_test.dart
@@ -3718,7 +3718,9 @@
   unittest.group('obj-schema-AccessSelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessSelector();
-      var od = api.AccessSelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessSelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessSelector(od as api.AccessSelector);
     });
   });
@@ -3726,7 +3728,9 @@
   unittest.group('obj-schema-AnalyzeIamPolicyLongrunningRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzeIamPolicyLongrunningRequest();
-      var od = api.AnalyzeIamPolicyLongrunningRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzeIamPolicyLongrunningRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzeIamPolicyLongrunningRequest(
           od as api.AnalyzeIamPolicyLongrunningRequest);
     });
@@ -3735,7 +3739,9 @@
   unittest.group('obj-schema-AnalyzeIamPolicyResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzeIamPolicyResponse();
-      var od = api.AnalyzeIamPolicyResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzeIamPolicyResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzeIamPolicyResponse(od as api.AnalyzeIamPolicyResponse);
     });
   });
@@ -3743,7 +3749,8 @@
   unittest.group('obj-schema-Asset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsset();
-      var od = api.Asset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Asset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAsset(od as api.Asset);
     });
   });
@@ -3751,7 +3758,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -3759,7 +3768,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -3767,7 +3778,9 @@
   unittest.group('obj-schema-BatchGetAssetsHistoryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetAssetsHistoryResponse();
-      var od = api.BatchGetAssetsHistoryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetAssetsHistoryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetAssetsHistoryResponse(
           od as api.BatchGetAssetsHistoryResponse);
     });
@@ -3776,7 +3789,9 @@
   unittest.group('obj-schema-BigQueryDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigQueryDestination();
-      var od = api.BigQueryDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigQueryDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigQueryDestination(od as api.BigQueryDestination);
     });
   });
@@ -3784,7 +3799,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -3792,7 +3809,9 @@
   unittest.group('obj-schema-CreateFeedRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateFeedRequest();
-      var od = api.CreateFeedRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateFeedRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateFeedRequest(od as api.CreateFeedRequest);
     });
   });
@@ -3800,7 +3819,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -3808,7 +3828,9 @@
   unittest.group('obj-schema-Explanation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExplanation();
-      var od = api.Explanation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Explanation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExplanation(od as api.Explanation);
     });
   });
@@ -3816,7 +3838,9 @@
   unittest.group('obj-schema-ExportAssetsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportAssetsRequest();
-      var od = api.ExportAssetsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportAssetsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportAssetsRequest(od as api.ExportAssetsRequest);
     });
   });
@@ -3824,7 +3848,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -3832,7 +3857,8 @@
   unittest.group('obj-schema-Feed', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeed();
-      var od = api.Feed.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Feed.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFeed(od as api.Feed);
     });
   });
@@ -3840,7 +3866,9 @@
   unittest.group('obj-schema-FeedOutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeedOutputConfig();
-      var od = api.FeedOutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FeedOutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFeedOutputConfig(od as api.FeedOutputConfig);
     });
   });
@@ -3848,7 +3876,9 @@
   unittest.group('obj-schema-GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcsDestination();
-      var od = api.GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGcsDestination(od as api.GcsDestination);
     });
   });
@@ -3856,7 +3886,9 @@
   unittest.group('obj-schema-GoogleCloudAssetV1Access', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssetV1Access();
-      var od = api.GoogleCloudAssetV1Access.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudAssetV1Access.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssetV1Access(od as api.GoogleCloudAssetV1Access);
     });
   });
@@ -3864,7 +3896,9 @@
   unittest.group('obj-schema-GoogleCloudAssetV1AccessControlList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssetV1AccessControlList();
-      var od = api.GoogleCloudAssetV1AccessControlList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudAssetV1AccessControlList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssetV1AccessControlList(
           od as api.GoogleCloudAssetV1AccessControlList);
     });
@@ -3873,7 +3907,9 @@
   unittest.group('obj-schema-GoogleCloudAssetV1BigQueryDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssetV1BigQueryDestination();
-      var od = api.GoogleCloudAssetV1BigQueryDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudAssetV1BigQueryDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssetV1BigQueryDestination(
           od as api.GoogleCloudAssetV1BigQueryDestination);
     });
@@ -3882,7 +3918,9 @@
   unittest.group('obj-schema-GoogleCloudAssetV1Edge', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssetV1Edge();
-      var od = api.GoogleCloudAssetV1Edge.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudAssetV1Edge.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssetV1Edge(od as api.GoogleCloudAssetV1Edge);
     });
   });
@@ -3890,7 +3928,9 @@
   unittest.group('obj-schema-GoogleCloudAssetV1GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssetV1GcsDestination();
-      var od = api.GoogleCloudAssetV1GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudAssetV1GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssetV1GcsDestination(
           od as api.GoogleCloudAssetV1GcsDestination);
     });
@@ -3899,7 +3939,9 @@
   unittest.group('obj-schema-GoogleCloudAssetV1Identity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssetV1Identity();
-      var od = api.GoogleCloudAssetV1Identity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudAssetV1Identity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssetV1Identity(od as api.GoogleCloudAssetV1Identity);
     });
   });
@@ -3907,7 +3949,9 @@
   unittest.group('obj-schema-GoogleCloudAssetV1IdentityList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssetV1IdentityList();
-      var od = api.GoogleCloudAssetV1IdentityList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudAssetV1IdentityList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssetV1IdentityList(
           od as api.GoogleCloudAssetV1IdentityList);
     });
@@ -3916,7 +3960,9 @@
   unittest.group('obj-schema-GoogleCloudAssetV1Resource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudAssetV1Resource();
-      var od = api.GoogleCloudAssetV1Resource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudAssetV1Resource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudAssetV1Resource(od as api.GoogleCloudAssetV1Resource);
     });
   });
@@ -3924,7 +3970,9 @@
   unittest.group('obj-schema-GoogleCloudOrgpolicyV1BooleanPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudOrgpolicyV1BooleanPolicy();
-      var od = api.GoogleCloudOrgpolicyV1BooleanPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudOrgpolicyV1BooleanPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudOrgpolicyV1BooleanPolicy(
           od as api.GoogleCloudOrgpolicyV1BooleanPolicy);
     });
@@ -3933,7 +3981,9 @@
   unittest.group('obj-schema-GoogleCloudOrgpolicyV1ListPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudOrgpolicyV1ListPolicy();
-      var od = api.GoogleCloudOrgpolicyV1ListPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudOrgpolicyV1ListPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudOrgpolicyV1ListPolicy(
           od as api.GoogleCloudOrgpolicyV1ListPolicy);
     });
@@ -3942,7 +3992,9 @@
   unittest.group('obj-schema-GoogleCloudOrgpolicyV1Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudOrgpolicyV1Policy();
-      var od = api.GoogleCloudOrgpolicyV1Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudOrgpolicyV1Policy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudOrgpolicyV1Policy(od as api.GoogleCloudOrgpolicyV1Policy);
     });
   });
@@ -3950,7 +4002,9 @@
   unittest.group('obj-schema-GoogleCloudOrgpolicyV1RestoreDefault', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudOrgpolicyV1RestoreDefault();
-      var od = api.GoogleCloudOrgpolicyV1RestoreDefault.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudOrgpolicyV1RestoreDefault.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudOrgpolicyV1RestoreDefault(
           od as api.GoogleCloudOrgpolicyV1RestoreDefault);
     });
@@ -3960,8 +4014,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1AccessLevel();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1AccessLevel.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1AccessLevel(
           od as api.GoogleIdentityAccesscontextmanagerV1AccessLevel);
     });
@@ -3971,8 +4026,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1AccessPolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1AccessPolicy.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1AccessPolicy(
           od as api.GoogleIdentityAccesscontextmanagerV1AccessPolicy);
     });
@@ -3982,8 +4038,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1ApiOperation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1ApiOperation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1ApiOperation(
           od as api.GoogleIdentityAccesscontextmanagerV1ApiOperation);
     });
@@ -3993,8 +4050,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1BasicLevel();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1BasicLevel.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1BasicLevel(
           od as api.GoogleIdentityAccesscontextmanagerV1BasicLevel);
     });
@@ -4004,8 +4062,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1Condition();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1Condition.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1Condition(
           od as api.GoogleIdentityAccesscontextmanagerV1Condition);
     });
@@ -4015,8 +4074,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1CustomLevel();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1CustomLevel.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1CustomLevel(
           od as api.GoogleIdentityAccesscontextmanagerV1CustomLevel);
     });
@@ -4026,8 +4086,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1DevicePolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1DevicePolicy.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1DevicePolicy(
           od as api.GoogleIdentityAccesscontextmanagerV1DevicePolicy);
     });
@@ -4037,8 +4098,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1EgressFrom();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1EgressFrom.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1EgressFrom(
           od as api.GoogleIdentityAccesscontextmanagerV1EgressFrom);
     });
@@ -4048,8 +4110,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1EgressPolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1EgressPolicy.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1EgressPolicy(
           od as api.GoogleIdentityAccesscontextmanagerV1EgressPolicy);
     });
@@ -4058,8 +4121,9 @@
   unittest.group('obj-schema-GoogleIdentityAccesscontextmanagerV1EgressTo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1EgressTo();
-      var od =
-          api.GoogleIdentityAccesscontextmanagerV1EgressTo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIdentityAccesscontextmanagerV1EgressTo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1EgressTo(
           od as api.GoogleIdentityAccesscontextmanagerV1EgressTo);
     });
@@ -4069,8 +4133,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1IngressFrom();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1IngressFrom.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1IngressFrom(
           od as api.GoogleIdentityAccesscontextmanagerV1IngressFrom);
     });
@@ -4080,8 +4145,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1IngressPolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1IngressPolicy.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1IngressPolicy(
           od as api.GoogleIdentityAccesscontextmanagerV1IngressPolicy);
     });
@@ -4091,8 +4157,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1IngressSource();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1IngressSource.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1IngressSource(
           od as api.GoogleIdentityAccesscontextmanagerV1IngressSource);
     });
@@ -4102,8 +4169,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1IngressTo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1IngressTo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1IngressTo(
           od as api.GoogleIdentityAccesscontextmanagerV1IngressTo);
     });
@@ -4113,8 +4181,9 @@
       'obj-schema-GoogleIdentityAccesscontextmanagerV1MethodSelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1MethodSelector();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1MethodSelector.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1MethodSelector(
           od as api.GoogleIdentityAccesscontextmanagerV1MethodSelector);
     });
@@ -4124,8 +4193,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1OsConstraint();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1OsConstraint.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1OsConstraint(
           od as api.GoogleIdentityAccesscontextmanagerV1OsConstraint);
     });
@@ -4135,9 +4205,10 @@
       'obj-schema-GoogleIdentityAccesscontextmanagerV1ServicePerimeter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1ServicePerimeter();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleIdentityAccesscontextmanagerV1ServicePerimeter.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1ServicePerimeter(
           od as api.GoogleIdentityAccesscontextmanagerV1ServicePerimeter);
     });
@@ -4148,8 +4219,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig(
           od as api.GoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig);
     });
@@ -4160,8 +4232,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityAccesscontextmanagerV1VpcAccessibleServices();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleIdentityAccesscontextmanagerV1VpcAccessibleServices
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityAccesscontextmanagerV1VpcAccessibleServices(
           od as api.GoogleIdentityAccesscontextmanagerV1VpcAccessibleServices);
     });
@@ -4170,7 +4243,9 @@
   unittest.group('obj-schema-IamPolicyAnalysis', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIamPolicyAnalysis();
-      var od = api.IamPolicyAnalysis.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IamPolicyAnalysis.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIamPolicyAnalysis(od as api.IamPolicyAnalysis);
     });
   });
@@ -4178,7 +4253,9 @@
   unittest.group('obj-schema-IamPolicyAnalysisOutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIamPolicyAnalysisOutputConfig();
-      var od = api.IamPolicyAnalysisOutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IamPolicyAnalysisOutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIamPolicyAnalysisOutputConfig(
           od as api.IamPolicyAnalysisOutputConfig);
     });
@@ -4187,7 +4264,9 @@
   unittest.group('obj-schema-IamPolicyAnalysisQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIamPolicyAnalysisQuery();
-      var od = api.IamPolicyAnalysisQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IamPolicyAnalysisQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIamPolicyAnalysisQuery(od as api.IamPolicyAnalysisQuery);
     });
   });
@@ -4195,7 +4274,9 @@
   unittest.group('obj-schema-IamPolicyAnalysisResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIamPolicyAnalysisResult();
-      var od = api.IamPolicyAnalysisResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IamPolicyAnalysisResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIamPolicyAnalysisResult(od as api.IamPolicyAnalysisResult);
     });
   });
@@ -4203,7 +4284,9 @@
   unittest.group('obj-schema-IamPolicyAnalysisState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIamPolicyAnalysisState();
-      var od = api.IamPolicyAnalysisState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IamPolicyAnalysisState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIamPolicyAnalysisState(od as api.IamPolicyAnalysisState);
     });
   });
@@ -4211,7 +4294,9 @@
   unittest.group('obj-schema-IamPolicySearchResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIamPolicySearchResult();
-      var od = api.IamPolicySearchResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IamPolicySearchResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIamPolicySearchResult(od as api.IamPolicySearchResult);
     });
   });
@@ -4219,7 +4304,9 @@
   unittest.group('obj-schema-IdentitySelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitySelector();
-      var od = api.IdentitySelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IdentitySelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitySelector(od as api.IdentitySelector);
     });
   });
@@ -4227,7 +4314,9 @@
   unittest.group('obj-schema-Inventory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventory();
-      var od = api.Inventory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Inventory.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInventory(od as api.Inventory);
     });
   });
@@ -4235,7 +4324,8 @@
   unittest.group('obj-schema-Item', () {
     unittest.test('to-json--from-json', () async {
       var o = buildItem();
-      var od = api.Item.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Item.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkItem(od as api.Item);
     });
   });
@@ -4243,7 +4333,9 @@
   unittest.group('obj-schema-ListFeedsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFeedsResponse();
-      var od = api.ListFeedsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFeedsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFeedsResponse(od as api.ListFeedsResponse);
     });
   });
@@ -4251,7 +4343,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -4259,7 +4353,9 @@
   unittest.group('obj-schema-Options', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOptions();
-      var od = api.Options.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Options.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOptions(od as api.Options);
     });
   });
@@ -4267,7 +4363,9 @@
   unittest.group('obj-schema-OsInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOsInfo();
-      var od = api.OsInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OsInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOsInfo(od as api.OsInfo);
     });
   });
@@ -4275,7 +4373,9 @@
   unittest.group('obj-schema-OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOutputConfig();
-      var od = api.OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOutputConfig(od as api.OutputConfig);
     });
   });
@@ -4283,7 +4383,9 @@
   unittest.group('obj-schema-PartitionSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionSpec();
-      var od = api.PartitionSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionSpec(od as api.PartitionSpec);
     });
   });
@@ -4291,7 +4393,9 @@
   unittest.group('obj-schema-Permissions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissions();
-      var od = api.Permissions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Permissions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissions(od as api.Permissions);
     });
   });
@@ -4299,7 +4403,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -4307,7 +4413,9 @@
   unittest.group('obj-schema-PubsubDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubsubDestination();
-      var od = api.PubsubDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PubsubDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPubsubDestination(od as api.PubsubDestination);
     });
   });
@@ -4315,7 +4423,9 @@
   unittest.group('obj-schema-Resource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResource();
-      var od = api.Resource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Resource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResource(od as api.Resource);
     });
   });
@@ -4323,7 +4433,9 @@
   unittest.group('obj-schema-ResourceSearchResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceSearchResult();
-      var od = api.ResourceSearchResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceSearchResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceSearchResult(od as api.ResourceSearchResult);
     });
   });
@@ -4331,7 +4443,9 @@
   unittest.group('obj-schema-ResourceSelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceSelector();
-      var od = api.ResourceSelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceSelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceSelector(od as api.ResourceSelector);
     });
   });
@@ -4339,7 +4453,9 @@
   unittest.group('obj-schema-SearchAllIamPoliciesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchAllIamPoliciesResponse();
-      var od = api.SearchAllIamPoliciesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchAllIamPoliciesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchAllIamPoliciesResponse(od as api.SearchAllIamPoliciesResponse);
     });
   });
@@ -4347,7 +4463,9 @@
   unittest.group('obj-schema-SearchAllResourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchAllResourcesResponse();
-      var od = api.SearchAllResourcesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchAllResourcesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchAllResourcesResponse(od as api.SearchAllResourcesResponse);
     });
   });
@@ -4355,7 +4473,9 @@
   unittest.group('obj-schema-SoftwarePackage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSoftwarePackage();
-      var od = api.SoftwarePackage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SoftwarePackage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSoftwarePackage(od as api.SoftwarePackage);
     });
   });
@@ -4363,7 +4483,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4371,7 +4493,9 @@
   unittest.group('obj-schema-TemporalAsset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTemporalAsset();
-      var od = api.TemporalAsset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TemporalAsset.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTemporalAsset(od as api.TemporalAsset);
     });
   });
@@ -4379,7 +4503,9 @@
   unittest.group('obj-schema-TimeWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeWindow();
-      var od = api.TimeWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeWindow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeWindow(od as api.TimeWindow);
     });
   });
@@ -4387,7 +4513,9 @@
   unittest.group('obj-schema-UpdateFeedRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateFeedRequest();
-      var od = api.UpdateFeedRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateFeedRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateFeedRequest(od as api.UpdateFeedRequest);
     });
   });
@@ -4395,7 +4523,9 @@
   unittest.group('obj-schema-VersionedPackage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVersionedPackage();
-      var od = api.VersionedPackage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VersionedPackage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVersionedPackage(od as api.VersionedPackage);
     });
   });
@@ -4403,7 +4533,9 @@
   unittest.group('obj-schema-WindowsQuickFixEngineeringPackage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWindowsQuickFixEngineeringPackage();
-      var od = api.WindowsQuickFixEngineeringPackage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WindowsQuickFixEngineeringPackage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWindowsQuickFixEngineeringPackage(
           od as api.WindowsQuickFixEngineeringPackage);
     });
@@ -4412,7 +4544,9 @@
   unittest.group('obj-schema-WindowsUpdateCategory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWindowsUpdateCategory();
-      var od = api.WindowsUpdateCategory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WindowsUpdateCategory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWindowsUpdateCategory(od as api.WindowsUpdateCategory);
     });
   });
@@ -4420,7 +4554,9 @@
   unittest.group('obj-schema-WindowsUpdatePackage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWindowsUpdatePackage();
-      var od = api.WindowsUpdatePackage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WindowsUpdatePackage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWindowsUpdatePackage(od as api.WindowsUpdatePackage);
     });
   });
@@ -4428,7 +4564,9 @@
   unittest.group('obj-schema-ZypperPatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZypperPatch();
-      var od = api.ZypperPatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ZypperPatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkZypperPatch(od as api.ZypperPatch);
     });
   });
diff --git a/generated/googleapis/test/cloudbilling/v1_test.dart b/generated/googleapis/test/cloudbilling/v1_test.dart
index e81051d..a144522 100644
--- a/generated/googleapis/test/cloudbilling/v1_test.dart
+++ b/generated/googleapis/test/cloudbilling/v1_test.dart
@@ -946,7 +946,9 @@
   unittest.group('obj-schema-AggregationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAggregationInfo();
-      var od = api.AggregationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AggregationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAggregationInfo(od as api.AggregationInfo);
     });
   });
@@ -954,7 +956,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -962,7 +966,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -970,7 +976,9 @@
   unittest.group('obj-schema-BillingAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingAccount();
-      var od = api.BillingAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingAccount(od as api.BillingAccount);
     });
   });
@@ -978,7 +986,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -986,7 +996,9 @@
   unittest.group('obj-schema-Category', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategory();
-      var od = api.Category.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Category.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCategory(od as api.Category);
     });
   });
@@ -994,7 +1006,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1002,7 +1015,9 @@
   unittest.group('obj-schema-GeoTaxonomy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeoTaxonomy();
-      var od = api.GeoTaxonomy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeoTaxonomy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeoTaxonomy(od as api.GeoTaxonomy);
     });
   });
@@ -1010,7 +1025,9 @@
   unittest.group('obj-schema-ListBillingAccountsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBillingAccountsResponse();
-      var od = api.ListBillingAccountsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBillingAccountsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBillingAccountsResponse(od as api.ListBillingAccountsResponse);
     });
   });
@@ -1018,7 +1035,9 @@
   unittest.group('obj-schema-ListProjectBillingInfoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListProjectBillingInfoResponse();
-      var od = api.ListProjectBillingInfoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListProjectBillingInfoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListProjectBillingInfoResponse(
           od as api.ListProjectBillingInfoResponse);
     });
@@ -1027,7 +1046,9 @@
   unittest.group('obj-schema-ListServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServicesResponse();
-      var od = api.ListServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
@@ -1035,7 +1056,9 @@
   unittest.group('obj-schema-ListSkusResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSkusResponse();
-      var od = api.ListSkusResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSkusResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSkusResponse(od as api.ListSkusResponse);
     });
   });
@@ -1043,7 +1066,8 @@
   unittest.group('obj-schema-Money', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoney();
-      var od = api.Money.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Money.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMoney(od as api.Money);
     });
   });
@@ -1051,7 +1075,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1059,7 +1085,9 @@
   unittest.group('obj-schema-PricingExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPricingExpression();
-      var od = api.PricingExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PricingExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPricingExpression(od as api.PricingExpression);
     });
   });
@@ -1067,7 +1095,9 @@
   unittest.group('obj-schema-PricingInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPricingInfo();
-      var od = api.PricingInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PricingInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPricingInfo(od as api.PricingInfo);
     });
   });
@@ -1075,7 +1105,9 @@
   unittest.group('obj-schema-ProjectBillingInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectBillingInfo();
-      var od = api.ProjectBillingInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectBillingInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectBillingInfo(od as api.ProjectBillingInfo);
     });
   });
@@ -1083,7 +1115,9 @@
   unittest.group('obj-schema-Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildService();
-      var od = api.Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Service.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkService(od as api.Service);
     });
   });
@@ -1091,7 +1125,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1099,7 +1135,8 @@
   unittest.group('obj-schema-Sku', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSku();
-      var od = api.Sku.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Sku.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSku(od as api.Sku);
     });
   });
@@ -1107,7 +1144,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1115,7 +1154,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -1123,7 +1164,9 @@
   unittest.group('obj-schema-TierRate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTierRate();
-      var od = api.TierRate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TierRate.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTierRate(od as api.TierRate);
     });
   });
diff --git a/generated/googleapis/test/cloudbuild/v1_test.dart b/generated/googleapis/test/cloudbuild/v1_test.dart
index 07f43ca..13f3669 100644
--- a/generated/googleapis/test/cloudbuild/v1_test.dart
+++ b/generated/googleapis/test/cloudbuild/v1_test.dart
@@ -2240,7 +2240,9 @@
   unittest.group('obj-schema-ArtifactObjects', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArtifactObjects();
-      var od = api.ArtifactObjects.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ArtifactObjects.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkArtifactObjects(od as api.ArtifactObjects);
     });
   });
@@ -2248,7 +2250,9 @@
   unittest.group('obj-schema-ArtifactResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArtifactResult();
-      var od = api.ArtifactResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ArtifactResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkArtifactResult(od as api.ArtifactResult);
     });
   });
@@ -2256,7 +2260,9 @@
   unittest.group('obj-schema-Artifacts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArtifacts();
-      var od = api.Artifacts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Artifacts.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkArtifacts(od as api.Artifacts);
     });
   });
@@ -2264,7 +2270,8 @@
   unittest.group('obj-schema-Build', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuild();
-      var od = api.Build.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Build.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuild(od as api.Build);
     });
   });
@@ -2272,7 +2279,9 @@
   unittest.group('obj-schema-BuildOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildOperationMetadata();
-      var od = api.BuildOperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildOperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildOperationMetadata(od as api.BuildOperationMetadata);
     });
   });
@@ -2280,7 +2289,9 @@
   unittest.group('obj-schema-BuildOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildOptions();
-      var od = api.BuildOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildOptions(od as api.BuildOptions);
     });
   });
@@ -2288,7 +2299,9 @@
   unittest.group('obj-schema-BuildStep', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildStep();
-      var od = api.BuildStep.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BuildStep.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuildStep(od as api.BuildStep);
     });
   });
@@ -2296,7 +2309,9 @@
   unittest.group('obj-schema-BuildTrigger', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildTrigger();
-      var od = api.BuildTrigger.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildTrigger.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildTrigger(od as api.BuildTrigger);
     });
   });
@@ -2304,7 +2319,9 @@
   unittest.group('obj-schema-BuiltImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuiltImage();
-      var od = api.BuiltImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BuiltImage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuiltImage(od as api.BuiltImage);
     });
   });
@@ -2312,7 +2329,9 @@
   unittest.group('obj-schema-CancelBuildRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelBuildRequest();
-      var od = api.CancelBuildRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelBuildRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelBuildRequest(od as api.CancelBuildRequest);
     });
   });
@@ -2320,7 +2339,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -2328,7 +2349,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2336,7 +2358,9 @@
   unittest.group('obj-schema-FileHashes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileHashes();
-      var od = api.FileHashes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FileHashes.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFileHashes(od as api.FileHashes);
     });
   });
@@ -2344,7 +2368,9 @@
   unittest.group('obj-schema-GitHubEventsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGitHubEventsConfig();
-      var od = api.GitHubEventsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GitHubEventsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGitHubEventsConfig(od as api.GitHubEventsConfig);
     });
   });
@@ -2352,7 +2378,9 @@
   unittest.group('obj-schema-HTTPDelivery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHTTPDelivery();
-      var od = api.HTTPDelivery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HTTPDelivery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHTTPDelivery(od as api.HTTPDelivery);
     });
   });
@@ -2360,7 +2388,8 @@
   unittest.group('obj-schema-Hash', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHash();
-      var od = api.Hash.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Hash.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHash(od as api.Hash);
     });
   });
@@ -2368,7 +2397,9 @@
   unittest.group('obj-schema-HttpBody', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpBody();
-      var od = api.HttpBody.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpBody.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpBody(od as api.HttpBody);
     });
   });
@@ -2376,7 +2407,9 @@
   unittest.group('obj-schema-InlineSecret', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInlineSecret();
-      var od = api.InlineSecret.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InlineSecret.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInlineSecret(od as api.InlineSecret);
     });
   });
@@ -2384,7 +2417,9 @@
   unittest.group('obj-schema-ListBuildTriggersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBuildTriggersResponse();
-      var od = api.ListBuildTriggersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBuildTriggersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBuildTriggersResponse(od as api.ListBuildTriggersResponse);
     });
   });
@@ -2392,7 +2427,9 @@
   unittest.group('obj-schema-ListBuildsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBuildsResponse();
-      var od = api.ListBuildsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBuildsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBuildsResponse(od as api.ListBuildsResponse);
     });
   });
@@ -2400,7 +2437,9 @@
   unittest.group('obj-schema-Notification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotification();
-      var od = api.Notification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Notification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotification(od as api.Notification);
     });
   });
@@ -2408,7 +2447,9 @@
   unittest.group('obj-schema-NotifierConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotifierConfig();
-      var od = api.NotifierConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotifierConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotifierConfig(od as api.NotifierConfig);
     });
   });
@@ -2416,7 +2457,9 @@
   unittest.group('obj-schema-NotifierMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotifierMetadata();
-      var od = api.NotifierMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotifierMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotifierMetadata(od as api.NotifierMetadata);
     });
   });
@@ -2424,7 +2467,9 @@
   unittest.group('obj-schema-NotifierSecret', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotifierSecret();
-      var od = api.NotifierSecret.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotifierSecret.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotifierSecret(od as api.NotifierSecret);
     });
   });
@@ -2432,7 +2477,9 @@
   unittest.group('obj-schema-NotifierSecretRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotifierSecretRef();
-      var od = api.NotifierSecretRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotifierSecretRef.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotifierSecretRef(od as api.NotifierSecretRef);
     });
   });
@@ -2440,7 +2487,9 @@
   unittest.group('obj-schema-NotifierSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotifierSpec();
-      var od = api.NotifierSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotifierSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotifierSpec(od as api.NotifierSpec);
     });
   });
@@ -2448,7 +2497,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2456,7 +2507,9 @@
   unittest.group('obj-schema-PullRequestFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPullRequestFilter();
-      var od = api.PullRequestFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PullRequestFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPullRequestFilter(od as api.PullRequestFilter);
     });
   });
@@ -2464,7 +2517,9 @@
   unittest.group('obj-schema-PushFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPushFilter();
-      var od = api.PushFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PushFilter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPushFilter(od as api.PushFilter);
     });
   });
@@ -2472,7 +2527,9 @@
   unittest.group('obj-schema-ReceiveTriggerWebhookResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReceiveTriggerWebhookResponse();
-      var od = api.ReceiveTriggerWebhookResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReceiveTriggerWebhookResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReceiveTriggerWebhookResponse(
           od as api.ReceiveTriggerWebhookResponse);
     });
@@ -2481,7 +2538,9 @@
   unittest.group('obj-schema-RepoSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepoSource();
-      var od = api.RepoSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RepoSource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRepoSource(od as api.RepoSource);
     });
   });
@@ -2489,7 +2548,9 @@
   unittest.group('obj-schema-Results', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResults();
-      var od = api.Results.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Results.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResults(od as api.Results);
     });
   });
@@ -2497,7 +2558,9 @@
   unittest.group('obj-schema-RetryBuildRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRetryBuildRequest();
-      var od = api.RetryBuildRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RetryBuildRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRetryBuildRequest(od as api.RetryBuildRequest);
     });
   });
@@ -2505,7 +2568,9 @@
   unittest.group('obj-schema-SMTPDelivery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSMTPDelivery();
-      var od = api.SMTPDelivery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SMTPDelivery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSMTPDelivery(od as api.SMTPDelivery);
     });
   });
@@ -2513,7 +2578,9 @@
   unittest.group('obj-schema-Secret', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecret();
-      var od = api.Secret.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Secret.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSecret(od as api.Secret);
     });
   });
@@ -2521,7 +2588,9 @@
   unittest.group('obj-schema-SecretManagerSecret', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecretManagerSecret();
-      var od = api.SecretManagerSecret.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecretManagerSecret.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecretManagerSecret(od as api.SecretManagerSecret);
     });
   });
@@ -2529,7 +2598,9 @@
   unittest.group('obj-schema-Secrets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecrets();
-      var od = api.Secrets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Secrets.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSecrets(od as api.Secrets);
     });
   });
@@ -2537,7 +2608,9 @@
   unittest.group('obj-schema-SlackDelivery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSlackDelivery();
-      var od = api.SlackDelivery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SlackDelivery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSlackDelivery(od as api.SlackDelivery);
     });
   });
@@ -2545,7 +2618,9 @@
   unittest.group('obj-schema-Source', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSource();
-      var od = api.Source.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Source.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSource(od as api.Source);
     });
   });
@@ -2553,7 +2628,9 @@
   unittest.group('obj-schema-SourceProvenance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceProvenance();
-      var od = api.SourceProvenance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceProvenance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceProvenance(od as api.SourceProvenance);
     });
   });
@@ -2561,7 +2638,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2569,7 +2648,9 @@
   unittest.group('obj-schema-StorageSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStorageSource();
-      var od = api.StorageSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StorageSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStorageSource(od as api.StorageSource);
     });
   });
@@ -2577,7 +2658,9 @@
   unittest.group('obj-schema-TimeSpan', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeSpan();
-      var od = api.TimeSpan.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeSpan.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeSpan(od as api.TimeSpan);
     });
   });
@@ -2585,7 +2668,9 @@
   unittest.group('obj-schema-Volume', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolume();
-      var od = api.Volume.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Volume.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVolume(od as api.Volume);
     });
   });
diff --git a/generated/googleapis/test/cloudchannel/v1_test.dart b/generated/googleapis/test/cloudchannel/v1_test.dart
index 75e41b9..3fc9b60 100644
--- a/generated/googleapis/test/cloudchannel/v1_test.dart
+++ b/generated/googleapis/test/cloudchannel/v1_test.dart
@@ -3609,8 +3609,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ActivateEntitlementRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1ActivateEntitlementRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ActivateEntitlementRequest(
           od as api.GoogleCloudChannelV1ActivateEntitlementRequest);
     });
@@ -3619,7 +3620,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1AdminUser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1AdminUser();
-      var od = api.GoogleCloudChannelV1AdminUser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1AdminUser.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1AdminUser(
           od as api.GoogleCloudChannelV1AdminUser);
     });
@@ -3628,7 +3631,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1AssociationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1AssociationInfo();
-      var od = api.GoogleCloudChannelV1AssociationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1AssociationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1AssociationInfo(
           od as api.GoogleCloudChannelV1AssociationInfo);
     });
@@ -3637,8 +3642,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1CancelEntitlementRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1CancelEntitlementRequest();
-      var od =
-          api.GoogleCloudChannelV1CancelEntitlementRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1CancelEntitlementRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1CancelEntitlementRequest(
           od as api.GoogleCloudChannelV1CancelEntitlementRequest);
     });
@@ -3647,7 +3653,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ChangeOfferRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ChangeOfferRequest();
-      var od = api.GoogleCloudChannelV1ChangeOfferRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ChangeOfferRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ChangeOfferRequest(
           od as api.GoogleCloudChannelV1ChangeOfferRequest);
     });
@@ -3656,8 +3664,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ChangeParametersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ChangeParametersRequest();
-      var od =
-          api.GoogleCloudChannelV1ChangeParametersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ChangeParametersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ChangeParametersRequest(
           od as api.GoogleCloudChannelV1ChangeParametersRequest);
     });
@@ -3667,8 +3676,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ChangeRenewalSettingsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1ChangeRenewalSettingsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ChangeRenewalSettingsRequest(
           od as api.GoogleCloudChannelV1ChangeRenewalSettingsRequest);
     });
@@ -3677,7 +3687,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ChannelPartnerLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ChannelPartnerLink();
-      var od = api.GoogleCloudChannelV1ChannelPartnerLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ChannelPartnerLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ChannelPartnerLink(
           od as api.GoogleCloudChannelV1ChannelPartnerLink);
     });
@@ -3688,8 +3700,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1CheckCloudIdentityAccountsExistRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1CheckCloudIdentityAccountsExistRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1CheckCloudIdentityAccountsExistRequest(
           od as api.GoogleCloudChannelV1CheckCloudIdentityAccountsExistRequest);
     });
@@ -3701,8 +3714,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudChannelV1CheckCloudIdentityAccountsExistResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1CheckCloudIdentityAccountsExistResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1CheckCloudIdentityAccountsExistResponse(od
           as api.GoogleCloudChannelV1CheckCloudIdentityAccountsExistResponse);
     });
@@ -3712,8 +3726,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1CloudIdentityCustomerAccount();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1CloudIdentityCustomerAccount.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1CloudIdentityCustomerAccount(
           od as api.GoogleCloudChannelV1CloudIdentityCustomerAccount);
     });
@@ -3722,7 +3737,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1CloudIdentityInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1CloudIdentityInfo();
-      var od = api.GoogleCloudChannelV1CloudIdentityInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1CloudIdentityInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1CloudIdentityInfo(
           od as api.GoogleCloudChannelV1CloudIdentityInfo);
     });
@@ -3731,7 +3748,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1CommitmentSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1CommitmentSettings();
-      var od = api.GoogleCloudChannelV1CommitmentSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1CommitmentSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1CommitmentSettings(
           od as api.GoogleCloudChannelV1CommitmentSettings);
     });
@@ -3740,7 +3759,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Constraints', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Constraints();
-      var od = api.GoogleCloudChannelV1Constraints.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Constraints.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Constraints(
           od as api.GoogleCloudChannelV1Constraints);
     });
@@ -3749,7 +3770,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ContactInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ContactInfo();
-      var od = api.GoogleCloudChannelV1ContactInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ContactInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ContactInfo(
           od as api.GoogleCloudChannelV1ContactInfo);
     });
@@ -3758,8 +3781,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1CreateEntitlementRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1CreateEntitlementRequest();
-      var od =
-          api.GoogleCloudChannelV1CreateEntitlementRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1CreateEntitlementRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1CreateEntitlementRequest(
           od as api.GoogleCloudChannelV1CreateEntitlementRequest);
     });
@@ -3768,7 +3792,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Customer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Customer();
-      var od = api.GoogleCloudChannelV1Customer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Customer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Customer(od as api.GoogleCloudChannelV1Customer);
     });
   });
@@ -3776,7 +3802,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1CustomerConstraints', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1CustomerConstraints();
-      var od = api.GoogleCloudChannelV1CustomerConstraints.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1CustomerConstraints.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1CustomerConstraints(
           od as api.GoogleCloudChannelV1CustomerConstraints);
     });
@@ -3785,7 +3813,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1CustomerEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1CustomerEvent();
-      var od = api.GoogleCloudChannelV1CustomerEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1CustomerEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1CustomerEvent(
           od as api.GoogleCloudChannelV1CustomerEvent);
     });
@@ -3794,7 +3824,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1EduData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1EduData();
-      var od = api.GoogleCloudChannelV1EduData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1EduData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1EduData(od as api.GoogleCloudChannelV1EduData);
     });
   });
@@ -3802,7 +3834,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Entitlement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Entitlement();
-      var od = api.GoogleCloudChannelV1Entitlement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Entitlement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Entitlement(
           od as api.GoogleCloudChannelV1Entitlement);
     });
@@ -3811,7 +3845,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1EntitlementEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1EntitlementEvent();
-      var od = api.GoogleCloudChannelV1EntitlementEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1EntitlementEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1EntitlementEvent(
           od as api.GoogleCloudChannelV1EntitlementEvent);
     });
@@ -3821,8 +3857,9 @@
       'obj-schema-GoogleCloudChannelV1ListChannelPartnerLinksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListChannelPartnerLinksResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1ListChannelPartnerLinksResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListChannelPartnerLinksResponse(
           od as api.GoogleCloudChannelV1ListChannelPartnerLinksResponse);
     });
@@ -3831,8 +3868,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ListCustomersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListCustomersResponse();
-      var od =
-          api.GoogleCloudChannelV1ListCustomersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ListCustomersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListCustomersResponse(
           od as api.GoogleCloudChannelV1ListCustomersResponse);
     });
@@ -3841,8 +3879,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ListEntitlementsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListEntitlementsResponse();
-      var od =
-          api.GoogleCloudChannelV1ListEntitlementsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ListEntitlementsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListEntitlementsResponse(
           od as api.GoogleCloudChannelV1ListEntitlementsResponse);
     });
@@ -3851,7 +3890,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ListOffersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListOffersResponse();
-      var od = api.GoogleCloudChannelV1ListOffersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ListOffersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListOffersResponse(
           od as api.GoogleCloudChannelV1ListOffersResponse);
     });
@@ -3860,8 +3901,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ListProductsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListProductsResponse();
-      var od =
-          api.GoogleCloudChannelV1ListProductsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ListProductsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListProductsResponse(
           od as api.GoogleCloudChannelV1ListProductsResponse);
     });
@@ -3871,8 +3913,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListPurchasableOffersResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1ListPurchasableOffersResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListPurchasableOffersResponse(
           od as api.GoogleCloudChannelV1ListPurchasableOffersResponse);
     });
@@ -3882,8 +3925,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListPurchasableSkusResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1ListPurchasableSkusResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListPurchasableSkusResponse(
           od as api.GoogleCloudChannelV1ListPurchasableSkusResponse);
     });
@@ -3892,7 +3936,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ListSkusResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListSkusResponse();
-      var od = api.GoogleCloudChannelV1ListSkusResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ListSkusResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListSkusResponse(
           od as api.GoogleCloudChannelV1ListSkusResponse);
     });
@@ -3901,8 +3947,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ListSubscribersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListSubscribersResponse();
-      var od =
-          api.GoogleCloudChannelV1ListSubscribersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ListSubscribersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListSubscribersResponse(
           od as api.GoogleCloudChannelV1ListSubscribersResponse);
     });
@@ -3912,8 +3959,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListTransferableOffersRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1ListTransferableOffersRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListTransferableOffersRequest(
           od as api.GoogleCloudChannelV1ListTransferableOffersRequest);
     });
@@ -3923,8 +3971,9 @@
       'obj-schema-GoogleCloudChannelV1ListTransferableOffersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListTransferableOffersResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1ListTransferableOffersResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListTransferableOffersResponse(
           od as api.GoogleCloudChannelV1ListTransferableOffersResponse);
     });
@@ -3934,8 +3983,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListTransferableSkusRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1ListTransferableSkusRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListTransferableSkusRequest(
           od as api.GoogleCloudChannelV1ListTransferableSkusRequest);
     });
@@ -3945,8 +3995,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ListTransferableSkusResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1ListTransferableSkusResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ListTransferableSkusResponse(
           od as api.GoogleCloudChannelV1ListTransferableSkusResponse);
     });
@@ -3955,7 +4006,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1MarketingInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1MarketingInfo();
-      var od = api.GoogleCloudChannelV1MarketingInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1MarketingInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1MarketingInfo(
           od as api.GoogleCloudChannelV1MarketingInfo);
     });
@@ -3964,7 +4017,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Media', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Media();
-      var od = api.GoogleCloudChannelV1Media.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Media.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Media(od as api.GoogleCloudChannelV1Media);
     });
   });
@@ -3972,7 +4027,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Offer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Offer();
-      var od = api.GoogleCloudChannelV1Offer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Offer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Offer(od as api.GoogleCloudChannelV1Offer);
     });
   });
@@ -3980,7 +4037,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1OperationMetadata();
-      var od = api.GoogleCloudChannelV1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1OperationMetadata(
           od as api.GoogleCloudChannelV1OperationMetadata);
     });
@@ -3989,7 +4048,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Parameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Parameter();
-      var od = api.GoogleCloudChannelV1Parameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Parameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Parameter(
           od as api.GoogleCloudChannelV1Parameter);
     });
@@ -3998,7 +4059,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ParameterDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ParameterDefinition();
-      var od = api.GoogleCloudChannelV1ParameterDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ParameterDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ParameterDefinition(
           od as api.GoogleCloudChannelV1ParameterDefinition);
     });
@@ -4007,7 +4070,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Period', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Period();
-      var od = api.GoogleCloudChannelV1Period.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Period.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Period(od as api.GoogleCloudChannelV1Period);
     });
   });
@@ -4015,7 +4080,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Plan', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Plan();
-      var od = api.GoogleCloudChannelV1Plan.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Plan.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Plan(od as api.GoogleCloudChannelV1Plan);
     });
   });
@@ -4023,7 +4090,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Price', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Price();
-      var od = api.GoogleCloudChannelV1Price.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Price.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Price(od as api.GoogleCloudChannelV1Price);
     });
   });
@@ -4031,7 +4100,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1PriceByResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1PriceByResource();
-      var od = api.GoogleCloudChannelV1PriceByResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1PriceByResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1PriceByResource(
           od as api.GoogleCloudChannelV1PriceByResource);
     });
@@ -4040,7 +4111,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1PricePhase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1PricePhase();
-      var od = api.GoogleCloudChannelV1PricePhase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1PricePhase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1PricePhase(
           od as api.GoogleCloudChannelV1PricePhase);
     });
@@ -4049,7 +4122,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1PriceTier', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1PriceTier();
-      var od = api.GoogleCloudChannelV1PriceTier.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1PriceTier.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1PriceTier(
           od as api.GoogleCloudChannelV1PriceTier);
     });
@@ -4058,7 +4133,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Product();
-      var od = api.GoogleCloudChannelV1Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Product.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Product(od as api.GoogleCloudChannelV1Product);
     });
   });
@@ -4067,8 +4144,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ProvisionCloudIdentityRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1ProvisionCloudIdentityRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ProvisionCloudIdentityRequest(
           od as api.GoogleCloudChannelV1ProvisionCloudIdentityRequest);
     });
@@ -4077,7 +4155,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1ProvisionedService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1ProvisionedService();
-      var od = api.GoogleCloudChannelV1ProvisionedService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1ProvisionedService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1ProvisionedService(
           od as api.GoogleCloudChannelV1ProvisionedService);
     });
@@ -4086,7 +4166,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1PurchasableOffer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1PurchasableOffer();
-      var od = api.GoogleCloudChannelV1PurchasableOffer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1PurchasableOffer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1PurchasableOffer(
           od as api.GoogleCloudChannelV1PurchasableOffer);
     });
@@ -4095,7 +4177,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1PurchasableSku', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1PurchasableSku();
-      var od = api.GoogleCloudChannelV1PurchasableSku.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1PurchasableSku.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1PurchasableSku(
           od as api.GoogleCloudChannelV1PurchasableSku);
     });
@@ -4105,8 +4189,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1RegisterSubscriberRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1RegisterSubscriberRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1RegisterSubscriberRequest(
           od as api.GoogleCloudChannelV1RegisterSubscriberRequest);
     });
@@ -4116,8 +4201,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1RegisterSubscriberResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1RegisterSubscriberResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1RegisterSubscriberResponse(
           od as api.GoogleCloudChannelV1RegisterSubscriberResponse);
     });
@@ -4126,7 +4212,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1RenewalSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1RenewalSettings();
-      var od = api.GoogleCloudChannelV1RenewalSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1RenewalSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1RenewalSettings(
           od as api.GoogleCloudChannelV1RenewalSettings);
     });
@@ -4135,7 +4223,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Sku', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Sku();
-      var od = api.GoogleCloudChannelV1Sku.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Sku.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Sku(od as api.GoogleCloudChannelV1Sku);
     });
   });
@@ -4143,8 +4233,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1StartPaidServiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1StartPaidServiceRequest();
-      var od =
-          api.GoogleCloudChannelV1StartPaidServiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1StartPaidServiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1StartPaidServiceRequest(
           od as api.GoogleCloudChannelV1StartPaidServiceRequest);
     });
@@ -4153,7 +4244,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1SubscriberEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1SubscriberEvent();
-      var od = api.GoogleCloudChannelV1SubscriberEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1SubscriberEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1SubscriberEvent(
           od as api.GoogleCloudChannelV1SubscriberEvent);
     });
@@ -4163,8 +4256,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1SuspendEntitlementRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1SuspendEntitlementRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1SuspendEntitlementRequest(
           od as api.GoogleCloudChannelV1SuspendEntitlementRequest);
     });
@@ -4173,7 +4267,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1TransferEligibility', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1TransferEligibility();
-      var od = api.GoogleCloudChannelV1TransferEligibility.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1TransferEligibility.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1TransferEligibility(
           od as api.GoogleCloudChannelV1TransferEligibility);
     });
@@ -4183,8 +4279,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1TransferEntitlementsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1TransferEntitlementsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1TransferEntitlementsRequest(
           od as api.GoogleCloudChannelV1TransferEntitlementsRequest);
     });
@@ -4194,8 +4291,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1TransferEntitlementsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1TransferEntitlementsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1TransferEntitlementsResponse(
           od as api.GoogleCloudChannelV1TransferEntitlementsResponse);
     });
@@ -4205,9 +4303,10 @@
       'obj-schema-GoogleCloudChannelV1TransferEntitlementsToGoogleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1TransferEntitlementsToGoogleRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudChannelV1TransferEntitlementsToGoogleRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1TransferEntitlementsToGoogleRequest(
           od as api.GoogleCloudChannelV1TransferEntitlementsToGoogleRequest);
     });
@@ -4216,7 +4315,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1TransferableOffer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1TransferableOffer();
-      var od = api.GoogleCloudChannelV1TransferableOffer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1TransferableOffer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1TransferableOffer(
           od as api.GoogleCloudChannelV1TransferableOffer);
     });
@@ -4225,7 +4326,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1TransferableSku', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1TransferableSku();
-      var od = api.GoogleCloudChannelV1TransferableSku.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1TransferableSku.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1TransferableSku(
           od as api.GoogleCloudChannelV1TransferableSku);
     });
@@ -4234,7 +4337,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1TrialSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1TrialSettings();
-      var od = api.GoogleCloudChannelV1TrialSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1TrialSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1TrialSettings(
           od as api.GoogleCloudChannelV1TrialSettings);
     });
@@ -4244,8 +4349,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1UnregisterSubscriberRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1UnregisterSubscriberRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1UnregisterSubscriberRequest(
           od as api.GoogleCloudChannelV1UnregisterSubscriberRequest);
     });
@@ -4255,8 +4361,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1UnregisterSubscriberResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1UnregisterSubscriberResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1UnregisterSubscriberResponse(
           od as api.GoogleCloudChannelV1UnregisterSubscriberResponse);
     });
@@ -4266,8 +4373,9 @@
       'obj-schema-GoogleCloudChannelV1UpdateChannelPartnerLinkRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1UpdateChannelPartnerLinkRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudChannelV1UpdateChannelPartnerLinkRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1UpdateChannelPartnerLinkRequest(
           od as api.GoogleCloudChannelV1UpdateChannelPartnerLinkRequest);
     });
@@ -4276,7 +4384,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1Value', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1Value();
-      var od = api.GoogleCloudChannelV1Value.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1Value.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1Value(od as api.GoogleCloudChannelV1Value);
     });
   });
@@ -4284,8 +4394,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1AssociationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1AssociationInfo();
-      var od =
-          api.GoogleCloudChannelV1alpha1AssociationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1AssociationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1AssociationInfo(
           od as api.GoogleCloudChannelV1alpha1AssociationInfo);
     });
@@ -4294,8 +4405,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1CommitmentSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1CommitmentSettings();
-      var od =
-          api.GoogleCloudChannelV1alpha1CommitmentSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1CommitmentSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1CommitmentSettings(
           od as api.GoogleCloudChannelV1alpha1CommitmentSettings);
     });
@@ -4304,7 +4416,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1CustomerEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1CustomerEvent();
-      var od = api.GoogleCloudChannelV1alpha1CustomerEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1CustomerEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1CustomerEvent(
           od as api.GoogleCloudChannelV1alpha1CustomerEvent);
     });
@@ -4313,7 +4427,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1Entitlement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1Entitlement();
-      var od = api.GoogleCloudChannelV1alpha1Entitlement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1Entitlement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1Entitlement(
           od as api.GoogleCloudChannelV1alpha1Entitlement);
     });
@@ -4322,8 +4438,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1EntitlementEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1EntitlementEvent();
-      var od =
-          api.GoogleCloudChannelV1alpha1EntitlementEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1EntitlementEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1EntitlementEvent(
           od as api.GoogleCloudChannelV1alpha1EntitlementEvent);
     });
@@ -4332,8 +4449,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1OperationMetadata();
-      var od =
-          api.GoogleCloudChannelV1alpha1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1OperationMetadata(
           od as api.GoogleCloudChannelV1alpha1OperationMetadata);
     });
@@ -4342,7 +4460,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1Parameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1Parameter();
-      var od = api.GoogleCloudChannelV1alpha1Parameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1Parameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1Parameter(
           od as api.GoogleCloudChannelV1alpha1Parameter);
     });
@@ -4351,7 +4471,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1Period', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1Period();
-      var od = api.GoogleCloudChannelV1alpha1Period.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1Period.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1Period(
           od as api.GoogleCloudChannelV1alpha1Period);
     });
@@ -4360,8 +4482,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1ProvisionedService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1ProvisionedService();
-      var od =
-          api.GoogleCloudChannelV1alpha1ProvisionedService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1ProvisionedService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1ProvisionedService(
           od as api.GoogleCloudChannelV1alpha1ProvisionedService);
     });
@@ -4370,8 +4493,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1RenewalSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1RenewalSettings();
-      var od =
-          api.GoogleCloudChannelV1alpha1RenewalSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1RenewalSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1RenewalSettings(
           od as api.GoogleCloudChannelV1alpha1RenewalSettings);
     });
@@ -4380,8 +4504,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1SubscriberEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1SubscriberEvent();
-      var od =
-          api.GoogleCloudChannelV1alpha1SubscriberEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1SubscriberEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1SubscriberEvent(
           od as api.GoogleCloudChannelV1alpha1SubscriberEvent);
     });
@@ -4391,9 +4516,10 @@
       'obj-schema-GoogleCloudChannelV1alpha1TransferEntitlementsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1TransferEntitlementsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudChannelV1alpha1TransferEntitlementsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1TransferEntitlementsResponse(
           od as api.GoogleCloudChannelV1alpha1TransferEntitlementsResponse);
     });
@@ -4402,7 +4528,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1TrialSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1TrialSettings();
-      var od = api.GoogleCloudChannelV1alpha1TrialSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1TrialSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1TrialSettings(
           od as api.GoogleCloudChannelV1alpha1TrialSettings);
     });
@@ -4411,7 +4539,9 @@
   unittest.group('obj-schema-GoogleCloudChannelV1alpha1Value', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudChannelV1alpha1Value();
-      var od = api.GoogleCloudChannelV1alpha1Value.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudChannelV1alpha1Value.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudChannelV1alpha1Value(
           od as api.GoogleCloudChannelV1alpha1Value);
     });
@@ -4420,7 +4550,9 @@
   unittest.group('obj-schema-GoogleLongrunningCancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningCancelOperationRequest();
-      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningCancelOperationRequest(
           od as api.GoogleLongrunningCancelOperationRequest);
     });
@@ -4429,7 +4561,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -4438,7 +4572,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -4446,7 +4582,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -4454,7 +4592,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
@@ -4462,7 +4602,9 @@
   unittest.group('obj-schema-GoogleTypeMoney', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeMoney();
-      var od = api.GoogleTypeMoney.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeMoney.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeMoney(od as api.GoogleTypeMoney);
     });
   });
@@ -4470,7 +4612,9 @@
   unittest.group('obj-schema-GoogleTypePostalAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypePostalAddress();
-      var od = api.GoogleTypePostalAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypePostalAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypePostalAddress(od as api.GoogleTypePostalAddress);
     });
   });
diff --git a/generated/googleapis/test/clouddebugger/v2_test.dart b/generated/googleapis/test/clouddebugger/v2_test.dart
index cd5bb55..c5d4378 100644
--- a/generated/googleapis/test/clouddebugger/v2_test.dart
+++ b/generated/googleapis/test/clouddebugger/v2_test.dart
@@ -1031,7 +1031,9 @@
   unittest.group('obj-schema-AliasContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAliasContext();
-      var od = api.AliasContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AliasContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAliasContext(od as api.AliasContext);
     });
   });
@@ -1039,7 +1041,9 @@
   unittest.group('obj-schema-Breakpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBreakpoint();
-      var od = api.Breakpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Breakpoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBreakpoint(od as api.Breakpoint);
     });
   });
@@ -1047,7 +1051,9 @@
   unittest.group('obj-schema-CloudRepoSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudRepoSourceContext();
-      var od = api.CloudRepoSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudRepoSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudRepoSourceContext(od as api.CloudRepoSourceContext);
     });
   });
@@ -1055,7 +1061,9 @@
   unittest.group('obj-schema-CloudWorkspaceId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudWorkspaceId();
-      var od = api.CloudWorkspaceId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudWorkspaceId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudWorkspaceId(od as api.CloudWorkspaceId);
     });
   });
@@ -1063,7 +1071,9 @@
   unittest.group('obj-schema-CloudWorkspaceSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudWorkspaceSourceContext();
-      var od = api.CloudWorkspaceSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudWorkspaceSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudWorkspaceSourceContext(od as api.CloudWorkspaceSourceContext);
     });
   });
@@ -1071,7 +1081,9 @@
   unittest.group('obj-schema-Debuggee', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDebuggee();
-      var od = api.Debuggee.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Debuggee.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDebuggee(od as api.Debuggee);
     });
   });
@@ -1079,7 +1091,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1087,7 +1100,9 @@
   unittest.group('obj-schema-ExtendedSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExtendedSourceContext();
-      var od = api.ExtendedSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExtendedSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExtendedSourceContext(od as api.ExtendedSourceContext);
     });
   });
@@ -1095,7 +1110,9 @@
   unittest.group('obj-schema-FormatMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFormatMessage();
-      var od = api.FormatMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FormatMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFormatMessage(od as api.FormatMessage);
     });
   });
@@ -1103,7 +1120,9 @@
   unittest.group('obj-schema-GerritSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGerritSourceContext();
-      var od = api.GerritSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GerritSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGerritSourceContext(od as api.GerritSourceContext);
     });
   });
@@ -1111,7 +1130,9 @@
   unittest.group('obj-schema-GetBreakpointResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetBreakpointResponse();
-      var od = api.GetBreakpointResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetBreakpointResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetBreakpointResponse(od as api.GetBreakpointResponse);
     });
   });
@@ -1119,7 +1140,9 @@
   unittest.group('obj-schema-GitSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGitSourceContext();
-      var od = api.GitSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GitSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGitSourceContext(od as api.GitSourceContext);
     });
   });
@@ -1127,7 +1150,9 @@
   unittest.group('obj-schema-ListActiveBreakpointsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListActiveBreakpointsResponse();
-      var od = api.ListActiveBreakpointsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListActiveBreakpointsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListActiveBreakpointsResponse(
           od as api.ListActiveBreakpointsResponse);
     });
@@ -1136,7 +1161,9 @@
   unittest.group('obj-schema-ListBreakpointsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBreakpointsResponse();
-      var od = api.ListBreakpointsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBreakpointsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBreakpointsResponse(od as api.ListBreakpointsResponse);
     });
   });
@@ -1144,7 +1171,9 @@
   unittest.group('obj-schema-ListDebuggeesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDebuggeesResponse();
-      var od = api.ListDebuggeesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDebuggeesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDebuggeesResponse(od as api.ListDebuggeesResponse);
     });
   });
@@ -1152,7 +1181,9 @@
   unittest.group('obj-schema-ProjectRepoId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectRepoId();
-      var od = api.ProjectRepoId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectRepoId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectRepoId(od as api.ProjectRepoId);
     });
   });
@@ -1160,7 +1191,9 @@
   unittest.group('obj-schema-RegisterDebuggeeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegisterDebuggeeRequest();
-      var od = api.RegisterDebuggeeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegisterDebuggeeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegisterDebuggeeRequest(od as api.RegisterDebuggeeRequest);
     });
   });
@@ -1168,7 +1201,9 @@
   unittest.group('obj-schema-RegisterDebuggeeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegisterDebuggeeResponse();
-      var od = api.RegisterDebuggeeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegisterDebuggeeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegisterDebuggeeResponse(od as api.RegisterDebuggeeResponse);
     });
   });
@@ -1176,7 +1211,9 @@
   unittest.group('obj-schema-RepoId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepoId();
-      var od = api.RepoId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RepoId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRepoId(od as api.RepoId);
     });
   });
@@ -1184,7 +1221,9 @@
   unittest.group('obj-schema-SetBreakpointResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetBreakpointResponse();
-      var od = api.SetBreakpointResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetBreakpointResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetBreakpointResponse(od as api.SetBreakpointResponse);
     });
   });
@@ -1192,7 +1231,9 @@
   unittest.group('obj-schema-SourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceContext();
-      var od = api.SourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceContext(od as api.SourceContext);
     });
   });
@@ -1200,7 +1241,9 @@
   unittest.group('obj-schema-SourceLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceLocation();
-      var od = api.SourceLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceLocation(od as api.SourceLocation);
     });
   });
@@ -1208,7 +1251,9 @@
   unittest.group('obj-schema-StackFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStackFrame();
-      var od = api.StackFrame.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.StackFrame.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStackFrame(od as api.StackFrame);
     });
   });
@@ -1216,7 +1261,9 @@
   unittest.group('obj-schema-StatusMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatusMessage();
-      var od = api.StatusMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StatusMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStatusMessage(od as api.StatusMessage);
     });
   });
@@ -1224,7 +1271,9 @@
   unittest.group('obj-schema-UpdateActiveBreakpointRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateActiveBreakpointRequest();
-      var od = api.UpdateActiveBreakpointRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateActiveBreakpointRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateActiveBreakpointRequest(
           od as api.UpdateActiveBreakpointRequest);
     });
@@ -1233,7 +1282,9 @@
   unittest.group('obj-schema-UpdateActiveBreakpointResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateActiveBreakpointResponse();
-      var od = api.UpdateActiveBreakpointResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateActiveBreakpointResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateActiveBreakpointResponse(
           od as api.UpdateActiveBreakpointResponse);
     });
@@ -1242,7 +1293,9 @@
   unittest.group('obj-schema-Variable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVariable();
-      var od = api.Variable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Variable.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVariable(od as api.Variable);
     });
   });
diff --git a/generated/googleapis/test/cloudfunctions/v1_test.dart b/generated/googleapis/test/cloudfunctions/v1_test.dart
index 18eb0c2..9d48f0e 100644
--- a/generated/googleapis/test/cloudfunctions/v1_test.dart
+++ b/generated/googleapis/test/cloudfunctions/v1_test.dart
@@ -1336,7 +1336,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1344,7 +1346,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1352,7 +1356,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1360,7 +1366,9 @@
   unittest.group('obj-schema-CallFunctionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCallFunctionRequest();
-      var od = api.CallFunctionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CallFunctionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCallFunctionRequest(od as api.CallFunctionRequest);
     });
   });
@@ -1368,7 +1376,9 @@
   unittest.group('obj-schema-CallFunctionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCallFunctionResponse();
-      var od = api.CallFunctionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CallFunctionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCallFunctionResponse(od as api.CallFunctionResponse);
     });
   });
@@ -1376,7 +1386,9 @@
   unittest.group('obj-schema-CloudFunction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudFunction();
-      var od = api.CloudFunction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudFunction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudFunction(od as api.CloudFunction);
     });
   });
@@ -1384,7 +1396,9 @@
   unittest.group('obj-schema-EventTrigger', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventTrigger();
-      var od = api.EventTrigger.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventTrigger.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventTrigger(od as api.EventTrigger);
     });
   });
@@ -1392,7 +1406,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1400,7 +1415,9 @@
   unittest.group('obj-schema-FailurePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFailurePolicy();
-      var od = api.FailurePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FailurePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFailurePolicy(od as api.FailurePolicy);
     });
   });
@@ -1408,7 +1425,9 @@
   unittest.group('obj-schema-GenerateDownloadUrlRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateDownloadUrlRequest();
-      var od = api.GenerateDownloadUrlRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateDownloadUrlRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateDownloadUrlRequest(od as api.GenerateDownloadUrlRequest);
     });
   });
@@ -1416,7 +1435,9 @@
   unittest.group('obj-schema-GenerateDownloadUrlResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateDownloadUrlResponse();
-      var od = api.GenerateDownloadUrlResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateDownloadUrlResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateDownloadUrlResponse(od as api.GenerateDownloadUrlResponse);
     });
   });
@@ -1424,7 +1445,9 @@
   unittest.group('obj-schema-GenerateUploadUrlRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateUploadUrlRequest();
-      var od = api.GenerateUploadUrlRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateUploadUrlRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateUploadUrlRequest(od as api.GenerateUploadUrlRequest);
     });
   });
@@ -1432,7 +1455,9 @@
   unittest.group('obj-schema-GenerateUploadUrlResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateUploadUrlResponse();
-      var od = api.GenerateUploadUrlResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateUploadUrlResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateUploadUrlResponse(od as api.GenerateUploadUrlResponse);
     });
   });
@@ -1440,7 +1465,9 @@
   unittest.group('obj-schema-HttpsTrigger', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpsTrigger();
-      var od = api.HttpsTrigger.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpsTrigger.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpsTrigger(od as api.HttpsTrigger);
     });
   });
@@ -1448,7 +1475,9 @@
   unittest.group('obj-schema-ListFunctionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFunctionsResponse();
-      var od = api.ListFunctionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFunctionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFunctionsResponse(od as api.ListFunctionsResponse);
     });
   });
@@ -1456,7 +1485,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1464,7 +1495,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1472,7 +1505,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1480,7 +1515,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1488,7 +1525,9 @@
   unittest.group('obj-schema-OperationMetadataV1', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadataV1();
-      var od = api.OperationMetadataV1.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadataV1.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadataV1(od as api.OperationMetadataV1);
     });
   });
@@ -1496,7 +1535,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1504,7 +1545,8 @@
   unittest.group('obj-schema-Retry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRetry();
-      var od = api.Retry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Retry.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRetry(od as api.Retry);
     });
   });
@@ -1512,7 +1554,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1520,7 +1564,9 @@
   unittest.group('obj-schema-SourceRepository', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceRepository();
-      var od = api.SourceRepository.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceRepository.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceRepository(od as api.SourceRepository);
     });
   });
@@ -1528,7 +1574,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1536,7 +1584,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1544,7 +1594,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis/test/cloudidentity/v1_test.dart b/generated/googleapis/test/cloudidentity/v1_test.dart
index bd91c5b..0c6f85d 100644
--- a/generated/googleapis/test/cloudidentity/v1_test.dart
+++ b/generated/googleapis/test/cloudidentity/v1_test.dart
@@ -2068,7 +2068,9 @@
   unittest.group('obj-schema-CheckTransitiveMembershipResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckTransitiveMembershipResponse();
-      var od = api.CheckTransitiveMembershipResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckTransitiveMembershipResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckTransitiveMembershipResponse(
           od as api.CheckTransitiveMembershipResponse);
     });
@@ -2077,7 +2079,9 @@
   unittest.group('obj-schema-DynamicGroupMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicGroupMetadata();
-      var od = api.DynamicGroupMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicGroupMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicGroupMetadata(od as api.DynamicGroupMetadata);
     });
   });
@@ -2085,7 +2089,9 @@
   unittest.group('obj-schema-DynamicGroupQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicGroupQuery();
-      var od = api.DynamicGroupQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicGroupQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicGroupQuery(od as api.DynamicGroupQuery);
     });
   });
@@ -2093,7 +2099,9 @@
   unittest.group('obj-schema-DynamicGroupStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicGroupStatus();
-      var od = api.DynamicGroupStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicGroupStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicGroupStatus(od as api.DynamicGroupStatus);
     });
   });
@@ -2101,7 +2109,9 @@
   unittest.group('obj-schema-EntityKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityKey();
-      var od = api.EntityKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EntityKey.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEntityKey(od as api.EntityKey);
     });
   });
@@ -2109,7 +2119,9 @@
   unittest.group('obj-schema-ExpiryDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpiryDetail();
-      var od = api.ExpiryDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExpiryDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExpiryDetail(od as api.ExpiryDetail);
     });
   });
@@ -2117,7 +2129,9 @@
   unittest.group('obj-schema-GetMembershipGraphResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetMembershipGraphResponse();
-      var od = api.GetMembershipGraphResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetMembershipGraphResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetMembershipGraphResponse(od as api.GetMembershipGraphResponse);
     });
   });
@@ -2126,8 +2140,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1AndroidAttributes();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAppsCloudidentityDevicesV1AndroidAttributes.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1AndroidAttributes(
           od as api.GoogleAppsCloudidentityDevicesV1AndroidAttributes);
     });
@@ -2138,9 +2153,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest(
           od as api.GoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest);
     });
@@ -2151,8 +2167,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse(
           od as api.GoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse);
     });
@@ -2162,9 +2179,10 @@
       'obj-schema-GoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest(
           od as api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest);
     });
@@ -2174,9 +2192,10 @@
       'obj-schema-GoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse(
           od as api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse);
     });
@@ -2186,9 +2205,10 @@
       'obj-schema-GoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest(
           od as api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest);
     });
@@ -2199,9 +2219,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse(
           od as api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse);
     });
@@ -2213,8 +2234,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest(od
           as api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest);
     });
@@ -2226,8 +2248,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse(od
           as api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse);
     });
@@ -2236,8 +2259,9 @@
   unittest.group('obj-schema-GoogleAppsCloudidentityDevicesV1ClientState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1ClientState();
-      var od =
-          api.GoogleAppsCloudidentityDevicesV1ClientState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsCloudidentityDevicesV1ClientState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1ClientState(
           od as api.GoogleAppsCloudidentityDevicesV1ClientState);
     });
@@ -2247,9 +2271,10 @@
       'obj-schema-GoogleAppsCloudidentityDevicesV1CustomAttributeValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1CustomAttributeValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAppsCloudidentityDevicesV1CustomAttributeValue.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1CustomAttributeValue(
           od as api.GoogleAppsCloudidentityDevicesV1CustomAttributeValue);
     });
@@ -2258,7 +2283,9 @@
   unittest.group('obj-schema-GoogleAppsCloudidentityDevicesV1Device', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1Device();
-      var od = api.GoogleAppsCloudidentityDevicesV1Device.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsCloudidentityDevicesV1Device.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1Device(
           od as api.GoogleAppsCloudidentityDevicesV1Device);
     });
@@ -2267,8 +2294,9 @@
   unittest.group('obj-schema-GoogleAppsCloudidentityDevicesV1DeviceUser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1DeviceUser();
-      var od =
-          api.GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1DeviceUser(
           od as api.GoogleAppsCloudidentityDevicesV1DeviceUser);
     });
@@ -2279,9 +2307,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1ListClientStatesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAppsCloudidentityDevicesV1ListClientStatesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1ListClientStatesResponse(
           od as api.GoogleAppsCloudidentityDevicesV1ListClientStatesResponse);
     });
@@ -2291,9 +2320,10 @@
       'obj-schema-GoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse(
           od as api.GoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse);
     });
@@ -2303,8 +2333,9 @@
       'obj-schema-GoogleAppsCloudidentityDevicesV1ListDevicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1ListDevicesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAppsCloudidentityDevicesV1ListDevicesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1ListDevicesResponse(
           od as api.GoogleAppsCloudidentityDevicesV1ListDevicesResponse);
     });
@@ -2316,8 +2347,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse(od
           as api.GoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse);
     });
@@ -2327,8 +2359,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1WipeDeviceRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAppsCloudidentityDevicesV1WipeDeviceRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1WipeDeviceRequest(
           od as api.GoogleAppsCloudidentityDevicesV1WipeDeviceRequest);
     });
@@ -2338,8 +2371,9 @@
       'obj-schema-GoogleAppsCloudidentityDevicesV1WipeDeviceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1WipeDeviceResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAppsCloudidentityDevicesV1WipeDeviceResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1WipeDeviceResponse(
           od as api.GoogleAppsCloudidentityDevicesV1WipeDeviceResponse);
     });
@@ -2349,9 +2383,10 @@
       'obj-schema-GoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest(
           od as api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest);
     });
@@ -2361,9 +2396,10 @@
       'obj-schema-GoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse(
           od as api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse);
     });
@@ -2372,7 +2408,8 @@
   unittest.group('obj-schema-Group', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroup();
-      var od = api.Group.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Group.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGroup(od as api.Group);
     });
   });
@@ -2380,7 +2417,9 @@
   unittest.group('obj-schema-GroupRelation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupRelation();
-      var od = api.GroupRelation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupRelation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupRelation(od as api.GroupRelation);
     });
   });
@@ -2388,7 +2427,9 @@
   unittest.group('obj-schema-ListGroupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGroupsResponse();
-      var od = api.ListGroupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGroupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGroupsResponse(od as api.ListGroupsResponse);
     });
   });
@@ -2396,7 +2437,9 @@
   unittest.group('obj-schema-ListMembershipsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMembershipsResponse();
-      var od = api.ListMembershipsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMembershipsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMembershipsResponse(od as api.ListMembershipsResponse);
     });
   });
@@ -2404,7 +2447,9 @@
   unittest.group('obj-schema-LookupGroupNameResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLookupGroupNameResponse();
-      var od = api.LookupGroupNameResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LookupGroupNameResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLookupGroupNameResponse(od as api.LookupGroupNameResponse);
     });
   });
@@ -2412,7 +2457,9 @@
   unittest.group('obj-schema-LookupMembershipNameResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLookupMembershipNameResponse();
-      var od = api.LookupMembershipNameResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LookupMembershipNameResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLookupMembershipNameResponse(od as api.LookupMembershipNameResponse);
     });
   });
@@ -2420,7 +2467,9 @@
   unittest.group('obj-schema-MemberRelation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMemberRelation();
-      var od = api.MemberRelation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MemberRelation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMemberRelation(od as api.MemberRelation);
     });
   });
@@ -2428,7 +2477,9 @@
   unittest.group('obj-schema-Membership', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembership();
-      var od = api.Membership.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Membership.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMembership(od as api.Membership);
     });
   });
@@ -2436,7 +2487,9 @@
   unittest.group('obj-schema-MembershipAdjacencyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembershipAdjacencyList();
-      var od = api.MembershipAdjacencyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MembershipAdjacencyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMembershipAdjacencyList(od as api.MembershipAdjacencyList);
     });
   });
@@ -2444,7 +2497,9 @@
   unittest.group('obj-schema-MembershipRole', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembershipRole();
-      var od = api.MembershipRole.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MembershipRole.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMembershipRole(od as api.MembershipRole);
     });
   });
@@ -2452,7 +2507,9 @@
   unittest.group('obj-schema-ModifyMembershipRolesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyMembershipRolesRequest();
-      var od = api.ModifyMembershipRolesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyMembershipRolesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyMembershipRolesRequest(od as api.ModifyMembershipRolesRequest);
     });
   });
@@ -2460,7 +2517,9 @@
   unittest.group('obj-schema-ModifyMembershipRolesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyMembershipRolesResponse();
-      var od = api.ModifyMembershipRolesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyMembershipRolesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyMembershipRolesResponse(
           od as api.ModifyMembershipRolesResponse);
     });
@@ -2469,7 +2528,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2477,7 +2538,9 @@
   unittest.group('obj-schema-SearchGroupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchGroupsResponse();
-      var od = api.SearchGroupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchGroupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchGroupsResponse(od as api.SearchGroupsResponse);
     });
   });
@@ -2485,7 +2548,9 @@
   unittest.group('obj-schema-SearchTransitiveGroupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchTransitiveGroupsResponse();
-      var od = api.SearchTransitiveGroupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchTransitiveGroupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchTransitiveGroupsResponse(
           od as api.SearchTransitiveGroupsResponse);
     });
@@ -2494,7 +2559,9 @@
   unittest.group('obj-schema-SearchTransitiveMembershipsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchTransitiveMembershipsResponse();
-      var od = api.SearchTransitiveMembershipsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchTransitiveMembershipsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchTransitiveMembershipsResponse(
           od as api.SearchTransitiveMembershipsResponse);
     });
@@ -2503,7 +2570,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2511,7 +2580,9 @@
   unittest.group('obj-schema-TransitiveMembershipRole', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransitiveMembershipRole();
-      var od = api.TransitiveMembershipRole.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransitiveMembershipRole.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransitiveMembershipRole(od as api.TransitiveMembershipRole);
     });
   });
@@ -2519,7 +2590,9 @@
   unittest.group('obj-schema-UpdateMembershipRolesParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateMembershipRolesParams();
-      var od = api.UpdateMembershipRolesParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateMembershipRolesParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateMembershipRolesParams(od as api.UpdateMembershipRolesParams);
     });
   });
@@ -2527,7 +2600,9 @@
   unittest.group('obj-schema-UserInvitation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserInvitation();
-      var od = api.UserInvitation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserInvitation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserInvitation(od as api.UserInvitation);
     });
   });
diff --git a/generated/googleapis/test/cloudiot/v1_test.dart b/generated/googleapis/test/cloudiot/v1_test.dart
index 4137a65..cee57b1 100644
--- a/generated/googleapis/test/cloudiot/v1_test.dart
+++ b/generated/googleapis/test/cloudiot/v1_test.dart
@@ -1288,7 +1288,9 @@
   unittest.group('obj-schema-BindDeviceToGatewayRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBindDeviceToGatewayRequest();
-      var od = api.BindDeviceToGatewayRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BindDeviceToGatewayRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBindDeviceToGatewayRequest(od as api.BindDeviceToGatewayRequest);
     });
   });
@@ -1296,7 +1298,9 @@
   unittest.group('obj-schema-BindDeviceToGatewayResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBindDeviceToGatewayResponse();
-      var od = api.BindDeviceToGatewayResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BindDeviceToGatewayResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBindDeviceToGatewayResponse(od as api.BindDeviceToGatewayResponse);
     });
   });
@@ -1304,7 +1308,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1312,7 +1318,9 @@
   unittest.group('obj-schema-Device', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDevice();
-      var od = api.Device.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Device.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDevice(od as api.Device);
     });
   });
@@ -1320,7 +1328,9 @@
   unittest.group('obj-schema-DeviceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceConfig();
-      var od = api.DeviceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceConfig(od as api.DeviceConfig);
     });
   });
@@ -1328,7 +1338,9 @@
   unittest.group('obj-schema-DeviceCredential', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceCredential();
-      var od = api.DeviceCredential.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceCredential.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceCredential(od as api.DeviceCredential);
     });
   });
@@ -1336,7 +1348,9 @@
   unittest.group('obj-schema-DeviceRegistry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceRegistry();
-      var od = api.DeviceRegistry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceRegistry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceRegistry(od as api.DeviceRegistry);
     });
   });
@@ -1344,7 +1358,9 @@
   unittest.group('obj-schema-DeviceState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceState();
-      var od = api.DeviceState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceState(od as api.DeviceState);
     });
   });
@@ -1352,7 +1368,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1360,7 +1377,9 @@
   unittest.group('obj-schema-EventNotificationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventNotificationConfig();
-      var od = api.EventNotificationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventNotificationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventNotificationConfig(od as api.EventNotificationConfig);
     });
   });
@@ -1368,7 +1387,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1376,7 +1396,9 @@
   unittest.group('obj-schema-GatewayConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGatewayConfig();
-      var od = api.GatewayConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GatewayConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGatewayConfig(od as api.GatewayConfig);
     });
   });
@@ -1384,7 +1406,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -1392,7 +1416,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -1400,7 +1426,9 @@
   unittest.group('obj-schema-HttpConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpConfig();
-      var od = api.HttpConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpConfig(od as api.HttpConfig);
     });
   });
@@ -1408,7 +1436,9 @@
   unittest.group('obj-schema-ListDeviceConfigVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDeviceConfigVersionsResponse();
-      var od = api.ListDeviceConfigVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDeviceConfigVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDeviceConfigVersionsResponse(
           od as api.ListDeviceConfigVersionsResponse);
     });
@@ -1417,7 +1447,9 @@
   unittest.group('obj-schema-ListDeviceRegistriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDeviceRegistriesResponse();
-      var od = api.ListDeviceRegistriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDeviceRegistriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDeviceRegistriesResponse(od as api.ListDeviceRegistriesResponse);
     });
   });
@@ -1425,7 +1457,9 @@
   unittest.group('obj-schema-ListDeviceStatesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDeviceStatesResponse();
-      var od = api.ListDeviceStatesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDeviceStatesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDeviceStatesResponse(od as api.ListDeviceStatesResponse);
     });
   });
@@ -1433,7 +1467,9 @@
   unittest.group('obj-schema-ListDevicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDevicesResponse();
-      var od = api.ListDevicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDevicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDevicesResponse(od as api.ListDevicesResponse);
     });
   });
@@ -1441,7 +1477,9 @@
   unittest.group('obj-schema-ModifyCloudToDeviceConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyCloudToDeviceConfigRequest();
-      var od = api.ModifyCloudToDeviceConfigRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyCloudToDeviceConfigRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyCloudToDeviceConfigRequest(
           od as api.ModifyCloudToDeviceConfigRequest);
     });
@@ -1450,7 +1488,9 @@
   unittest.group('obj-schema-MqttConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMqttConfig();
-      var od = api.MqttConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MqttConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMqttConfig(od as api.MqttConfig);
     });
   });
@@ -1458,7 +1498,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1466,7 +1508,9 @@
   unittest.group('obj-schema-PublicKeyCertificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublicKeyCertificate();
-      var od = api.PublicKeyCertificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublicKeyCertificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublicKeyCertificate(od as api.PublicKeyCertificate);
     });
   });
@@ -1474,7 +1518,9 @@
   unittest.group('obj-schema-PublicKeyCredential', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublicKeyCredential();
-      var od = api.PublicKeyCredential.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublicKeyCredential.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublicKeyCredential(od as api.PublicKeyCredential);
     });
   });
@@ -1482,7 +1528,9 @@
   unittest.group('obj-schema-RegistryCredential', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegistryCredential();
-      var od = api.RegistryCredential.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegistryCredential.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegistryCredential(od as api.RegistryCredential);
     });
   });
@@ -1490,7 +1538,9 @@
   unittest.group('obj-schema-SendCommandToDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSendCommandToDeviceRequest();
-      var od = api.SendCommandToDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SendCommandToDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSendCommandToDeviceRequest(od as api.SendCommandToDeviceRequest);
     });
   });
@@ -1498,7 +1548,9 @@
   unittest.group('obj-schema-SendCommandToDeviceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSendCommandToDeviceResponse();
-      var od = api.SendCommandToDeviceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SendCommandToDeviceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSendCommandToDeviceResponse(od as api.SendCommandToDeviceResponse);
     });
   });
@@ -1506,7 +1558,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1514,7 +1568,9 @@
   unittest.group('obj-schema-StateNotificationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStateNotificationConfig();
-      var od = api.StateNotificationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StateNotificationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStateNotificationConfig(od as api.StateNotificationConfig);
     });
   });
@@ -1522,7 +1578,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1530,7 +1588,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1538,7 +1598,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -1546,7 +1608,9 @@
   unittest.group('obj-schema-UnbindDeviceFromGatewayRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnbindDeviceFromGatewayRequest();
-      var od = api.UnbindDeviceFromGatewayRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnbindDeviceFromGatewayRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnbindDeviceFromGatewayRequest(
           od as api.UnbindDeviceFromGatewayRequest);
     });
@@ -1555,7 +1619,9 @@
   unittest.group('obj-schema-UnbindDeviceFromGatewayResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnbindDeviceFromGatewayResponse();
-      var od = api.UnbindDeviceFromGatewayResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnbindDeviceFromGatewayResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnbindDeviceFromGatewayResponse(
           od as api.UnbindDeviceFromGatewayResponse);
     });
@@ -1564,7 +1630,9 @@
   unittest.group('obj-schema-X509CertificateDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildX509CertificateDetails();
-      var od = api.X509CertificateDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.X509CertificateDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkX509CertificateDetails(od as api.X509CertificateDetails);
     });
   });
diff --git a/generated/googleapis/test/cloudkms/v1_test.dart b/generated/googleapis/test/cloudkms/v1_test.dart
index 47534b7..d042394 100644
--- a/generated/googleapis/test/cloudkms/v1_test.dart
+++ b/generated/googleapis/test/cloudkms/v1_test.dart
@@ -1525,7 +1525,9 @@
   unittest.group('obj-schema-AsymmetricDecryptRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsymmetricDecryptRequest();
-      var od = api.AsymmetricDecryptRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AsymmetricDecryptRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAsymmetricDecryptRequest(od as api.AsymmetricDecryptRequest);
     });
   });
@@ -1533,7 +1535,9 @@
   unittest.group('obj-schema-AsymmetricDecryptResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsymmetricDecryptResponse();
-      var od = api.AsymmetricDecryptResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AsymmetricDecryptResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAsymmetricDecryptResponse(od as api.AsymmetricDecryptResponse);
     });
   });
@@ -1541,7 +1545,9 @@
   unittest.group('obj-schema-AsymmetricSignRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsymmetricSignRequest();
-      var od = api.AsymmetricSignRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AsymmetricSignRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAsymmetricSignRequest(od as api.AsymmetricSignRequest);
     });
   });
@@ -1549,7 +1555,9 @@
   unittest.group('obj-schema-AsymmetricSignResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsymmetricSignResponse();
-      var od = api.AsymmetricSignResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AsymmetricSignResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAsymmetricSignResponse(od as api.AsymmetricSignResponse);
     });
   });
@@ -1557,7 +1565,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1565,7 +1575,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1573,7 +1585,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1581,7 +1595,9 @@
   unittest.group('obj-schema-CertificateChains', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCertificateChains();
-      var od = api.CertificateChains.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CertificateChains.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCertificateChains(od as api.CertificateChains);
     });
   });
@@ -1589,7 +1605,9 @@
   unittest.group('obj-schema-CryptoKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCryptoKey();
-      var od = api.CryptoKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CryptoKey.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCryptoKey(od as api.CryptoKey);
     });
   });
@@ -1597,7 +1615,9 @@
   unittest.group('obj-schema-CryptoKeyVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCryptoKeyVersion();
-      var od = api.CryptoKeyVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CryptoKeyVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCryptoKeyVersion(od as api.CryptoKeyVersion);
     });
   });
@@ -1605,7 +1625,9 @@
   unittest.group('obj-schema-CryptoKeyVersionTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCryptoKeyVersionTemplate();
-      var od = api.CryptoKeyVersionTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CryptoKeyVersionTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCryptoKeyVersionTemplate(od as api.CryptoKeyVersionTemplate);
     });
   });
@@ -1613,7 +1635,9 @@
   unittest.group('obj-schema-DecryptRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDecryptRequest();
-      var od = api.DecryptRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DecryptRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDecryptRequest(od as api.DecryptRequest);
     });
   });
@@ -1621,7 +1645,9 @@
   unittest.group('obj-schema-DecryptResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDecryptResponse();
-      var od = api.DecryptResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DecryptResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDecryptResponse(od as api.DecryptResponse);
     });
   });
@@ -1629,7 +1655,9 @@
   unittest.group('obj-schema-DestroyCryptoKeyVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDestroyCryptoKeyVersionRequest();
-      var od = api.DestroyCryptoKeyVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DestroyCryptoKeyVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDestroyCryptoKeyVersionRequest(
           od as api.DestroyCryptoKeyVersionRequest);
     });
@@ -1638,7 +1666,9 @@
   unittest.group('obj-schema-Digest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDigest();
-      var od = api.Digest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Digest.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDigest(od as api.Digest);
     });
   });
@@ -1646,7 +1676,9 @@
   unittest.group('obj-schema-EncryptRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncryptRequest();
-      var od = api.EncryptRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EncryptRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEncryptRequest(od as api.EncryptRequest);
     });
   });
@@ -1654,7 +1686,9 @@
   unittest.group('obj-schema-EncryptResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncryptResponse();
-      var od = api.EncryptResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EncryptResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEncryptResponse(od as api.EncryptResponse);
     });
   });
@@ -1662,7 +1696,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1670,7 +1705,9 @@
   unittest.group('obj-schema-ExternalProtectionLevelOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExternalProtectionLevelOptions();
-      var od = api.ExternalProtectionLevelOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExternalProtectionLevelOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExternalProtectionLevelOptions(
           od as api.ExternalProtectionLevelOptions);
     });
@@ -1679,7 +1716,9 @@
   unittest.group('obj-schema-ImportCryptoKeyVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportCryptoKeyVersionRequest();
-      var od = api.ImportCryptoKeyVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportCryptoKeyVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportCryptoKeyVersionRequest(
           od as api.ImportCryptoKeyVersionRequest);
     });
@@ -1688,7 +1727,9 @@
   unittest.group('obj-schema-ImportJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportJob();
-      var od = api.ImportJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ImportJob.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImportJob(od as api.ImportJob);
     });
   });
@@ -1696,7 +1737,9 @@
   unittest.group('obj-schema-KeyOperationAttestation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyOperationAttestation();
-      var od = api.KeyOperationAttestation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeyOperationAttestation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKeyOperationAttestation(od as api.KeyOperationAttestation);
     });
   });
@@ -1704,7 +1747,9 @@
   unittest.group('obj-schema-KeyRing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyRing();
-      var od = api.KeyRing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.KeyRing.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKeyRing(od as api.KeyRing);
     });
   });
@@ -1712,7 +1757,9 @@
   unittest.group('obj-schema-ListCryptoKeyVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCryptoKeyVersionsResponse();
-      var od = api.ListCryptoKeyVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCryptoKeyVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCryptoKeyVersionsResponse(
           od as api.ListCryptoKeyVersionsResponse);
     });
@@ -1721,7 +1768,9 @@
   unittest.group('obj-schema-ListCryptoKeysResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCryptoKeysResponse();
-      var od = api.ListCryptoKeysResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCryptoKeysResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCryptoKeysResponse(od as api.ListCryptoKeysResponse);
     });
   });
@@ -1729,7 +1778,9 @@
   unittest.group('obj-schema-ListImportJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListImportJobsResponse();
-      var od = api.ListImportJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListImportJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListImportJobsResponse(od as api.ListImportJobsResponse);
     });
   });
@@ -1737,7 +1788,9 @@
   unittest.group('obj-schema-ListKeyRingsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListKeyRingsResponse();
-      var od = api.ListKeyRingsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListKeyRingsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListKeyRingsResponse(od as api.ListKeyRingsResponse);
     });
   });
@@ -1745,7 +1798,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1753,7 +1808,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1761,7 +1818,9 @@
   unittest.group('obj-schema-LocationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationMetadata();
-      var od = api.LocationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationMetadata(od as api.LocationMetadata);
     });
   });
@@ -1769,7 +1828,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1777,7 +1838,9 @@
   unittest.group('obj-schema-PublicKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublicKey();
-      var od = api.PublicKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PublicKey.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPublicKey(od as api.PublicKey);
     });
   });
@@ -1785,7 +1848,9 @@
   unittest.group('obj-schema-RestoreCryptoKeyVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreCryptoKeyVersionRequest();
-      var od = api.RestoreCryptoKeyVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreCryptoKeyVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreCryptoKeyVersionRequest(
           od as api.RestoreCryptoKeyVersionRequest);
     });
@@ -1794,7 +1859,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1802,7 +1869,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1810,7 +1879,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -1818,7 +1889,9 @@
   unittest.group('obj-schema-UpdateCryptoKeyPrimaryVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateCryptoKeyPrimaryVersionRequest();
-      var od = api.UpdateCryptoKeyPrimaryVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateCryptoKeyPrimaryVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateCryptoKeyPrimaryVersionRequest(
           od as api.UpdateCryptoKeyPrimaryVersionRequest);
     });
@@ -1827,7 +1900,9 @@
   unittest.group('obj-schema-WrappingPublicKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWrappingPublicKey();
-      var od = api.WrappingPublicKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WrappingPublicKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWrappingPublicKey(od as api.WrappingPublicKey);
     });
   });
diff --git a/generated/googleapis/test/cloudprofiler/v2_test.dart b/generated/googleapis/test/cloudprofiler/v2_test.dart
index 05c166a..35e0590 100644
--- a/generated/googleapis/test/cloudprofiler/v2_test.dart
+++ b/generated/googleapis/test/cloudprofiler/v2_test.dart
@@ -179,7 +179,9 @@
   unittest.group('obj-schema-CreateProfileRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateProfileRequest();
-      var od = api.CreateProfileRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateProfileRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateProfileRequest(od as api.CreateProfileRequest);
     });
   });
@@ -187,7 +189,9 @@
   unittest.group('obj-schema-Deployment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployment();
-      var od = api.Deployment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Deployment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeployment(od as api.Deployment);
     });
   });
@@ -195,7 +199,9 @@
   unittest.group('obj-schema-Profile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfile();
-      var od = api.Profile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Profile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProfile(od as api.Profile);
     });
   });
diff --git a/generated/googleapis/test/cloudresourcemanager/v1_test.dart b/generated/googleapis/test/cloudresourcemanager/v1_test.dart
index ba098c7..6dc8c22 100644
--- a/generated/googleapis/test/cloudresourcemanager/v1_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v1_test.dart
@@ -1779,7 +1779,9 @@
   unittest.group('obj-schema-Ancestor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAncestor();
-      var od = api.Ancestor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Ancestor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAncestor(od as api.Ancestor);
     });
   });
@@ -1787,7 +1789,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1795,7 +1799,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1803,7 +1809,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1811,7 +1819,9 @@
   unittest.group('obj-schema-BooleanConstraint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBooleanConstraint();
-      var od = api.BooleanConstraint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BooleanConstraint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBooleanConstraint(od as api.BooleanConstraint);
     });
   });
@@ -1819,7 +1829,9 @@
   unittest.group('obj-schema-BooleanPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBooleanPolicy();
-      var od = api.BooleanPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BooleanPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBooleanPolicy(od as api.BooleanPolicy);
     });
   });
@@ -1827,7 +1839,9 @@
   unittest.group('obj-schema-ClearOrgPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClearOrgPolicyRequest();
-      var od = api.ClearOrgPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClearOrgPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClearOrgPolicyRequest(od as api.ClearOrgPolicyRequest);
     });
   });
@@ -1838,9 +1852,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildCloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.CloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation(
           od as api
               .CloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation);
@@ -1853,9 +1868,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildCloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.CloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation(
           od as api
               .CloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation);
@@ -1865,7 +1881,9 @@
   unittest.group('obj-schema-Constraint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConstraint();
-      var od = api.Constraint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Constraint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkConstraint(od as api.Constraint);
     });
   });
@@ -1873,7 +1891,9 @@
   unittest.group('obj-schema-CreateTagKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTagKeyMetadata();
-      var od = api.CreateTagKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTagKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTagKeyMetadata(od as api.CreateTagKeyMetadata);
     });
   });
@@ -1881,7 +1901,9 @@
   unittest.group('obj-schema-CreateTagValueMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTagValueMetadata();
-      var od = api.CreateTagValueMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTagValueMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTagValueMetadata(od as api.CreateTagValueMetadata);
     });
   });
@@ -1889,7 +1911,9 @@
   unittest.group('obj-schema-DeleteTagKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTagKeyMetadata();
-      var od = api.DeleteTagKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTagKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTagKeyMetadata(od as api.DeleteTagKeyMetadata);
     });
   });
@@ -1897,7 +1921,9 @@
   unittest.group('obj-schema-DeleteTagValueMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTagValueMetadata();
-      var od = api.DeleteTagValueMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTagValueMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTagValueMetadata(od as api.DeleteTagValueMetadata);
     });
   });
@@ -1905,7 +1931,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1913,7 +1940,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1921,7 +1949,9 @@
   unittest.group('obj-schema-FolderOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolderOperation();
-      var od = api.FolderOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FolderOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFolderOperation(od as api.FolderOperation);
     });
   });
@@ -1929,7 +1959,9 @@
   unittest.group('obj-schema-FolderOperationError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolderOperationError();
-      var od = api.FolderOperationError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FolderOperationError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFolderOperationError(od as api.FolderOperationError);
     });
   });
@@ -1937,7 +1969,9 @@
   unittest.group('obj-schema-GetAncestryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetAncestryRequest();
-      var od = api.GetAncestryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetAncestryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetAncestryRequest(od as api.GetAncestryRequest);
     });
   });
@@ -1945,7 +1979,9 @@
   unittest.group('obj-schema-GetAncestryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetAncestryResponse();
-      var od = api.GetAncestryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetAncestryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetAncestryResponse(od as api.GetAncestryResponse);
     });
   });
@@ -1953,7 +1989,9 @@
   unittest.group('obj-schema-GetEffectiveOrgPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetEffectiveOrgPolicyRequest();
-      var od = api.GetEffectiveOrgPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetEffectiveOrgPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetEffectiveOrgPolicyRequest(od as api.GetEffectiveOrgPolicyRequest);
     });
   });
@@ -1961,7 +1999,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -1969,7 +2009,9 @@
   unittest.group('obj-schema-GetOrgPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetOrgPolicyRequest();
-      var od = api.GetOrgPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetOrgPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetOrgPolicyRequest(od as api.GetOrgPolicyRequest);
     });
   });
@@ -1977,7 +2019,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -1985,7 +2029,8 @@
   unittest.group('obj-schema-Lien', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLien();
-      var od = api.Lien.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Lien.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLien(od as api.Lien);
     });
   });
@@ -1993,8 +2038,9 @@
   unittest.group('obj-schema-ListAvailableOrgPolicyConstraintsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAvailableOrgPolicyConstraintsRequest();
-      var od =
-          api.ListAvailableOrgPolicyConstraintsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAvailableOrgPolicyConstraintsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAvailableOrgPolicyConstraintsRequest(
           od as api.ListAvailableOrgPolicyConstraintsRequest);
     });
@@ -2003,8 +2049,9 @@
   unittest.group('obj-schema-ListAvailableOrgPolicyConstraintsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAvailableOrgPolicyConstraintsResponse();
-      var od =
-          api.ListAvailableOrgPolicyConstraintsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAvailableOrgPolicyConstraintsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAvailableOrgPolicyConstraintsResponse(
           od as api.ListAvailableOrgPolicyConstraintsResponse);
     });
@@ -2013,7 +2060,9 @@
   unittest.group('obj-schema-ListConstraint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListConstraint();
-      var od = api.ListConstraint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListConstraint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListConstraint(od as api.ListConstraint);
     });
   });
@@ -2021,7 +2070,9 @@
   unittest.group('obj-schema-ListLiensResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLiensResponse();
-      var od = api.ListLiensResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLiensResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLiensResponse(od as api.ListLiensResponse);
     });
   });
@@ -2029,7 +2080,9 @@
   unittest.group('obj-schema-ListOrgPoliciesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOrgPoliciesRequest();
-      var od = api.ListOrgPoliciesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOrgPoliciesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOrgPoliciesRequest(od as api.ListOrgPoliciesRequest);
     });
   });
@@ -2037,7 +2090,9 @@
   unittest.group('obj-schema-ListOrgPoliciesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOrgPoliciesResponse();
-      var od = api.ListOrgPoliciesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOrgPoliciesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOrgPoliciesResponse(od as api.ListOrgPoliciesResponse);
     });
   });
@@ -2045,7 +2100,9 @@
   unittest.group('obj-schema-ListPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPolicy();
-      var od = api.ListPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ListPolicy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkListPolicy(od as api.ListPolicy);
     });
   });
@@ -2053,7 +2110,9 @@
   unittest.group('obj-schema-ListProjectsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListProjectsResponse();
-      var od = api.ListProjectsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListProjectsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListProjectsResponse(od as api.ListProjectsResponse);
     });
   });
@@ -2061,7 +2120,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2069,7 +2130,9 @@
   unittest.group('obj-schema-OrgPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrgPolicy();
-      var od = api.OrgPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OrgPolicy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrgPolicy(od as api.OrgPolicy);
     });
   });
@@ -2077,7 +2140,9 @@
   unittest.group('obj-schema-Organization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrganization();
-      var od = api.Organization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Organization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrganization(od as api.Organization);
     });
   });
@@ -2085,7 +2150,9 @@
   unittest.group('obj-schema-OrganizationOwner', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrganizationOwner();
-      var od = api.OrganizationOwner.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrganizationOwner.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrganizationOwner(od as api.OrganizationOwner);
     });
   });
@@ -2093,7 +2160,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2101,7 +2170,9 @@
   unittest.group('obj-schema-Project', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProject();
-      var od = api.Project.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Project.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProject(od as api.Project);
     });
   });
@@ -2109,7 +2180,9 @@
   unittest.group('obj-schema-ProjectCreationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectCreationStatus();
-      var od = api.ProjectCreationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectCreationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectCreationStatus(od as api.ProjectCreationStatus);
     });
   });
@@ -2117,7 +2190,9 @@
   unittest.group('obj-schema-ResourceId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceId();
-      var od = api.ResourceId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ResourceId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResourceId(od as api.ResourceId);
     });
   });
@@ -2125,7 +2200,9 @@
   unittest.group('obj-schema-RestoreDefault', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreDefault();
-      var od = api.RestoreDefault.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreDefault.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreDefault(od as api.RestoreDefault);
     });
   });
@@ -2133,7 +2210,9 @@
   unittest.group('obj-schema-SearchOrganizationsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchOrganizationsRequest();
-      var od = api.SearchOrganizationsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchOrganizationsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchOrganizationsRequest(od as api.SearchOrganizationsRequest);
     });
   });
@@ -2141,7 +2220,9 @@
   unittest.group('obj-schema-SearchOrganizationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchOrganizationsResponse();
-      var od = api.SearchOrganizationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchOrganizationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchOrganizationsResponse(od as api.SearchOrganizationsResponse);
     });
   });
@@ -2149,7 +2230,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -2157,7 +2240,9 @@
   unittest.group('obj-schema-SetOrgPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetOrgPolicyRequest();
-      var od = api.SetOrgPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetOrgPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetOrgPolicyRequest(od as api.SetOrgPolicyRequest);
     });
   });
@@ -2165,7 +2250,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2173,7 +2260,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2181,7 +2270,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -2189,7 +2280,9 @@
   unittest.group('obj-schema-UndeleteProjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteProjectRequest();
-      var od = api.UndeleteProjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteProjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteProjectRequest(od as api.UndeleteProjectRequest);
     });
   });
@@ -2197,7 +2290,9 @@
   unittest.group('obj-schema-UpdateTagKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTagKeyMetadata();
-      var od = api.UpdateTagKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTagKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTagKeyMetadata(od as api.UpdateTagKeyMetadata);
     });
   });
@@ -2205,7 +2300,9 @@
   unittest.group('obj-schema-UpdateTagValueMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTagValueMetadata();
-      var od = api.UpdateTagValueMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTagValueMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTagValueMetadata(od as api.UpdateTagValueMetadata);
     });
   });
diff --git a/generated/googleapis/test/cloudresourcemanager/v2_test.dart b/generated/googleapis/test/cloudresourcemanager/v2_test.dart
index 30c454b..9663737 100644
--- a/generated/googleapis/test/cloudresourcemanager/v2_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v2_test.dart
@@ -1054,7 +1054,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1062,7 +1064,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1070,7 +1074,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1081,9 +1087,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildCloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.CloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation(
           od as api
               .CloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation);
@@ -1096,9 +1103,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildCloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.CloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation(
           od as api
               .CloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation);
@@ -1108,7 +1116,9 @@
   unittest.group('obj-schema-CreateTagKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTagKeyMetadata();
-      var od = api.CreateTagKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTagKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTagKeyMetadata(od as api.CreateTagKeyMetadata);
     });
   });
@@ -1116,7 +1126,9 @@
   unittest.group('obj-schema-CreateTagValueMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTagValueMetadata();
-      var od = api.CreateTagValueMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTagValueMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTagValueMetadata(od as api.CreateTagValueMetadata);
     });
   });
@@ -1124,7 +1136,9 @@
   unittest.group('obj-schema-DeleteTagKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTagKeyMetadata();
-      var od = api.DeleteTagKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTagKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTagKeyMetadata(od as api.DeleteTagKeyMetadata);
     });
   });
@@ -1132,7 +1146,9 @@
   unittest.group('obj-schema-DeleteTagValueMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTagValueMetadata();
-      var od = api.DeleteTagValueMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTagValueMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTagValueMetadata(od as api.DeleteTagValueMetadata);
     });
   });
@@ -1140,7 +1156,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1148,7 +1165,9 @@
   unittest.group('obj-schema-Folder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolder();
-      var od = api.Folder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Folder.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFolder(od as api.Folder);
     });
   });
@@ -1156,7 +1175,9 @@
   unittest.group('obj-schema-FolderOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolderOperation();
-      var od = api.FolderOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FolderOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFolderOperation(od as api.FolderOperation);
     });
   });
@@ -1164,7 +1185,9 @@
   unittest.group('obj-schema-FolderOperationError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolderOperationError();
-      var od = api.FolderOperationError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FolderOperationError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFolderOperationError(od as api.FolderOperationError);
     });
   });
@@ -1172,7 +1195,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -1180,7 +1205,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -1188,7 +1215,9 @@
   unittest.group('obj-schema-ListFoldersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFoldersResponse();
-      var od = api.ListFoldersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFoldersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFoldersResponse(od as api.ListFoldersResponse);
     });
   });
@@ -1196,7 +1225,9 @@
   unittest.group('obj-schema-MoveFolderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoveFolderRequest();
-      var od = api.MoveFolderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MoveFolderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMoveFolderRequest(od as api.MoveFolderRequest);
     });
   });
@@ -1204,7 +1235,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1212,7 +1245,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1220,7 +1255,9 @@
   unittest.group('obj-schema-ProjectCreationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectCreationStatus();
-      var od = api.ProjectCreationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectCreationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectCreationStatus(od as api.ProjectCreationStatus);
     });
   });
@@ -1228,7 +1265,9 @@
   unittest.group('obj-schema-SearchFoldersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchFoldersRequest();
-      var od = api.SearchFoldersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchFoldersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchFoldersRequest(od as api.SearchFoldersRequest);
     });
   });
@@ -1236,7 +1275,9 @@
   unittest.group('obj-schema-SearchFoldersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchFoldersResponse();
-      var od = api.SearchFoldersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchFoldersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchFoldersResponse(od as api.SearchFoldersResponse);
     });
   });
@@ -1244,7 +1285,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1252,7 +1295,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1260,7 +1305,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1268,7 +1315,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -1276,7 +1325,9 @@
   unittest.group('obj-schema-UndeleteFolderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteFolderRequest();
-      var od = api.UndeleteFolderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteFolderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteFolderRequest(od as api.UndeleteFolderRequest);
     });
   });
@@ -1284,7 +1335,9 @@
   unittest.group('obj-schema-UpdateTagKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTagKeyMetadata();
-      var od = api.UpdateTagKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTagKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTagKeyMetadata(od as api.UpdateTagKeyMetadata);
     });
   });
@@ -1292,7 +1345,9 @@
   unittest.group('obj-schema-UpdateTagValueMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTagValueMetadata();
-      var od = api.UpdateTagValueMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTagValueMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTagValueMetadata(od as api.UpdateTagValueMetadata);
     });
   });
diff --git a/generated/googleapis/test/cloudresourcemanager/v3_test.dart b/generated/googleapis/test/cloudresourcemanager/v3_test.dart
index f3579b5..aa54209 100644
--- a/generated/googleapis/test/cloudresourcemanager/v3_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v3_test.dart
@@ -1241,7 +1241,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1249,7 +1251,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1257,7 +1261,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1268,9 +1274,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildCloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.CloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation(
           od as api
               .CloudresourcemanagerGoogleCloudResourcemanagerV2alpha1FolderOperation);
@@ -1283,9 +1290,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildCloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.CloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation(
           od as api
               .CloudresourcemanagerGoogleCloudResourcemanagerV2beta1FolderOperation);
@@ -1295,7 +1303,9 @@
   unittest.group('obj-schema-CreateTagKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTagKeyMetadata();
-      var od = api.CreateTagKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTagKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTagKeyMetadata(od as api.CreateTagKeyMetadata);
     });
   });
@@ -1303,7 +1313,9 @@
   unittest.group('obj-schema-CreateTagValueMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTagValueMetadata();
-      var od = api.CreateTagValueMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTagValueMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTagValueMetadata(od as api.CreateTagValueMetadata);
     });
   });
@@ -1311,7 +1323,9 @@
   unittest.group('obj-schema-DeleteTagKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTagKeyMetadata();
-      var od = api.DeleteTagKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTagKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTagKeyMetadata(od as api.DeleteTagKeyMetadata);
     });
   });
@@ -1319,7 +1333,9 @@
   unittest.group('obj-schema-DeleteTagValueMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTagValueMetadata();
-      var od = api.DeleteTagValueMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTagValueMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTagValueMetadata(od as api.DeleteTagValueMetadata);
     });
   });
@@ -1327,7 +1343,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1335,7 +1352,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1343,7 +1361,9 @@
   unittest.group('obj-schema-FolderOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolderOperation();
-      var od = api.FolderOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FolderOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFolderOperation(od as api.FolderOperation);
     });
   });
@@ -1351,7 +1371,9 @@
   unittest.group('obj-schema-FolderOperationError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolderOperationError();
-      var od = api.FolderOperationError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FolderOperationError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFolderOperationError(od as api.FolderOperationError);
     });
   });
@@ -1359,7 +1381,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -1367,7 +1391,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -1375,7 +1401,8 @@
   unittest.group('obj-schema-Lien', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLien();
-      var od = api.Lien.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Lien.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLien(od as api.Lien);
     });
   });
@@ -1383,7 +1410,9 @@
   unittest.group('obj-schema-ListLiensResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLiensResponse();
-      var od = api.ListLiensResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLiensResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLiensResponse(od as api.ListLiensResponse);
     });
   });
@@ -1391,7 +1420,9 @@
   unittest.group('obj-schema-ListTagBindingsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTagBindingsResponse();
-      var od = api.ListTagBindingsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTagBindingsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTagBindingsResponse(od as api.ListTagBindingsResponse);
     });
   });
@@ -1399,7 +1430,9 @@
   unittest.group('obj-schema-ListTagKeysResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTagKeysResponse();
-      var od = api.ListTagKeysResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTagKeysResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTagKeysResponse(od as api.ListTagKeysResponse);
     });
   });
@@ -1407,7 +1440,9 @@
   unittest.group('obj-schema-ListTagValuesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTagValuesResponse();
-      var od = api.ListTagValuesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTagValuesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTagValuesResponse(od as api.ListTagValuesResponse);
     });
   });
@@ -1415,7 +1450,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1423,7 +1460,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1431,7 +1470,9 @@
   unittest.group('obj-schema-ProjectCreationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectCreationStatus();
-      var od = api.ProjectCreationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectCreationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectCreationStatus(od as api.ProjectCreationStatus);
     });
   });
@@ -1439,7 +1480,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1447,7 +1490,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1455,7 +1500,9 @@
   unittest.group('obj-schema-TagBinding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTagBinding();
-      var od = api.TagBinding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TagBinding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTagBinding(od as api.TagBinding);
     });
   });
@@ -1463,7 +1510,9 @@
   unittest.group('obj-schema-TagKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTagKey();
-      var od = api.TagKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TagKey.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTagKey(od as api.TagKey);
     });
   });
@@ -1471,7 +1520,9 @@
   unittest.group('obj-schema-TagValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTagValue();
-      var od = api.TagValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TagValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTagValue(od as api.TagValue);
     });
   });
@@ -1479,7 +1530,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1487,7 +1540,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -1495,7 +1550,9 @@
   unittest.group('obj-schema-UpdateTagKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTagKeyMetadata();
-      var od = api.UpdateTagKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTagKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTagKeyMetadata(od as api.UpdateTagKeyMetadata);
     });
   });
@@ -1503,7 +1560,9 @@
   unittest.group('obj-schema-UpdateTagValueMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTagValueMetadata();
-      var od = api.UpdateTagValueMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTagValueMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTagValueMetadata(od as api.UpdateTagValueMetadata);
     });
   });
diff --git a/generated/googleapis/test/cloudscheduler/v1_test.dart b/generated/googleapis/test/cloudscheduler/v1_test.dart
index 26c52d7..fd88d04 100644
--- a/generated/googleapis/test/cloudscheduler/v1_test.dart
+++ b/generated/googleapis/test/cloudscheduler/v1_test.dart
@@ -779,7 +779,9 @@
   unittest.group('obj-schema-AppEngineHttpTarget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppEngineHttpTarget();
-      var od = api.AppEngineHttpTarget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppEngineHttpTarget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppEngineHttpTarget(od as api.AppEngineHttpTarget);
     });
   });
@@ -787,7 +789,9 @@
   unittest.group('obj-schema-AppEngineRouting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppEngineRouting();
-      var od = api.AppEngineRouting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppEngineRouting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppEngineRouting(od as api.AppEngineRouting);
     });
   });
@@ -795,7 +799,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -803,7 +808,9 @@
   unittest.group('obj-schema-HttpTarget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpTarget();
-      var od = api.HttpTarget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpTarget.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpTarget(od as api.HttpTarget);
     });
   });
@@ -811,7 +818,8 @@
   unittest.group('obj-schema-Job', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJob();
-      var od = api.Job.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Job.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJob(od as api.Job);
     });
   });
@@ -819,7 +827,9 @@
   unittest.group('obj-schema-ListJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListJobsResponse();
-      var od = api.ListJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
@@ -827,7 +837,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -835,7 +847,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -843,7 +857,9 @@
   unittest.group('obj-schema-OAuthToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOAuthToken();
-      var od = api.OAuthToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OAuthToken.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOAuthToken(od as api.OAuthToken);
     });
   });
@@ -851,7 +867,9 @@
   unittest.group('obj-schema-OidcToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOidcToken();
-      var od = api.OidcToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OidcToken.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOidcToken(od as api.OidcToken);
     });
   });
@@ -859,7 +877,9 @@
   unittest.group('obj-schema-PauseJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPauseJobRequest();
-      var od = api.PauseJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PauseJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPauseJobRequest(od as api.PauseJobRequest);
     });
   });
@@ -867,7 +887,9 @@
   unittest.group('obj-schema-PubsubMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubsubMessage();
-      var od = api.PubsubMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PubsubMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPubsubMessage(od as api.PubsubMessage);
     });
   });
@@ -875,7 +897,9 @@
   unittest.group('obj-schema-PubsubTarget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubsubTarget();
-      var od = api.PubsubTarget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PubsubTarget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPubsubTarget(od as api.PubsubTarget);
     });
   });
@@ -883,7 +907,9 @@
   unittest.group('obj-schema-ResumeJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResumeJobRequest();
-      var od = api.ResumeJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResumeJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResumeJobRequest(od as api.ResumeJobRequest);
     });
   });
@@ -891,7 +917,9 @@
   unittest.group('obj-schema-RetryConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRetryConfig();
-      var od = api.RetryConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RetryConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRetryConfig(od as api.RetryConfig);
     });
   });
@@ -899,7 +927,9 @@
   unittest.group('obj-schema-RunJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunJobRequest();
-      var od = api.RunJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunJobRequest(od as api.RunJobRequest);
     });
   });
@@ -907,7 +937,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
diff --git a/generated/googleapis/test/cloudsearch/v1_test.dart b/generated/googleapis/test/cloudsearch/v1_test.dart
index 324caf4..5ceb51a 100644
--- a/generated/googleapis/test/cloudsearch/v1_test.dart
+++ b/generated/googleapis/test/cloudsearch/v1_test.dart
@@ -5239,7 +5239,9 @@
   unittest.group('obj-schema-BooleanOperatorOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBooleanOperatorOptions();
-      var od = api.BooleanOperatorOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BooleanOperatorOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBooleanOperatorOptions(od as api.BooleanOperatorOptions);
     });
   });
@@ -5247,7 +5249,9 @@
   unittest.group('obj-schema-BooleanPropertyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBooleanPropertyOptions();
-      var od = api.BooleanPropertyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BooleanPropertyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBooleanPropertyOptions(od as api.BooleanPropertyOptions);
     });
   });
@@ -5255,7 +5259,9 @@
   unittest.group('obj-schema-CheckAccessResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckAccessResponse();
-      var od = api.CheckAccessResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckAccessResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckAccessResponse(od as api.CheckAccessResponse);
     });
   });
@@ -5263,7 +5269,9 @@
   unittest.group('obj-schema-CompositeFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompositeFilter();
-      var od = api.CompositeFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompositeFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompositeFilter(od as api.CompositeFilter);
     });
   });
@@ -5271,7 +5279,9 @@
   unittest.group('obj-schema-CustomerIndexStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerIndexStats();
-      var od = api.CustomerIndexStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerIndexStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerIndexStats(od as api.CustomerIndexStats);
     });
   });
@@ -5279,7 +5289,9 @@
   unittest.group('obj-schema-CustomerQueryStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerQueryStats();
-      var od = api.CustomerQueryStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerQueryStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerQueryStats(od as api.CustomerQueryStats);
     });
   });
@@ -5287,7 +5299,9 @@
   unittest.group('obj-schema-CustomerSessionStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerSessionStats();
-      var od = api.CustomerSessionStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerSessionStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerSessionStats(od as api.CustomerSessionStats);
     });
   });
@@ -5295,7 +5309,9 @@
   unittest.group('obj-schema-CustomerUserStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerUserStats();
-      var od = api.CustomerUserStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerUserStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerUserStats(od as api.CustomerUserStats);
     });
   });
@@ -5303,7 +5319,9 @@
   unittest.group('obj-schema-DataSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSource();
-      var od = api.DataSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DataSource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataSource(od as api.DataSource);
     });
   });
@@ -5311,7 +5329,9 @@
   unittest.group('obj-schema-DataSourceIndexStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceIndexStats();
-      var od = api.DataSourceIndexStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceIndexStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceIndexStats(od as api.DataSourceIndexStats);
     });
   });
@@ -5319,7 +5339,9 @@
   unittest.group('obj-schema-DataSourceRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceRestriction();
-      var od = api.DataSourceRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceRestriction(od as api.DataSourceRestriction);
     });
   });
@@ -5327,7 +5349,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -5335,7 +5358,9 @@
   unittest.group('obj-schema-DateOperatorOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateOperatorOptions();
-      var od = api.DateOperatorOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DateOperatorOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDateOperatorOptions(od as api.DateOperatorOptions);
     });
   });
@@ -5343,7 +5368,9 @@
   unittest.group('obj-schema-DatePropertyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatePropertyOptions();
-      var od = api.DatePropertyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatePropertyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatePropertyOptions(od as api.DatePropertyOptions);
     });
   });
@@ -5351,7 +5378,9 @@
   unittest.group('obj-schema-DateValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateValues();
-      var od = api.DateValues.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DateValues.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDateValues(od as api.DateValues);
     });
   });
@@ -5359,7 +5388,9 @@
   unittest.group('obj-schema-DebugOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDebugOptions();
-      var od = api.DebugOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DebugOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDebugOptions(od as api.DebugOptions);
     });
   });
@@ -5367,7 +5398,9 @@
   unittest.group('obj-schema-DeleteQueueItemsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteQueueItemsRequest();
-      var od = api.DeleteQueueItemsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteQueueItemsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteQueueItemsRequest(od as api.DeleteQueueItemsRequest);
     });
   });
@@ -5375,7 +5408,9 @@
   unittest.group('obj-schema-DisplayedProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisplayedProperty();
-      var od = api.DisplayedProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisplayedProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisplayedProperty(od as api.DisplayedProperty);
     });
   });
@@ -5383,7 +5418,9 @@
   unittest.group('obj-schema-DoubleOperatorOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoubleOperatorOptions();
-      var od = api.DoubleOperatorOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoubleOperatorOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoubleOperatorOptions(od as api.DoubleOperatorOptions);
     });
   });
@@ -5391,7 +5428,9 @@
   unittest.group('obj-schema-DoublePropertyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoublePropertyOptions();
-      var od = api.DoublePropertyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoublePropertyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoublePropertyOptions(od as api.DoublePropertyOptions);
     });
   });
@@ -5399,7 +5438,9 @@
   unittest.group('obj-schema-DoubleValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoubleValues();
-      var od = api.DoubleValues.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoubleValues.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoubleValues(od as api.DoubleValues);
     });
   });
@@ -5407,7 +5448,9 @@
   unittest.group('obj-schema-DriveFollowUpRestrict', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveFollowUpRestrict();
-      var od = api.DriveFollowUpRestrict.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveFollowUpRestrict.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveFollowUpRestrict(od as api.DriveFollowUpRestrict);
     });
   });
@@ -5415,7 +5458,9 @@
   unittest.group('obj-schema-DriveLocationRestrict', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveLocationRestrict();
-      var od = api.DriveLocationRestrict.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveLocationRestrict.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveLocationRestrict(od as api.DriveLocationRestrict);
     });
   });
@@ -5423,7 +5468,9 @@
   unittest.group('obj-schema-DriveMimeTypeRestrict', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveMimeTypeRestrict();
-      var od = api.DriveMimeTypeRestrict.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveMimeTypeRestrict.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveMimeTypeRestrict(od as api.DriveMimeTypeRestrict);
     });
   });
@@ -5431,7 +5478,9 @@
   unittest.group('obj-schema-DriveTimeSpanRestrict', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveTimeSpanRestrict();
-      var od = api.DriveTimeSpanRestrict.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveTimeSpanRestrict.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveTimeSpanRestrict(od as api.DriveTimeSpanRestrict);
     });
   });
@@ -5439,7 +5488,9 @@
   unittest.group('obj-schema-EmailAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmailAddress();
-      var od = api.EmailAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmailAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmailAddress(od as api.EmailAddress);
     });
   });
@@ -5447,7 +5498,9 @@
   unittest.group('obj-schema-EnumOperatorOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnumOperatorOptions();
-      var od = api.EnumOperatorOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnumOperatorOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnumOperatorOptions(od as api.EnumOperatorOptions);
     });
   });
@@ -5455,7 +5508,9 @@
   unittest.group('obj-schema-EnumPropertyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnumPropertyOptions();
-      var od = api.EnumPropertyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnumPropertyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnumPropertyOptions(od as api.EnumPropertyOptions);
     });
   });
@@ -5463,7 +5518,9 @@
   unittest.group('obj-schema-EnumValuePair', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnumValuePair();
-      var od = api.EnumValuePair.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnumValuePair.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnumValuePair(od as api.EnumValuePair);
     });
   });
@@ -5471,7 +5528,9 @@
   unittest.group('obj-schema-EnumValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnumValues();
-      var od = api.EnumValues.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EnumValues.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnumValues(od as api.EnumValues);
     });
   });
@@ -5479,7 +5538,9 @@
   unittest.group('obj-schema-ErrorInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorInfo();
-      var od = api.ErrorInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ErrorInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkErrorInfo(od as api.ErrorInfo);
     });
   });
@@ -5487,7 +5548,9 @@
   unittest.group('obj-schema-ErrorMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorMessage();
-      var od = api.ErrorMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ErrorMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkErrorMessage(od as api.ErrorMessage);
     });
   });
@@ -5495,7 +5558,9 @@
   unittest.group('obj-schema-FacetBucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFacetBucket();
-      var od = api.FacetBucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FacetBucket.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFacetBucket(od as api.FacetBucket);
     });
   });
@@ -5503,7 +5568,9 @@
   unittest.group('obj-schema-FacetOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFacetOptions();
-      var od = api.FacetOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FacetOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFacetOptions(od as api.FacetOptions);
     });
   });
@@ -5511,7 +5578,9 @@
   unittest.group('obj-schema-FacetResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFacetResult();
-      var od = api.FacetResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FacetResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFacetResult(od as api.FacetResult);
     });
   });
@@ -5519,7 +5588,9 @@
   unittest.group('obj-schema-FieldViolation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFieldViolation();
-      var od = api.FieldViolation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FieldViolation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFieldViolation(od as api.FieldViolation);
     });
   });
@@ -5527,7 +5598,9 @@
   unittest.group('obj-schema-Filter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilter();
-      var od = api.Filter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Filter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilter(od as api.Filter);
     });
   });
@@ -5535,7 +5608,9 @@
   unittest.group('obj-schema-FilterOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterOptions();
-      var od = api.FilterOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterOptions(od as api.FilterOptions);
     });
   });
@@ -5543,7 +5618,9 @@
   unittest.group('obj-schema-FreshnessOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFreshnessOptions();
-      var od = api.FreshnessOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FreshnessOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFreshnessOptions(od as api.FreshnessOptions);
     });
   });
@@ -5551,7 +5628,9 @@
   unittest.group('obj-schema-GSuitePrincipal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGSuitePrincipal();
-      var od = api.GSuitePrincipal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GSuitePrincipal.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGSuitePrincipal(od as api.GSuitePrincipal);
     });
   });
@@ -5559,7 +5638,9 @@
   unittest.group('obj-schema-GetCustomerIndexStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetCustomerIndexStatsResponse();
-      var od = api.GetCustomerIndexStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetCustomerIndexStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetCustomerIndexStatsResponse(
           od as api.GetCustomerIndexStatsResponse);
     });
@@ -5568,7 +5649,9 @@
   unittest.group('obj-schema-GetCustomerQueryStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetCustomerQueryStatsResponse();
-      var od = api.GetCustomerQueryStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetCustomerQueryStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetCustomerQueryStatsResponse(
           od as api.GetCustomerQueryStatsResponse);
     });
@@ -5577,7 +5660,9 @@
   unittest.group('obj-schema-GetCustomerSessionStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetCustomerSessionStatsResponse();
-      var od = api.GetCustomerSessionStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetCustomerSessionStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetCustomerSessionStatsResponse(
           od as api.GetCustomerSessionStatsResponse);
     });
@@ -5586,7 +5671,9 @@
   unittest.group('obj-schema-GetCustomerUserStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetCustomerUserStatsResponse();
-      var od = api.GetCustomerUserStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetCustomerUserStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetCustomerUserStatsResponse(od as api.GetCustomerUserStatsResponse);
     });
   });
@@ -5594,7 +5681,9 @@
   unittest.group('obj-schema-GetDataSourceIndexStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetDataSourceIndexStatsResponse();
-      var od = api.GetDataSourceIndexStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetDataSourceIndexStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetDataSourceIndexStatsResponse(
           od as api.GetDataSourceIndexStatsResponse);
     });
@@ -5603,7 +5692,9 @@
   unittest.group('obj-schema-GetSearchApplicationQueryStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetSearchApplicationQueryStatsResponse();
-      var od = api.GetSearchApplicationQueryStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetSearchApplicationQueryStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetSearchApplicationQueryStatsResponse(
           od as api.GetSearchApplicationQueryStatsResponse);
     });
@@ -5612,8 +5703,9 @@
   unittest.group('obj-schema-GetSearchApplicationSessionStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetSearchApplicationSessionStatsResponse();
-      var od =
-          api.GetSearchApplicationSessionStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetSearchApplicationSessionStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetSearchApplicationSessionStatsResponse(
           od as api.GetSearchApplicationSessionStatsResponse);
     });
@@ -5622,7 +5714,9 @@
   unittest.group('obj-schema-GetSearchApplicationUserStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetSearchApplicationUserStatsResponse();
-      var od = api.GetSearchApplicationUserStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetSearchApplicationUserStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetSearchApplicationUserStatsResponse(
           od as api.GetSearchApplicationUserStatsResponse);
     });
@@ -5631,7 +5725,9 @@
   unittest.group('obj-schema-HtmlOperatorOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHtmlOperatorOptions();
-      var od = api.HtmlOperatorOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HtmlOperatorOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHtmlOperatorOptions(od as api.HtmlOperatorOptions);
     });
   });
@@ -5639,7 +5735,9 @@
   unittest.group('obj-schema-HtmlPropertyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHtmlPropertyOptions();
-      var od = api.HtmlPropertyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HtmlPropertyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHtmlPropertyOptions(od as api.HtmlPropertyOptions);
     });
   });
@@ -5647,7 +5745,9 @@
   unittest.group('obj-schema-HtmlValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHtmlValues();
-      var od = api.HtmlValues.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HtmlValues.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHtmlValues(od as api.HtmlValues);
     });
   });
@@ -5655,7 +5755,9 @@
   unittest.group('obj-schema-IndexItemOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIndexItemOptions();
-      var od = api.IndexItemOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IndexItemOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIndexItemOptions(od as api.IndexItemOptions);
     });
   });
@@ -5663,7 +5765,9 @@
   unittest.group('obj-schema-IndexItemRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIndexItemRequest();
-      var od = api.IndexItemRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IndexItemRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIndexItemRequest(od as api.IndexItemRequest);
     });
   });
@@ -5671,7 +5775,9 @@
   unittest.group('obj-schema-IntegerOperatorOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntegerOperatorOptions();
-      var od = api.IntegerOperatorOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntegerOperatorOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntegerOperatorOptions(od as api.IntegerOperatorOptions);
     });
   });
@@ -5679,7 +5785,9 @@
   unittest.group('obj-schema-IntegerPropertyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntegerPropertyOptions();
-      var od = api.IntegerPropertyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntegerPropertyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntegerPropertyOptions(od as api.IntegerPropertyOptions);
     });
   });
@@ -5687,7 +5795,9 @@
   unittest.group('obj-schema-IntegerValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntegerValues();
-      var od = api.IntegerValues.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntegerValues.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntegerValues(od as api.IntegerValues);
     });
   });
@@ -5695,7 +5805,9 @@
   unittest.group('obj-schema-Interaction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInteraction();
-      var od = api.Interaction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Interaction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInteraction(od as api.Interaction);
     });
   });
@@ -5703,7 +5815,8 @@
   unittest.group('obj-schema-Item', () {
     unittest.test('to-json--from-json', () async {
       var o = buildItem();
-      var od = api.Item.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Item.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkItem(od as api.Item);
     });
   });
@@ -5711,7 +5824,9 @@
   unittest.group('obj-schema-ItemAcl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildItemAcl();
-      var od = api.ItemAcl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ItemAcl.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkItemAcl(od as api.ItemAcl);
     });
   });
@@ -5719,7 +5834,9 @@
   unittest.group('obj-schema-ItemContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildItemContent();
-      var od = api.ItemContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ItemContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkItemContent(od as api.ItemContent);
     });
   });
@@ -5727,7 +5844,9 @@
   unittest.group('obj-schema-ItemCountByStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildItemCountByStatus();
-      var od = api.ItemCountByStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ItemCountByStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkItemCountByStatus(od as api.ItemCountByStatus);
     });
   });
@@ -5735,7 +5854,9 @@
   unittest.group('obj-schema-ItemMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildItemMetadata();
-      var od = api.ItemMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ItemMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkItemMetadata(od as api.ItemMetadata);
     });
   });
@@ -5743,7 +5864,9 @@
   unittest.group('obj-schema-ItemStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildItemStatus();
-      var od = api.ItemStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ItemStatus.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkItemStatus(od as api.ItemStatus);
     });
   });
@@ -5751,7 +5874,9 @@
   unittest.group('obj-schema-ItemStructuredData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildItemStructuredData();
-      var od = api.ItemStructuredData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ItemStructuredData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkItemStructuredData(od as api.ItemStructuredData);
     });
   });
@@ -5759,7 +5884,9 @@
   unittest.group('obj-schema-ListDataSourceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDataSourceResponse();
-      var od = api.ListDataSourceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDataSourceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDataSourceResponse(od as api.ListDataSourceResponse);
     });
   });
@@ -5767,8 +5894,9 @@
   unittest.group('obj-schema-ListItemNamesForUnmappedIdentityResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListItemNamesForUnmappedIdentityResponse();
-      var od =
-          api.ListItemNamesForUnmappedIdentityResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListItemNamesForUnmappedIdentityResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListItemNamesForUnmappedIdentityResponse(
           od as api.ListItemNamesForUnmappedIdentityResponse);
     });
@@ -5777,7 +5905,9 @@
   unittest.group('obj-schema-ListItemsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListItemsResponse();
-      var od = api.ListItemsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListItemsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListItemsResponse(od as api.ListItemsResponse);
     });
   });
@@ -5785,7 +5915,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -5793,7 +5925,9 @@
   unittest.group('obj-schema-ListQuerySourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListQuerySourcesResponse();
-      var od = api.ListQuerySourcesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListQuerySourcesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListQuerySourcesResponse(od as api.ListQuerySourcesResponse);
     });
   });
@@ -5801,7 +5935,9 @@
   unittest.group('obj-schema-ListSearchApplicationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSearchApplicationsResponse();
-      var od = api.ListSearchApplicationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSearchApplicationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSearchApplicationsResponse(
           od as api.ListSearchApplicationsResponse);
     });
@@ -5810,7 +5946,9 @@
   unittest.group('obj-schema-ListUnmappedIdentitiesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListUnmappedIdentitiesResponse();
-      var od = api.ListUnmappedIdentitiesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListUnmappedIdentitiesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListUnmappedIdentitiesResponse(
           od as api.ListUnmappedIdentitiesResponse);
     });
@@ -5819,7 +5957,9 @@
   unittest.group('obj-schema-MatchRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMatchRange();
-      var od = api.MatchRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MatchRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMatchRange(od as api.MatchRange);
     });
   });
@@ -5827,7 +5967,8 @@
   unittest.group('obj-schema-Media', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMedia();
-      var od = api.Media.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Media.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMedia(od as api.Media);
     });
   });
@@ -5835,7 +5976,9 @@
   unittest.group('obj-schema-Metadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadata();
-      var od = api.Metadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metadata.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetadata(od as api.Metadata);
     });
   });
@@ -5843,7 +5986,9 @@
   unittest.group('obj-schema-Metaline', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetaline();
-      var od = api.Metaline.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metaline.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetaline(od as api.Metaline);
     });
   });
@@ -5851,7 +5996,8 @@
   unittest.group('obj-schema-Name', () {
     unittest.test('to-json--from-json', () async {
       var o = buildName();
-      var od = api.Name.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Name.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkName(od as api.Name);
     });
   });
@@ -5859,7 +6005,9 @@
   unittest.group('obj-schema-NamedProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamedProperty();
-      var od = api.NamedProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NamedProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNamedProperty(od as api.NamedProperty);
     });
   });
@@ -5867,7 +6015,9 @@
   unittest.group('obj-schema-ObjectDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectDefinition();
-      var od = api.ObjectDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectDefinition(od as api.ObjectDefinition);
     });
   });
@@ -5875,7 +6025,9 @@
   unittest.group('obj-schema-ObjectDisplayOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectDisplayOptions();
-      var od = api.ObjectDisplayOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectDisplayOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectDisplayOptions(od as api.ObjectDisplayOptions);
     });
   });
@@ -5883,7 +6035,9 @@
   unittest.group('obj-schema-ObjectOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectOptions();
-      var od = api.ObjectOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectOptions(od as api.ObjectOptions);
     });
   });
@@ -5891,7 +6045,9 @@
   unittest.group('obj-schema-ObjectPropertyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectPropertyOptions();
-      var od = api.ObjectPropertyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectPropertyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectPropertyOptions(od as api.ObjectPropertyOptions);
     });
   });
@@ -5899,7 +6055,9 @@
   unittest.group('obj-schema-ObjectValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectValues();
-      var od = api.ObjectValues.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectValues.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectValues(od as api.ObjectValues);
     });
   });
@@ -5907,7 +6065,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -5915,7 +6075,9 @@
   unittest.group('obj-schema-PeopleSuggestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPeopleSuggestion();
-      var od = api.PeopleSuggestion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PeopleSuggestion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPeopleSuggestion(od as api.PeopleSuggestion);
     });
   });
@@ -5923,7 +6085,9 @@
   unittest.group('obj-schema-Person', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerson();
-      var od = api.Person.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Person.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPerson(od as api.Person);
     });
   });
@@ -5931,7 +6095,8 @@
   unittest.group('obj-schema-Photo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPhoto();
-      var od = api.Photo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Photo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPhoto(od as api.Photo);
     });
   });
@@ -5939,7 +6104,9 @@
   unittest.group('obj-schema-PollItemsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPollItemsRequest();
-      var od = api.PollItemsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PollItemsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPollItemsRequest(od as api.PollItemsRequest);
     });
   });
@@ -5947,7 +6114,9 @@
   unittest.group('obj-schema-PollItemsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPollItemsResponse();
-      var od = api.PollItemsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PollItemsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPollItemsResponse(od as api.PollItemsResponse);
     });
   });
@@ -5955,7 +6124,9 @@
   unittest.group('obj-schema-Principal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrincipal();
-      var od = api.Principal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Principal.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPrincipal(od as api.Principal);
     });
   });
@@ -5963,7 +6134,9 @@
   unittest.group('obj-schema-ProcessingError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProcessingError();
-      var od = api.ProcessingError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProcessingError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProcessingError(od as api.ProcessingError);
     });
   });
@@ -5971,7 +6144,9 @@
   unittest.group('obj-schema-PropertyDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPropertyDefinition();
-      var od = api.PropertyDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PropertyDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPropertyDefinition(od as api.PropertyDefinition);
     });
   });
@@ -5979,7 +6154,9 @@
   unittest.group('obj-schema-PropertyDisplayOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPropertyDisplayOptions();
-      var od = api.PropertyDisplayOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PropertyDisplayOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPropertyDisplayOptions(od as api.PropertyDisplayOptions);
     });
   });
@@ -5987,7 +6164,9 @@
   unittest.group('obj-schema-PushItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPushItem();
-      var od = api.PushItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PushItem.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPushItem(od as api.PushItem);
     });
   });
@@ -5995,7 +6174,9 @@
   unittest.group('obj-schema-PushItemRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPushItemRequest();
-      var od = api.PushItemRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PushItemRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPushItemRequest(od as api.PushItemRequest);
     });
   });
@@ -6003,7 +6184,9 @@
   unittest.group('obj-schema-QueryCountByStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryCountByStatus();
-      var od = api.QueryCountByStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryCountByStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryCountByStatus(od as api.QueryCountByStatus);
     });
   });
@@ -6011,7 +6194,9 @@
   unittest.group('obj-schema-QueryInterpretation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryInterpretation();
-      var od = api.QueryInterpretation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryInterpretation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryInterpretation(od as api.QueryInterpretation);
     });
   });
@@ -6019,7 +6204,9 @@
   unittest.group('obj-schema-QueryInterpretationOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryInterpretationOptions();
-      var od = api.QueryInterpretationOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryInterpretationOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryInterpretationOptions(od as api.QueryInterpretationOptions);
     });
   });
@@ -6027,7 +6214,9 @@
   unittest.group('obj-schema-QueryItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryItem();
-      var od = api.QueryItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.QueryItem.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQueryItem(od as api.QueryItem);
     });
   });
@@ -6035,7 +6224,9 @@
   unittest.group('obj-schema-QueryOperator', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryOperator();
-      var od = api.QueryOperator.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryOperator.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryOperator(od as api.QueryOperator);
     });
   });
@@ -6043,7 +6234,9 @@
   unittest.group('obj-schema-QuerySource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuerySource();
-      var od = api.QuerySource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QuerySource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQuerySource(od as api.QuerySource);
     });
   });
@@ -6051,7 +6244,9 @@
   unittest.group('obj-schema-QuerySuggestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuerySuggestion();
-      var od = api.QuerySuggestion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QuerySuggestion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQuerySuggestion(od as api.QuerySuggestion);
     });
   });
@@ -6059,7 +6254,9 @@
   unittest.group('obj-schema-RepositoryError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepositoryError();
-      var od = api.RepositoryError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepositoryError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepositoryError(od as api.RepositoryError);
     });
   });
@@ -6067,7 +6264,9 @@
   unittest.group('obj-schema-RequestOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestOptions();
-      var od = api.RequestOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestOptions(od as api.RequestOptions);
     });
   });
@@ -6075,7 +6274,9 @@
   unittest.group('obj-schema-ResetSearchApplicationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResetSearchApplicationRequest();
-      var od = api.ResetSearchApplicationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResetSearchApplicationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResetSearchApplicationRequest(
           od as api.ResetSearchApplicationRequest);
     });
@@ -6084,7 +6285,9 @@
   unittest.group('obj-schema-ResponseDebugInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResponseDebugInfo();
-      var od = api.ResponseDebugInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResponseDebugInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResponseDebugInfo(od as api.ResponseDebugInfo);
     });
   });
@@ -6092,7 +6295,9 @@
   unittest.group('obj-schema-RestrictItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestrictItem();
-      var od = api.RestrictItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestrictItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestrictItem(od as api.RestrictItem);
     });
   });
@@ -6100,7 +6305,9 @@
   unittest.group('obj-schema-ResultCounts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultCounts();
-      var od = api.ResultCounts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultCounts.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultCounts(od as api.ResultCounts);
     });
   });
@@ -6108,7 +6315,9 @@
   unittest.group('obj-schema-ResultDebugInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultDebugInfo();
-      var od = api.ResultDebugInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultDebugInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultDebugInfo(od as api.ResultDebugInfo);
     });
   });
@@ -6116,7 +6325,9 @@
   unittest.group('obj-schema-ResultDisplayField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultDisplayField();
-      var od = api.ResultDisplayField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultDisplayField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultDisplayField(od as api.ResultDisplayField);
     });
   });
@@ -6124,7 +6335,9 @@
   unittest.group('obj-schema-ResultDisplayLine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultDisplayLine();
-      var od = api.ResultDisplayLine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultDisplayLine.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultDisplayLine(od as api.ResultDisplayLine);
     });
   });
@@ -6132,7 +6345,9 @@
   unittest.group('obj-schema-ResultDisplayMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultDisplayMetadata();
-      var od = api.ResultDisplayMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultDisplayMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultDisplayMetadata(od as api.ResultDisplayMetadata);
     });
   });
@@ -6140,7 +6355,9 @@
   unittest.group('obj-schema-RetrievalImportance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRetrievalImportance();
-      var od = api.RetrievalImportance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RetrievalImportance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRetrievalImportance(od as api.RetrievalImportance);
     });
   });
@@ -6148,7 +6365,9 @@
   unittest.group('obj-schema-Schema', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchema();
-      var od = api.Schema.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schema.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchema(od as api.Schema);
     });
   });
@@ -6156,7 +6375,9 @@
   unittest.group('obj-schema-ScoringConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScoringConfig();
-      var od = api.ScoringConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScoringConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScoringConfig(od as api.ScoringConfig);
     });
   });
@@ -6164,7 +6385,9 @@
   unittest.group('obj-schema-SearchApplication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchApplication();
-      var od = api.SearchApplication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchApplication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchApplication(od as api.SearchApplication);
     });
   });
@@ -6172,7 +6395,9 @@
   unittest.group('obj-schema-SearchApplicationQueryStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchApplicationQueryStats();
-      var od = api.SearchApplicationQueryStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchApplicationQueryStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchApplicationQueryStats(od as api.SearchApplicationQueryStats);
     });
   });
@@ -6180,7 +6405,9 @@
   unittest.group('obj-schema-SearchApplicationSessionStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchApplicationSessionStats();
-      var od = api.SearchApplicationSessionStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchApplicationSessionStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchApplicationSessionStats(
           od as api.SearchApplicationSessionStats);
     });
@@ -6189,7 +6416,9 @@
   unittest.group('obj-schema-SearchApplicationUserStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchApplicationUserStats();
-      var od = api.SearchApplicationUserStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchApplicationUserStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchApplicationUserStats(od as api.SearchApplicationUserStats);
     });
   });
@@ -6197,7 +6426,9 @@
   unittest.group('obj-schema-SearchItemsByViewUrlRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchItemsByViewUrlRequest();
-      var od = api.SearchItemsByViewUrlRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchItemsByViewUrlRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchItemsByViewUrlRequest(od as api.SearchItemsByViewUrlRequest);
     });
   });
@@ -6205,7 +6436,9 @@
   unittest.group('obj-schema-SearchItemsByViewUrlResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchItemsByViewUrlResponse();
-      var od = api.SearchItemsByViewUrlResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchItemsByViewUrlResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchItemsByViewUrlResponse(od as api.SearchItemsByViewUrlResponse);
     });
   });
@@ -6213,7 +6446,9 @@
   unittest.group('obj-schema-SearchQualityMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchQualityMetadata();
-      var od = api.SearchQualityMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchQualityMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchQualityMetadata(od as api.SearchQualityMetadata);
     });
   });
@@ -6221,7 +6456,9 @@
   unittest.group('obj-schema-SearchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchRequest();
-      var od = api.SearchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchRequest(od as api.SearchRequest);
     });
   });
@@ -6229,7 +6466,9 @@
   unittest.group('obj-schema-SearchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchResponse();
-      var od = api.SearchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchResponse(od as api.SearchResponse);
     });
   });
@@ -6237,7 +6476,9 @@
   unittest.group('obj-schema-SearchResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchResult();
-      var od = api.SearchResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchResult(od as api.SearchResult);
     });
   });
@@ -6245,7 +6486,9 @@
   unittest.group('obj-schema-Snippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnippet();
-      var od = api.Snippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Snippet.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSnippet(od as api.Snippet);
     });
   });
@@ -6253,7 +6496,9 @@
   unittest.group('obj-schema-SortOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSortOptions();
-      var od = api.SortOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SortOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSortOptions(od as api.SortOptions);
     });
   });
@@ -6261,7 +6506,9 @@
   unittest.group('obj-schema-Source', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSource();
-      var od = api.Source.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Source.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSource(od as api.Source);
     });
   });
@@ -6269,7 +6516,9 @@
   unittest.group('obj-schema-SourceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceConfig();
-      var od = api.SourceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceConfig(od as api.SourceConfig);
     });
   });
@@ -6277,7 +6526,9 @@
   unittest.group('obj-schema-SourceCrowdingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceCrowdingConfig();
-      var od = api.SourceCrowdingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceCrowdingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceCrowdingConfig(od as api.SourceCrowdingConfig);
     });
   });
@@ -6285,7 +6536,9 @@
   unittest.group('obj-schema-SourceResultCount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceResultCount();
-      var od = api.SourceResultCount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceResultCount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceResultCount(od as api.SourceResultCount);
     });
   });
@@ -6293,7 +6546,9 @@
   unittest.group('obj-schema-SourceScoringConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceScoringConfig();
-      var od = api.SourceScoringConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceScoringConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceScoringConfig(od as api.SourceScoringConfig);
     });
   });
@@ -6301,7 +6556,9 @@
   unittest.group('obj-schema-SpellResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpellResult();
-      var od = api.SpellResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpellResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpellResult(od as api.SpellResult);
     });
   });
@@ -6309,7 +6566,9 @@
   unittest.group('obj-schema-StartUploadItemRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartUploadItemRequest();
-      var od = api.StartUploadItemRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartUploadItemRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartUploadItemRequest(od as api.StartUploadItemRequest);
     });
   });
@@ -6317,7 +6576,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -6325,7 +6586,9 @@
   unittest.group('obj-schema-StructuredDataObject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStructuredDataObject();
-      var od = api.StructuredDataObject.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StructuredDataObject.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStructuredDataObject(od as api.StructuredDataObject);
     });
   });
@@ -6333,7 +6596,9 @@
   unittest.group('obj-schema-StructuredResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStructuredResult();
-      var od = api.StructuredResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StructuredResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStructuredResult(od as api.StructuredResult);
     });
   });
@@ -6341,7 +6606,9 @@
   unittest.group('obj-schema-SuggestRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestRequest();
-      var od = api.SuggestRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestRequest(od as api.SuggestRequest);
     });
   });
@@ -6349,7 +6616,9 @@
   unittest.group('obj-schema-SuggestResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestResponse();
-      var od = api.SuggestResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestResponse(od as api.SuggestResponse);
     });
   });
@@ -6357,7 +6626,9 @@
   unittest.group('obj-schema-SuggestResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestResult();
-      var od = api.SuggestResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestResult(od as api.SuggestResult);
     });
   });
@@ -6365,7 +6636,9 @@
   unittest.group('obj-schema-TextOperatorOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextOperatorOptions();
-      var od = api.TextOperatorOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextOperatorOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextOperatorOptions(od as api.TextOperatorOptions);
     });
   });
@@ -6373,7 +6646,9 @@
   unittest.group('obj-schema-TextPropertyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextPropertyOptions();
-      var od = api.TextPropertyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextPropertyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextPropertyOptions(od as api.TextPropertyOptions);
     });
   });
@@ -6381,7 +6656,9 @@
   unittest.group('obj-schema-TextValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextValues();
-      var od = api.TextValues.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextValues.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextValues(od as api.TextValues);
     });
   });
@@ -6389,7 +6666,9 @@
   unittest.group('obj-schema-TimestampOperatorOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimestampOperatorOptions();
-      var od = api.TimestampOperatorOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimestampOperatorOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimestampOperatorOptions(od as api.TimestampOperatorOptions);
     });
   });
@@ -6397,7 +6676,9 @@
   unittest.group('obj-schema-TimestampPropertyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimestampPropertyOptions();
-      var od = api.TimestampPropertyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimestampPropertyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimestampPropertyOptions(od as api.TimestampPropertyOptions);
     });
   });
@@ -6405,7 +6686,9 @@
   unittest.group('obj-schema-TimestampValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimestampValues();
-      var od = api.TimestampValues.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimestampValues.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimestampValues(od as api.TimestampValues);
     });
   });
@@ -6413,7 +6696,9 @@
   unittest.group('obj-schema-UnmappedIdentity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnmappedIdentity();
-      var od = api.UnmappedIdentity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnmappedIdentity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnmappedIdentity(od as api.UnmappedIdentity);
     });
   });
@@ -6421,7 +6706,9 @@
   unittest.group('obj-schema-UnreserveItemsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnreserveItemsRequest();
-      var od = api.UnreserveItemsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnreserveItemsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnreserveItemsRequest(od as api.UnreserveItemsRequest);
     });
   });
@@ -6429,7 +6716,9 @@
   unittest.group('obj-schema-UpdateDataSourceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDataSourceRequest();
-      var od = api.UpdateDataSourceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDataSourceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDataSourceRequest(od as api.UpdateDataSourceRequest);
     });
   });
@@ -6437,7 +6726,9 @@
   unittest.group('obj-schema-UpdateSchemaRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateSchemaRequest();
-      var od = api.UpdateSchemaRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateSchemaRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateSchemaRequest(od as api.UpdateSchemaRequest);
     });
   });
@@ -6445,7 +6736,9 @@
   unittest.group('obj-schema-UploadItemRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUploadItemRef();
-      var od = api.UploadItemRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UploadItemRef.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUploadItemRef(od as api.UploadItemRef);
     });
   });
@@ -6453,7 +6746,8 @@
   unittest.group('obj-schema-Value', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValue();
-      var od = api.Value.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Value.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkValue(od as api.Value);
     });
   });
@@ -6461,7 +6755,9 @@
   unittest.group('obj-schema-ValueFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValueFilter();
-      var od = api.ValueFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValueFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValueFilter(od as api.ValueFilter);
     });
   });
diff --git a/generated/googleapis/test/cloudshell/v1_test.dart b/generated/googleapis/test/cloudshell/v1_test.dart
index 120ebf1..19c080f 100644
--- a/generated/googleapis/test/cloudshell/v1_test.dart
+++ b/generated/googleapis/test/cloudshell/v1_test.dart
@@ -676,7 +676,9 @@
   unittest.group('obj-schema-AddPublicKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddPublicKeyMetadata();
-      var od = api.AddPublicKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddPublicKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddPublicKeyMetadata(od as api.AddPublicKeyMetadata);
     });
   });
@@ -684,7 +686,9 @@
   unittest.group('obj-schema-AddPublicKeyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddPublicKeyRequest();
-      var od = api.AddPublicKeyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddPublicKeyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddPublicKeyRequest(od as api.AddPublicKeyRequest);
     });
   });
@@ -692,7 +696,9 @@
   unittest.group('obj-schema-AddPublicKeyResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddPublicKeyResponse();
-      var od = api.AddPublicKeyResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddPublicKeyResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddPublicKeyResponse(od as api.AddPublicKeyResponse);
     });
   });
@@ -700,7 +706,9 @@
   unittest.group('obj-schema-AuthorizeEnvironmentMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizeEnvironmentMetadata();
-      var od = api.AuthorizeEnvironmentMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizeEnvironmentMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizeEnvironmentMetadata(od as api.AuthorizeEnvironmentMetadata);
     });
   });
@@ -708,7 +716,9 @@
   unittest.group('obj-schema-AuthorizeEnvironmentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizeEnvironmentRequest();
-      var od = api.AuthorizeEnvironmentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizeEnvironmentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizeEnvironmentRequest(od as api.AuthorizeEnvironmentRequest);
     });
   });
@@ -716,7 +726,9 @@
   unittest.group('obj-schema-AuthorizeEnvironmentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizeEnvironmentResponse();
-      var od = api.AuthorizeEnvironmentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizeEnvironmentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizeEnvironmentResponse(od as api.AuthorizeEnvironmentResponse);
     });
   });
@@ -724,7 +736,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -732,7 +746,9 @@
   unittest.group('obj-schema-CreateEnvironmentMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateEnvironmentMetadata();
-      var od = api.CreateEnvironmentMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateEnvironmentMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateEnvironmentMetadata(od as api.CreateEnvironmentMetadata);
     });
   });
@@ -740,7 +756,9 @@
   unittest.group('obj-schema-DeleteEnvironmentMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteEnvironmentMetadata();
-      var od = api.DeleteEnvironmentMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteEnvironmentMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteEnvironmentMetadata(od as api.DeleteEnvironmentMetadata);
     });
   });
@@ -748,7 +766,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -756,7 +775,9 @@
   unittest.group('obj-schema-Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironment();
-      var od = api.Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironment(od as api.Environment);
     });
   });
@@ -764,7 +785,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -772,7 +795,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -780,7 +805,9 @@
   unittest.group('obj-schema-RemovePublicKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemovePublicKeyMetadata();
-      var od = api.RemovePublicKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemovePublicKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemovePublicKeyMetadata(od as api.RemovePublicKeyMetadata);
     });
   });
@@ -788,7 +815,9 @@
   unittest.group('obj-schema-RemovePublicKeyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemovePublicKeyRequest();
-      var od = api.RemovePublicKeyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemovePublicKeyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemovePublicKeyRequest(od as api.RemovePublicKeyRequest);
     });
   });
@@ -796,7 +825,9 @@
   unittest.group('obj-schema-RemovePublicKeyResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemovePublicKeyResponse();
-      var od = api.RemovePublicKeyResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemovePublicKeyResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemovePublicKeyResponse(od as api.RemovePublicKeyResponse);
     });
   });
@@ -804,7 +835,9 @@
   unittest.group('obj-schema-StartEnvironmentMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartEnvironmentMetadata();
-      var od = api.StartEnvironmentMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartEnvironmentMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartEnvironmentMetadata(od as api.StartEnvironmentMetadata);
     });
   });
@@ -812,7 +845,9 @@
   unittest.group('obj-schema-StartEnvironmentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartEnvironmentRequest();
-      var od = api.StartEnvironmentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartEnvironmentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartEnvironmentRequest(od as api.StartEnvironmentRequest);
     });
   });
@@ -820,7 +855,9 @@
   unittest.group('obj-schema-StartEnvironmentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartEnvironmentResponse();
-      var od = api.StartEnvironmentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartEnvironmentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartEnvironmentResponse(od as api.StartEnvironmentResponse);
     });
   });
@@ -828,7 +865,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
diff --git a/generated/googleapis/test/cloudtasks/v2_test.dart b/generated/googleapis/test/cloudtasks/v2_test.dart
index 7e75fb6..0a917cc 100644
--- a/generated/googleapis/test/cloudtasks/v2_test.dart
+++ b/generated/googleapis/test/cloudtasks/v2_test.dart
@@ -1134,7 +1134,9 @@
   unittest.group('obj-schema-AppEngineHttpRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppEngineHttpRequest();
-      var od = api.AppEngineHttpRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppEngineHttpRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppEngineHttpRequest(od as api.AppEngineHttpRequest);
     });
   });
@@ -1142,7 +1144,9 @@
   unittest.group('obj-schema-AppEngineRouting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppEngineRouting();
-      var od = api.AppEngineRouting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppEngineRouting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppEngineRouting(od as api.AppEngineRouting);
     });
   });
@@ -1150,7 +1154,9 @@
   unittest.group('obj-schema-Attempt', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttempt();
-      var od = api.Attempt.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Attempt.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAttempt(od as api.Attempt);
     });
   });
@@ -1158,7 +1164,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1166,7 +1174,9 @@
   unittest.group('obj-schema-CreateTaskRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTaskRequest();
-      var od = api.CreateTaskRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTaskRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTaskRequest(od as api.CreateTaskRequest);
     });
   });
@@ -1174,7 +1184,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1182,7 +1193,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1190,7 +1202,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -1198,7 +1212,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -1206,7 +1222,9 @@
   unittest.group('obj-schema-HttpRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRequest();
-      var od = api.HttpRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpRequest(od as api.HttpRequest);
     });
   });
@@ -1214,7 +1232,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1222,7 +1242,9 @@
   unittest.group('obj-schema-ListQueuesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListQueuesResponse();
-      var od = api.ListQueuesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListQueuesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListQueuesResponse(od as api.ListQueuesResponse);
     });
   });
@@ -1230,7 +1252,9 @@
   unittest.group('obj-schema-ListTasksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTasksResponse();
-      var od = api.ListTasksResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTasksResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTasksResponse(od as api.ListTasksResponse);
     });
   });
@@ -1238,7 +1262,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1246,7 +1272,9 @@
   unittest.group('obj-schema-OAuthToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOAuthToken();
-      var od = api.OAuthToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OAuthToken.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOAuthToken(od as api.OAuthToken);
     });
   });
@@ -1254,7 +1282,9 @@
   unittest.group('obj-schema-OidcToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOidcToken();
-      var od = api.OidcToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OidcToken.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOidcToken(od as api.OidcToken);
     });
   });
@@ -1262,7 +1292,9 @@
   unittest.group('obj-schema-PauseQueueRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPauseQueueRequest();
-      var od = api.PauseQueueRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PauseQueueRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPauseQueueRequest(od as api.PauseQueueRequest);
     });
   });
@@ -1270,7 +1302,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1278,7 +1312,9 @@
   unittest.group('obj-schema-PurgeQueueRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPurgeQueueRequest();
-      var od = api.PurgeQueueRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PurgeQueueRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPurgeQueueRequest(od as api.PurgeQueueRequest);
     });
   });
@@ -1286,7 +1322,8 @@
   unittest.group('obj-schema-Queue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueue();
-      var od = api.Queue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Queue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQueue(od as api.Queue);
     });
   });
@@ -1294,7 +1331,9 @@
   unittest.group('obj-schema-RateLimits', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRateLimits();
-      var od = api.RateLimits.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RateLimits.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRateLimits(od as api.RateLimits);
     });
   });
@@ -1302,7 +1341,9 @@
   unittest.group('obj-schema-ResumeQueueRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResumeQueueRequest();
-      var od = api.ResumeQueueRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResumeQueueRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResumeQueueRequest(od as api.ResumeQueueRequest);
     });
   });
@@ -1310,7 +1351,9 @@
   unittest.group('obj-schema-RetryConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRetryConfig();
-      var od = api.RetryConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RetryConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRetryConfig(od as api.RetryConfig);
     });
   });
@@ -1318,7 +1361,9 @@
   unittest.group('obj-schema-RunTaskRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunTaskRequest();
-      var od = api.RunTaskRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunTaskRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunTaskRequest(od as api.RunTaskRequest);
     });
   });
@@ -1326,7 +1371,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1334,7 +1381,9 @@
   unittest.group('obj-schema-StackdriverLoggingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStackdriverLoggingConfig();
-      var od = api.StackdriverLoggingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StackdriverLoggingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStackdriverLoggingConfig(od as api.StackdriverLoggingConfig);
     });
   });
@@ -1342,7 +1391,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1350,7 +1401,8 @@
   unittest.group('obj-schema-Task', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTask();
-      var od = api.Task.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Task.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTask(od as api.Task);
     });
   });
@@ -1358,7 +1410,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1366,7 +1420,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis/test/cloudtrace/v2_test.dart b/generated/googleapis/test/cloudtrace/v2_test.dart
index ca8708e..64a0737 100644
--- a/generated/googleapis/test/cloudtrace/v2_test.dart
+++ b/generated/googleapis/test/cloudtrace/v2_test.dart
@@ -639,7 +639,9 @@
   unittest.group('obj-schema-Annotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotation();
-      var od = api.Annotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Annotation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAnnotation(od as api.Annotation);
     });
   });
@@ -647,7 +649,9 @@
   unittest.group('obj-schema-AttributeValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttributeValue();
-      var od = api.AttributeValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttributeValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttributeValue(od as api.AttributeValue);
     });
   });
@@ -655,7 +659,9 @@
   unittest.group('obj-schema-Attributes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttributes();
-      var od = api.Attributes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Attributes.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAttributes(od as api.Attributes);
     });
   });
@@ -663,7 +669,9 @@
   unittest.group('obj-schema-BatchWriteSpansRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchWriteSpansRequest();
-      var od = api.BatchWriteSpansRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchWriteSpansRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchWriteSpansRequest(od as api.BatchWriteSpansRequest);
     });
   });
@@ -671,7 +679,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -679,7 +688,8 @@
   unittest.group('obj-schema-Link', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLink();
-      var od = api.Link.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Link.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLink(od as api.Link);
     });
   });
@@ -687,7 +697,8 @@
   unittest.group('obj-schema-Links', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinks();
-      var od = api.Links.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Links.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLinks(od as api.Links);
     });
   });
@@ -695,7 +706,9 @@
   unittest.group('obj-schema-MessageEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMessageEvent();
-      var od = api.MessageEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MessageEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMessageEvent(od as api.MessageEvent);
     });
   });
@@ -703,7 +716,9 @@
   unittest.group('obj-schema-Module', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModule();
-      var od = api.Module.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Module.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkModule(od as api.Module);
     });
   });
@@ -711,7 +726,8 @@
   unittest.group('obj-schema-Span', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpan();
-      var od = api.Span.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Span.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSpan(od as api.Span);
     });
   });
@@ -719,7 +735,9 @@
   unittest.group('obj-schema-StackFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStackFrame();
-      var od = api.StackFrame.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.StackFrame.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStackFrame(od as api.StackFrame);
     });
   });
@@ -727,7 +745,9 @@
   unittest.group('obj-schema-StackFrames', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStackFrames();
-      var od = api.StackFrames.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StackFrames.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStackFrames(od as api.StackFrames);
     });
   });
@@ -735,7 +755,9 @@
   unittest.group('obj-schema-StackTrace', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStackTrace();
-      var od = api.StackTrace.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.StackTrace.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStackTrace(od as api.StackTrace);
     });
   });
@@ -743,7 +765,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -751,7 +775,9 @@
   unittest.group('obj-schema-TimeEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeEvent();
-      var od = api.TimeEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeEvent.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeEvent(od as api.TimeEvent);
     });
   });
@@ -759,7 +785,9 @@
   unittest.group('obj-schema-TimeEvents', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeEvents();
-      var od = api.TimeEvents.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeEvents.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeEvents(od as api.TimeEvents);
     });
   });
@@ -767,7 +795,9 @@
   unittest.group('obj-schema-TruncatableString', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTruncatableString();
-      var od = api.TruncatableString.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TruncatableString.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTruncatableString(od as api.TruncatableString);
     });
   });
diff --git a/generated/googleapis/test/composer/v1_test.dart b/generated/googleapis/test/composer/v1_test.dart
index 75a58f7..69f3580 100644
--- a/generated/googleapis/test/composer/v1_test.dart
+++ b/generated/googleapis/test/composer/v1_test.dart
@@ -1029,7 +1029,9 @@
   unittest.group('obj-schema-AllowedIpRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAllowedIpRange();
-      var od = api.AllowedIpRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AllowedIpRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAllowedIpRange(od as api.AllowedIpRange);
     });
   });
@@ -1037,7 +1039,9 @@
   unittest.group('obj-schema-DatabaseConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabaseConfig();
-      var od = api.DatabaseConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatabaseConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatabaseConfig(od as api.DatabaseConfig);
     });
   });
@@ -1045,7 +1049,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -1053,7 +1058,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1061,7 +1067,9 @@
   unittest.group('obj-schema-EncryptionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncryptionConfig();
-      var od = api.EncryptionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EncryptionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEncryptionConfig(od as api.EncryptionConfig);
     });
   });
@@ -1069,7 +1077,9 @@
   unittest.group('obj-schema-Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironment();
-      var od = api.Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironment(od as api.Environment);
     });
   });
@@ -1077,7 +1087,9 @@
   unittest.group('obj-schema-EnvironmentConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironmentConfig();
-      var od = api.EnvironmentConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnvironmentConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironmentConfig(od as api.EnvironmentConfig);
     });
   });
@@ -1085,7 +1097,9 @@
   unittest.group('obj-schema-IPAllocationPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIPAllocationPolicy();
-      var od = api.IPAllocationPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IPAllocationPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIPAllocationPolicy(od as api.IPAllocationPolicy);
     });
   });
@@ -1093,7 +1107,9 @@
   unittest.group('obj-schema-ImageVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageVersion();
-      var od = api.ImageVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageVersion(od as api.ImageVersion);
     });
   });
@@ -1101,7 +1117,9 @@
   unittest.group('obj-schema-ListEnvironmentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListEnvironmentsResponse();
-      var od = api.ListEnvironmentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListEnvironmentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListEnvironmentsResponse(od as api.ListEnvironmentsResponse);
     });
   });
@@ -1109,7 +1127,9 @@
   unittest.group('obj-schema-ListImageVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListImageVersionsResponse();
-      var od = api.ListImageVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListImageVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListImageVersionsResponse(od as api.ListImageVersionsResponse);
     });
   });
@@ -1117,7 +1137,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1125,7 +1147,9 @@
   unittest.group('obj-schema-NodeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeConfig();
-      var od = api.NodeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NodeConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNodeConfig(od as api.NodeConfig);
     });
   });
@@ -1133,7 +1157,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1141,7 +1167,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -1149,7 +1177,9 @@
   unittest.group('obj-schema-PrivateClusterConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrivateClusterConfig();
-      var od = api.PrivateClusterConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PrivateClusterConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPrivateClusterConfig(od as api.PrivateClusterConfig);
     });
   });
@@ -1157,7 +1187,9 @@
   unittest.group('obj-schema-PrivateEnvironmentConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrivateEnvironmentConfig();
-      var od = api.PrivateEnvironmentConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PrivateEnvironmentConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPrivateEnvironmentConfig(od as api.PrivateEnvironmentConfig);
     });
   });
@@ -1165,7 +1197,9 @@
   unittest.group('obj-schema-SoftwareConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSoftwareConfig();
-      var od = api.SoftwareConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SoftwareConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSoftwareConfig(od as api.SoftwareConfig);
     });
   });
@@ -1173,7 +1207,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1181,7 +1217,9 @@
   unittest.group('obj-schema-WebServerConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebServerConfig();
-      var od = api.WebServerConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebServerConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebServerConfig(od as api.WebServerConfig);
     });
   });
@@ -1189,7 +1227,9 @@
   unittest.group('obj-schema-WebServerNetworkAccessControl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebServerNetworkAccessControl();
-      var od = api.WebServerNetworkAccessControl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebServerNetworkAccessControl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebServerNetworkAccessControl(
           od as api.WebServerNetworkAccessControl);
     });
diff --git a/generated/googleapis/test/compute/v1_test.dart b/generated/googleapis/test/compute/v1_test.dart
index d62bd0d..3848ee8 100644
--- a/generated/googleapis/test/compute/v1_test.dart
+++ b/generated/googleapis/test/compute/v1_test.dart
@@ -37583,7 +37583,9 @@
   unittest.group('obj-schema-AcceleratorConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorConfig();
-      var od = api.AcceleratorConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorConfig(od as api.AcceleratorConfig);
     });
   });
@@ -37591,7 +37593,9 @@
   unittest.group('obj-schema-AcceleratorType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorType();
-      var od = api.AcceleratorType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorType(od as api.AcceleratorType);
     });
   });
@@ -37599,8 +37603,9 @@
   unittest.group('obj-schema-AcceleratorTypeAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorTypeAggregatedListWarningData();
-      var od =
-          api.AcceleratorTypeAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorTypeAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorTypeAggregatedListWarningData(
           od as api.AcceleratorTypeAggregatedListWarningData);
     });
@@ -37609,7 +37614,9 @@
   unittest.group('obj-schema-AcceleratorTypeAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorTypeAggregatedListWarning();
-      var od = api.AcceleratorTypeAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorTypeAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorTypeAggregatedListWarning(
           od as api.AcceleratorTypeAggregatedListWarning);
     });
@@ -37618,7 +37625,9 @@
   unittest.group('obj-schema-AcceleratorTypeAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorTypeAggregatedList();
-      var od = api.AcceleratorTypeAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorTypeAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorTypeAggregatedList(
           od as api.AcceleratorTypeAggregatedList);
     });
@@ -37627,7 +37636,9 @@
   unittest.group('obj-schema-AcceleratorTypeListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorTypeListWarningData();
-      var od = api.AcceleratorTypeListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorTypeListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorTypeListWarningData(
           od as api.AcceleratorTypeListWarningData);
     });
@@ -37636,7 +37647,9 @@
   unittest.group('obj-schema-AcceleratorTypeListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorTypeListWarning();
-      var od = api.AcceleratorTypeListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorTypeListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorTypeListWarning(od as api.AcceleratorTypeListWarning);
     });
   });
@@ -37644,7 +37657,9 @@
   unittest.group('obj-schema-AcceleratorTypeList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorTypeList();
-      var od = api.AcceleratorTypeList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorTypeList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorTypeList(od as api.AcceleratorTypeList);
     });
   });
@@ -37652,7 +37667,9 @@
   unittest.group('obj-schema-AcceleratorTypesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorTypesScopedListWarningData();
-      var od = api.AcceleratorTypesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorTypesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorTypesScopedListWarningData(
           od as api.AcceleratorTypesScopedListWarningData);
     });
@@ -37661,7 +37678,9 @@
   unittest.group('obj-schema-AcceleratorTypesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorTypesScopedListWarning();
-      var od = api.AcceleratorTypesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorTypesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorTypesScopedListWarning(
           od as api.AcceleratorTypesScopedListWarning);
     });
@@ -37670,7 +37689,9 @@
   unittest.group('obj-schema-AcceleratorTypesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorTypesScopedList();
-      var od = api.AcceleratorTypesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorTypesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorTypesScopedList(od as api.AcceleratorTypesScopedList);
     });
   });
@@ -37678,7 +37699,9 @@
   unittest.group('obj-schema-AccessConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessConfig();
-      var od = api.AccessConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessConfig(od as api.AccessConfig);
     });
   });
@@ -37686,7 +37709,9 @@
   unittest.group('obj-schema-Address', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddress();
-      var od = api.Address.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Address.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAddress(od as api.Address);
     });
   });
@@ -37694,7 +37719,9 @@
   unittest.group('obj-schema-AddressAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddressAggregatedListWarningData();
-      var od = api.AddressAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddressAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddressAggregatedListWarningData(
           od as api.AddressAggregatedListWarningData);
     });
@@ -37703,7 +37730,9 @@
   unittest.group('obj-schema-AddressAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddressAggregatedListWarning();
-      var od = api.AddressAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddressAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddressAggregatedListWarning(od as api.AddressAggregatedListWarning);
     });
   });
@@ -37711,7 +37740,9 @@
   unittest.group('obj-schema-AddressAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddressAggregatedList();
-      var od = api.AddressAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddressAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddressAggregatedList(od as api.AddressAggregatedList);
     });
   });
@@ -37719,7 +37750,9 @@
   unittest.group('obj-schema-AddressListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddressListWarningData();
-      var od = api.AddressListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddressListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddressListWarningData(od as api.AddressListWarningData);
     });
   });
@@ -37727,7 +37760,9 @@
   unittest.group('obj-schema-AddressListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddressListWarning();
-      var od = api.AddressListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddressListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddressListWarning(od as api.AddressListWarning);
     });
   });
@@ -37735,7 +37770,9 @@
   unittest.group('obj-schema-AddressList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddressList();
-      var od = api.AddressList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddressList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddressList(od as api.AddressList);
     });
   });
@@ -37743,7 +37780,9 @@
   unittest.group('obj-schema-AddressesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddressesScopedListWarningData();
-      var od = api.AddressesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddressesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddressesScopedListWarningData(
           od as api.AddressesScopedListWarningData);
     });
@@ -37752,7 +37791,9 @@
   unittest.group('obj-schema-AddressesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddressesScopedListWarning();
-      var od = api.AddressesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddressesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddressesScopedListWarning(od as api.AddressesScopedListWarning);
     });
   });
@@ -37760,7 +37801,9 @@
   unittest.group('obj-schema-AddressesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddressesScopedList();
-      var od = api.AddressesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddressesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddressesScopedList(od as api.AddressesScopedList);
     });
   });
@@ -37768,7 +37811,9 @@
   unittest.group('obj-schema-AdvancedMachineFeatures', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvancedMachineFeatures();
-      var od = api.AdvancedMachineFeatures.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvancedMachineFeatures.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvancedMachineFeatures(od as api.AdvancedMachineFeatures);
     });
   });
@@ -37776,7 +37821,9 @@
   unittest.group('obj-schema-AliasIpRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAliasIpRange();
-      var od = api.AliasIpRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AliasIpRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAliasIpRange(od as api.AliasIpRange);
     });
   });
@@ -37787,9 +37834,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildAllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk(
           od as api
               .AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk);
@@ -37801,8 +37849,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildAllocationSpecificSKUAllocationReservedInstanceProperties();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.AllocationSpecificSKUAllocationReservedInstanceProperties
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAllocationSpecificSKUAllocationReservedInstanceProperties(
           od as api.AllocationSpecificSKUAllocationReservedInstanceProperties);
     });
@@ -37811,7 +37860,9 @@
   unittest.group('obj-schema-AllocationSpecificSKUReservation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAllocationSpecificSKUReservation();
-      var od = api.AllocationSpecificSKUReservation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AllocationSpecificSKUReservation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAllocationSpecificSKUReservation(
           od as api.AllocationSpecificSKUReservation);
     });
@@ -37820,7 +37871,9 @@
   unittest.group('obj-schema-AttachedDisk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttachedDisk();
-      var od = api.AttachedDisk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttachedDisk.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttachedDisk(od as api.AttachedDisk);
     });
   });
@@ -37828,7 +37881,9 @@
   unittest.group('obj-schema-AttachedDiskInitializeParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttachedDiskInitializeParams();
-      var od = api.AttachedDiskInitializeParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttachedDiskInitializeParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttachedDiskInitializeParams(od as api.AttachedDiskInitializeParams);
     });
   });
@@ -37836,7 +37891,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -37844,7 +37901,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -37852,7 +37911,9 @@
   unittest.group('obj-schema-AuthorizationLoggingOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizationLoggingOptions();
-      var od = api.AuthorizationLoggingOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizationLoggingOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizationLoggingOptions(od as api.AuthorizationLoggingOptions);
     });
   });
@@ -37860,7 +37921,9 @@
   unittest.group('obj-schema-Autoscaler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscaler();
-      var od = api.Autoscaler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Autoscaler.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAutoscaler(od as api.Autoscaler);
     });
   });
@@ -37868,7 +37931,9 @@
   unittest.group('obj-schema-AutoscalerAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalerAggregatedListWarningData();
-      var od = api.AutoscalerAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalerAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalerAggregatedListWarningData(
           od as api.AutoscalerAggregatedListWarningData);
     });
@@ -37877,7 +37942,9 @@
   unittest.group('obj-schema-AutoscalerAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalerAggregatedListWarning();
-      var od = api.AutoscalerAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalerAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalerAggregatedListWarning(
           od as api.AutoscalerAggregatedListWarning);
     });
@@ -37886,7 +37953,9 @@
   unittest.group('obj-schema-AutoscalerAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalerAggregatedList();
-      var od = api.AutoscalerAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalerAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalerAggregatedList(od as api.AutoscalerAggregatedList);
     });
   });
@@ -37894,7 +37963,9 @@
   unittest.group('obj-schema-AutoscalerListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalerListWarningData();
-      var od = api.AutoscalerListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalerListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalerListWarningData(od as api.AutoscalerListWarningData);
     });
   });
@@ -37902,7 +37973,9 @@
   unittest.group('obj-schema-AutoscalerListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalerListWarning();
-      var od = api.AutoscalerListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalerListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalerListWarning(od as api.AutoscalerListWarning);
     });
   });
@@ -37910,7 +37983,9 @@
   unittest.group('obj-schema-AutoscalerList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalerList();
-      var od = api.AutoscalerList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalerList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalerList(od as api.AutoscalerList);
     });
   });
@@ -37918,7 +37993,9 @@
   unittest.group('obj-schema-AutoscalerStatusDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalerStatusDetails();
-      var od = api.AutoscalerStatusDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalerStatusDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalerStatusDetails(od as api.AutoscalerStatusDetails);
     });
   });
@@ -37926,7 +38003,9 @@
   unittest.group('obj-schema-AutoscalersScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalersScopedListWarningData();
-      var od = api.AutoscalersScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalersScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalersScopedListWarningData(
           od as api.AutoscalersScopedListWarningData);
     });
@@ -37935,7 +38014,9 @@
   unittest.group('obj-schema-AutoscalersScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalersScopedListWarning();
-      var od = api.AutoscalersScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalersScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalersScopedListWarning(od as api.AutoscalersScopedListWarning);
     });
   });
@@ -37943,7 +38024,9 @@
   unittest.group('obj-schema-AutoscalersScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalersScopedList();
-      var od = api.AutoscalersScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalersScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalersScopedList(od as api.AutoscalersScopedList);
     });
   });
@@ -37951,7 +38034,9 @@
   unittest.group('obj-schema-AutoscalingPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalingPolicy();
-      var od = api.AutoscalingPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalingPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalingPolicy(od as api.AutoscalingPolicy);
     });
   });
@@ -37959,7 +38044,9 @@
   unittest.group('obj-schema-AutoscalingPolicyCpuUtilization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalingPolicyCpuUtilization();
-      var od = api.AutoscalingPolicyCpuUtilization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalingPolicyCpuUtilization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalingPolicyCpuUtilization(
           od as api.AutoscalingPolicyCpuUtilization);
     });
@@ -37968,8 +38055,9 @@
   unittest.group('obj-schema-AutoscalingPolicyCustomMetricUtilization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalingPolicyCustomMetricUtilization();
-      var od =
-          api.AutoscalingPolicyCustomMetricUtilization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalingPolicyCustomMetricUtilization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalingPolicyCustomMetricUtilization(
           od as api.AutoscalingPolicyCustomMetricUtilization);
     });
@@ -37978,8 +38066,9 @@
   unittest.group('obj-schema-AutoscalingPolicyLoadBalancingUtilization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalingPolicyLoadBalancingUtilization();
-      var od =
-          api.AutoscalingPolicyLoadBalancingUtilization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalingPolicyLoadBalancingUtilization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalingPolicyLoadBalancingUtilization(
           od as api.AutoscalingPolicyLoadBalancingUtilization);
     });
@@ -37988,7 +38077,9 @@
   unittest.group('obj-schema-AutoscalingPolicyScaleInControl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalingPolicyScaleInControl();
-      var od = api.AutoscalingPolicyScaleInControl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalingPolicyScaleInControl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalingPolicyScaleInControl(
           od as api.AutoscalingPolicyScaleInControl);
     });
@@ -37997,7 +38088,9 @@
   unittest.group('obj-schema-Backend', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackend();
-      var od = api.Backend.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Backend.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackend(od as api.Backend);
     });
   });
@@ -38005,7 +38098,9 @@
   unittest.group('obj-schema-BackendBucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendBucket();
-      var od = api.BackendBucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendBucket.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendBucket(od as api.BackendBucket);
     });
   });
@@ -38013,7 +38108,9 @@
   unittest.group('obj-schema-BackendBucketCdnPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendBucketCdnPolicy();
-      var od = api.BackendBucketCdnPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendBucketCdnPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendBucketCdnPolicy(od as api.BackendBucketCdnPolicy);
     });
   });
@@ -38021,7 +38118,9 @@
   unittest.group('obj-schema-BackendBucketListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendBucketListWarningData();
-      var od = api.BackendBucketListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendBucketListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendBucketListWarningData(od as api.BackendBucketListWarningData);
     });
   });
@@ -38029,7 +38128,9 @@
   unittest.group('obj-schema-BackendBucketListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendBucketListWarning();
-      var od = api.BackendBucketListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendBucketListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendBucketListWarning(od as api.BackendBucketListWarning);
     });
   });
@@ -38037,7 +38138,9 @@
   unittest.group('obj-schema-BackendBucketList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendBucketList();
-      var od = api.BackendBucketList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendBucketList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendBucketList(od as api.BackendBucketList);
     });
   });
@@ -38045,7 +38148,9 @@
   unittest.group('obj-schema-BackendService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendService();
-      var od = api.BackendService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendService(od as api.BackendService);
     });
   });
@@ -38053,7 +38158,9 @@
   unittest.group('obj-schema-BackendServiceAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceAggregatedListWarningData();
-      var od = api.BackendServiceAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceAggregatedListWarningData(
           od as api.BackendServiceAggregatedListWarningData);
     });
@@ -38062,7 +38169,9 @@
   unittest.group('obj-schema-BackendServiceAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceAggregatedListWarning();
-      var od = api.BackendServiceAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceAggregatedListWarning(
           od as api.BackendServiceAggregatedListWarning);
     });
@@ -38071,7 +38180,9 @@
   unittest.group('obj-schema-BackendServiceAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceAggregatedList();
-      var od = api.BackendServiceAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceAggregatedList(od as api.BackendServiceAggregatedList);
     });
   });
@@ -38079,7 +38190,9 @@
   unittest.group('obj-schema-BackendServiceCdnPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceCdnPolicy();
-      var od = api.BackendServiceCdnPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceCdnPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceCdnPolicy(od as api.BackendServiceCdnPolicy);
     });
   });
@@ -38087,7 +38200,9 @@
   unittest.group('obj-schema-BackendServiceFailoverPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceFailoverPolicy();
-      var od = api.BackendServiceFailoverPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceFailoverPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceFailoverPolicy(od as api.BackendServiceFailoverPolicy);
     });
   });
@@ -38095,7 +38210,9 @@
   unittest.group('obj-schema-BackendServiceGroupHealth', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceGroupHealth();
-      var od = api.BackendServiceGroupHealth.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceGroupHealth.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceGroupHealth(od as api.BackendServiceGroupHealth);
     });
   });
@@ -38103,7 +38220,9 @@
   unittest.group('obj-schema-BackendServiceIAP', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceIAP();
-      var od = api.BackendServiceIAP.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceIAP.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceIAP(od as api.BackendServiceIAP);
     });
   });
@@ -38111,7 +38230,9 @@
   unittest.group('obj-schema-BackendServiceListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceListWarningData();
-      var od = api.BackendServiceListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceListWarningData(
           od as api.BackendServiceListWarningData);
     });
@@ -38120,7 +38241,9 @@
   unittest.group('obj-schema-BackendServiceListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceListWarning();
-      var od = api.BackendServiceListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceListWarning(od as api.BackendServiceListWarning);
     });
   });
@@ -38128,7 +38251,9 @@
   unittest.group('obj-schema-BackendServiceList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceList();
-      var od = api.BackendServiceList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceList(od as api.BackendServiceList);
     });
   });
@@ -38136,7 +38261,9 @@
   unittest.group('obj-schema-BackendServiceLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceLogConfig();
-      var od = api.BackendServiceLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceLogConfig(od as api.BackendServiceLogConfig);
     });
   });
@@ -38144,7 +38271,9 @@
   unittest.group('obj-schema-BackendServiceReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServiceReference();
-      var od = api.BackendServiceReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServiceReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServiceReference(od as api.BackendServiceReference);
     });
   });
@@ -38152,7 +38281,9 @@
   unittest.group('obj-schema-BackendServicesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServicesScopedListWarningData();
-      var od = api.BackendServicesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServicesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServicesScopedListWarningData(
           od as api.BackendServicesScopedListWarningData);
     });
@@ -38161,7 +38292,9 @@
   unittest.group('obj-schema-BackendServicesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServicesScopedListWarning();
-      var od = api.BackendServicesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServicesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServicesScopedListWarning(
           od as api.BackendServicesScopedListWarning);
     });
@@ -38170,7 +38303,9 @@
   unittest.group('obj-schema-BackendServicesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendServicesScopedList();
-      var od = api.BackendServicesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendServicesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendServicesScopedList(od as api.BackendServicesScopedList);
     });
   });
@@ -38178,7 +38313,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -38186,7 +38323,9 @@
   unittest.group('obj-schema-BulkInsertInstanceResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkInsertInstanceResource();
-      var od = api.BulkInsertInstanceResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkInsertInstanceResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkInsertInstanceResource(od as api.BulkInsertInstanceResource);
     });
   });
@@ -38195,8 +38334,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkInsertInstanceResourcePerInstanceProperties();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BulkInsertInstanceResourcePerInstanceProperties.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkInsertInstanceResourcePerInstanceProperties(
           od as api.BulkInsertInstanceResourcePerInstanceProperties);
     });
@@ -38205,7 +38345,9 @@
   unittest.group('obj-schema-CacheInvalidationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCacheInvalidationRule();
-      var od = api.CacheInvalidationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CacheInvalidationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCacheInvalidationRule(od as api.CacheInvalidationRule);
     });
   });
@@ -38213,7 +38355,9 @@
   unittest.group('obj-schema-CacheKeyPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCacheKeyPolicy();
-      var od = api.CacheKeyPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CacheKeyPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCacheKeyPolicy(od as api.CacheKeyPolicy);
     });
   });
@@ -38221,7 +38365,9 @@
   unittest.group('obj-schema-CircuitBreakers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCircuitBreakers();
-      var od = api.CircuitBreakers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CircuitBreakers.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCircuitBreakers(od as api.CircuitBreakers);
     });
   });
@@ -38229,7 +38375,9 @@
   unittest.group('obj-schema-Commitment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitment();
-      var od = api.Commitment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Commitment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCommitment(od as api.Commitment);
     });
   });
@@ -38237,7 +38385,9 @@
   unittest.group('obj-schema-CommitmentAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitmentAggregatedListWarningData();
-      var od = api.CommitmentAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitmentAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitmentAggregatedListWarningData(
           od as api.CommitmentAggregatedListWarningData);
     });
@@ -38246,7 +38396,9 @@
   unittest.group('obj-schema-CommitmentAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitmentAggregatedListWarning();
-      var od = api.CommitmentAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitmentAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitmentAggregatedListWarning(
           od as api.CommitmentAggregatedListWarning);
     });
@@ -38255,7 +38407,9 @@
   unittest.group('obj-schema-CommitmentAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitmentAggregatedList();
-      var od = api.CommitmentAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitmentAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitmentAggregatedList(od as api.CommitmentAggregatedList);
     });
   });
@@ -38263,7 +38417,9 @@
   unittest.group('obj-schema-CommitmentListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitmentListWarningData();
-      var od = api.CommitmentListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitmentListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitmentListWarningData(od as api.CommitmentListWarningData);
     });
   });
@@ -38271,7 +38427,9 @@
   unittest.group('obj-schema-CommitmentListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitmentListWarning();
-      var od = api.CommitmentListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitmentListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitmentListWarning(od as api.CommitmentListWarning);
     });
   });
@@ -38279,7 +38437,9 @@
   unittest.group('obj-schema-CommitmentList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitmentList();
-      var od = api.CommitmentList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitmentList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitmentList(od as api.CommitmentList);
     });
   });
@@ -38287,7 +38447,9 @@
   unittest.group('obj-schema-CommitmentsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitmentsScopedListWarningData();
-      var od = api.CommitmentsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitmentsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitmentsScopedListWarningData(
           od as api.CommitmentsScopedListWarningData);
     });
@@ -38296,7 +38458,9 @@
   unittest.group('obj-schema-CommitmentsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitmentsScopedListWarning();
-      var od = api.CommitmentsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitmentsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitmentsScopedListWarning(od as api.CommitmentsScopedListWarning);
     });
   });
@@ -38304,7 +38468,9 @@
   unittest.group('obj-schema-CommitmentsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitmentsScopedList();
-      var od = api.CommitmentsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitmentsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitmentsScopedList(od as api.CommitmentsScopedList);
     });
   });
@@ -38312,7 +38478,9 @@
   unittest.group('obj-schema-Condition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCondition();
-      var od = api.Condition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Condition.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCondition(od as api.Condition);
     });
   });
@@ -38320,7 +38488,9 @@
   unittest.group('obj-schema-ConfidentialInstanceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfidentialInstanceConfig();
-      var od = api.ConfidentialInstanceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfidentialInstanceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfidentialInstanceConfig(od as api.ConfidentialInstanceConfig);
     });
   });
@@ -38328,7 +38498,9 @@
   unittest.group('obj-schema-ConnectionDraining', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConnectionDraining();
-      var od = api.ConnectionDraining.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConnectionDraining.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConnectionDraining(od as api.ConnectionDraining);
     });
   });
@@ -38336,7 +38508,9 @@
   unittest.group('obj-schema-ConsistentHashLoadBalancerSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConsistentHashLoadBalancerSettings();
-      var od = api.ConsistentHashLoadBalancerSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConsistentHashLoadBalancerSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConsistentHashLoadBalancerSettings(
           od as api.ConsistentHashLoadBalancerSettings);
     });
@@ -38345,8 +38519,9 @@
   unittest.group('obj-schema-ConsistentHashLoadBalancerSettingsHttpCookie', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConsistentHashLoadBalancerSettingsHttpCookie();
-      var od =
-          api.ConsistentHashLoadBalancerSettingsHttpCookie.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConsistentHashLoadBalancerSettingsHttpCookie.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConsistentHashLoadBalancerSettingsHttpCookie(
           od as api.ConsistentHashLoadBalancerSettingsHttpCookie);
     });
@@ -38355,7 +38530,9 @@
   unittest.group('obj-schema-CorsPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCorsPolicy();
-      var od = api.CorsPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CorsPolicy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCorsPolicy(od as api.CorsPolicy);
     });
   });
@@ -38363,7 +38540,9 @@
   unittest.group('obj-schema-CustomerEncryptionKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerEncryptionKey();
-      var od = api.CustomerEncryptionKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerEncryptionKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerEncryptionKey(od as api.CustomerEncryptionKey);
     });
   });
@@ -38371,7 +38550,9 @@
   unittest.group('obj-schema-CustomerEncryptionKeyProtectedDisk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerEncryptionKeyProtectedDisk();
-      var od = api.CustomerEncryptionKeyProtectedDisk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerEncryptionKeyProtectedDisk.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerEncryptionKeyProtectedDisk(
           od as api.CustomerEncryptionKeyProtectedDisk);
     });
@@ -38380,7 +38561,9 @@
   unittest.group('obj-schema-DeprecationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeprecationStatus();
-      var od = api.DeprecationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeprecationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeprecationStatus(od as api.DeprecationStatus);
     });
   });
@@ -38388,7 +38571,8 @@
   unittest.group('obj-schema-Disk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisk();
-      var od = api.Disk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Disk.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDisk(od as api.Disk);
     });
   });
@@ -38396,7 +38580,9 @@
   unittest.group('obj-schema-DiskAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskAggregatedListWarningData();
-      var od = api.DiskAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskAggregatedListWarningData(
           od as api.DiskAggregatedListWarningData);
     });
@@ -38405,7 +38591,9 @@
   unittest.group('obj-schema-DiskAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskAggregatedListWarning();
-      var od = api.DiskAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskAggregatedListWarning(od as api.DiskAggregatedListWarning);
     });
   });
@@ -38413,7 +38601,9 @@
   unittest.group('obj-schema-DiskAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskAggregatedList();
-      var od = api.DiskAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskAggregatedList(od as api.DiskAggregatedList);
     });
   });
@@ -38421,7 +38611,9 @@
   unittest.group('obj-schema-DiskInstantiationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskInstantiationConfig();
-      var od = api.DiskInstantiationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskInstantiationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskInstantiationConfig(od as api.DiskInstantiationConfig);
     });
   });
@@ -38429,7 +38621,9 @@
   unittest.group('obj-schema-DiskListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskListWarningData();
-      var od = api.DiskListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskListWarningData(od as api.DiskListWarningData);
     });
   });
@@ -38437,7 +38631,9 @@
   unittest.group('obj-schema-DiskListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskListWarning();
-      var od = api.DiskListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskListWarning(od as api.DiskListWarning);
     });
   });
@@ -38445,7 +38641,9 @@
   unittest.group('obj-schema-DiskList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskList();
-      var od = api.DiskList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DiskList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDiskList(od as api.DiskList);
     });
   });
@@ -38453,7 +38651,9 @@
   unittest.group('obj-schema-DiskMoveRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskMoveRequest();
-      var od = api.DiskMoveRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskMoveRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskMoveRequest(od as api.DiskMoveRequest);
     });
   });
@@ -38461,7 +38661,9 @@
   unittest.group('obj-schema-DiskType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskType();
-      var od = api.DiskType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DiskType.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDiskType(od as api.DiskType);
     });
   });
@@ -38469,7 +38671,9 @@
   unittest.group('obj-schema-DiskTypeAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskTypeAggregatedListWarningData();
-      var od = api.DiskTypeAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskTypeAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskTypeAggregatedListWarningData(
           od as api.DiskTypeAggregatedListWarningData);
     });
@@ -38478,7 +38682,9 @@
   unittest.group('obj-schema-DiskTypeAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskTypeAggregatedListWarning();
-      var od = api.DiskTypeAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskTypeAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskTypeAggregatedListWarning(
           od as api.DiskTypeAggregatedListWarning);
     });
@@ -38487,7 +38693,9 @@
   unittest.group('obj-schema-DiskTypeAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskTypeAggregatedList();
-      var od = api.DiskTypeAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskTypeAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskTypeAggregatedList(od as api.DiskTypeAggregatedList);
     });
   });
@@ -38495,7 +38703,9 @@
   unittest.group('obj-schema-DiskTypeListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskTypeListWarningData();
-      var od = api.DiskTypeListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskTypeListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskTypeListWarningData(od as api.DiskTypeListWarningData);
     });
   });
@@ -38503,7 +38713,9 @@
   unittest.group('obj-schema-DiskTypeListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskTypeListWarning();
-      var od = api.DiskTypeListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskTypeListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskTypeListWarning(od as api.DiskTypeListWarning);
     });
   });
@@ -38511,7 +38723,9 @@
   unittest.group('obj-schema-DiskTypeList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskTypeList();
-      var od = api.DiskTypeList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskTypeList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskTypeList(od as api.DiskTypeList);
     });
   });
@@ -38519,7 +38733,9 @@
   unittest.group('obj-schema-DiskTypesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskTypesScopedListWarningData();
-      var od = api.DiskTypesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskTypesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskTypesScopedListWarningData(
           od as api.DiskTypesScopedListWarningData);
     });
@@ -38528,7 +38744,9 @@
   unittest.group('obj-schema-DiskTypesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskTypesScopedListWarning();
-      var od = api.DiskTypesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskTypesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskTypesScopedListWarning(od as api.DiskTypesScopedListWarning);
     });
   });
@@ -38536,7 +38754,9 @@
   unittest.group('obj-schema-DiskTypesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskTypesScopedList();
-      var od = api.DiskTypesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskTypesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskTypesScopedList(od as api.DiskTypesScopedList);
     });
   });
@@ -38544,7 +38764,9 @@
   unittest.group('obj-schema-DisksAddResourcePoliciesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisksAddResourcePoliciesRequest();
-      var od = api.DisksAddResourcePoliciesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisksAddResourcePoliciesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisksAddResourcePoliciesRequest(
           od as api.DisksAddResourcePoliciesRequest);
     });
@@ -38553,7 +38775,9 @@
   unittest.group('obj-schema-DisksRemoveResourcePoliciesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisksRemoveResourcePoliciesRequest();
-      var od = api.DisksRemoveResourcePoliciesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisksRemoveResourcePoliciesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisksRemoveResourcePoliciesRequest(
           od as api.DisksRemoveResourcePoliciesRequest);
     });
@@ -38562,7 +38786,9 @@
   unittest.group('obj-schema-DisksResizeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisksResizeRequest();
-      var od = api.DisksResizeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisksResizeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisksResizeRequest(od as api.DisksResizeRequest);
     });
   });
@@ -38570,7 +38796,9 @@
   unittest.group('obj-schema-DisksScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisksScopedListWarningData();
-      var od = api.DisksScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisksScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisksScopedListWarningData(od as api.DisksScopedListWarningData);
     });
   });
@@ -38578,7 +38806,9 @@
   unittest.group('obj-schema-DisksScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisksScopedListWarning();
-      var od = api.DisksScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisksScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisksScopedListWarning(od as api.DisksScopedListWarning);
     });
   });
@@ -38586,7 +38816,9 @@
   unittest.group('obj-schema-DisksScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisksScopedList();
-      var od = api.DisksScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisksScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisksScopedList(od as api.DisksScopedList);
     });
   });
@@ -38594,7 +38826,9 @@
   unittest.group('obj-schema-DisplayDevice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisplayDevice();
-      var od = api.DisplayDevice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisplayDevice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisplayDevice(od as api.DisplayDevice);
     });
   });
@@ -38602,7 +38836,9 @@
   unittest.group('obj-schema-DistributionPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDistributionPolicy();
-      var od = api.DistributionPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DistributionPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDistributionPolicy(od as api.DistributionPolicy);
     });
   });
@@ -38610,7 +38846,9 @@
   unittest.group('obj-schema-DistributionPolicyZoneConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDistributionPolicyZoneConfiguration();
-      var od = api.DistributionPolicyZoneConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DistributionPolicyZoneConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDistributionPolicyZoneConfiguration(
           od as api.DistributionPolicyZoneConfiguration);
     });
@@ -38619,7 +38857,9 @@
   unittest.group('obj-schema-Duration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDuration();
-      var od = api.Duration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Duration.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDuration(od as api.Duration);
     });
   });
@@ -38627,7 +38867,9 @@
   unittest.group('obj-schema-ExchangedPeeringRoute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExchangedPeeringRoute();
-      var od = api.ExchangedPeeringRoute.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExchangedPeeringRoute.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExchangedPeeringRoute(od as api.ExchangedPeeringRoute);
     });
   });
@@ -38635,7 +38877,9 @@
   unittest.group('obj-schema-ExchangedPeeringRoutesListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExchangedPeeringRoutesListWarningData();
-      var od = api.ExchangedPeeringRoutesListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExchangedPeeringRoutesListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExchangedPeeringRoutesListWarningData(
           od as api.ExchangedPeeringRoutesListWarningData);
     });
@@ -38644,7 +38888,9 @@
   unittest.group('obj-schema-ExchangedPeeringRoutesListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExchangedPeeringRoutesListWarning();
-      var od = api.ExchangedPeeringRoutesListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExchangedPeeringRoutesListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExchangedPeeringRoutesListWarning(
           od as api.ExchangedPeeringRoutesListWarning);
     });
@@ -38653,7 +38899,9 @@
   unittest.group('obj-schema-ExchangedPeeringRoutesList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExchangedPeeringRoutesList();
-      var od = api.ExchangedPeeringRoutesList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExchangedPeeringRoutesList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExchangedPeeringRoutesList(od as api.ExchangedPeeringRoutesList);
     });
   });
@@ -38661,7 +38909,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -38669,7 +38918,9 @@
   unittest.group('obj-schema-ExternalVpnGateway', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExternalVpnGateway();
-      var od = api.ExternalVpnGateway.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExternalVpnGateway.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExternalVpnGateway(od as api.ExternalVpnGateway);
     });
   });
@@ -38677,7 +38928,9 @@
   unittest.group('obj-schema-ExternalVpnGatewayInterface', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExternalVpnGatewayInterface();
-      var od = api.ExternalVpnGatewayInterface.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExternalVpnGatewayInterface.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExternalVpnGatewayInterface(od as api.ExternalVpnGatewayInterface);
     });
   });
@@ -38685,7 +38938,9 @@
   unittest.group('obj-schema-ExternalVpnGatewayListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExternalVpnGatewayListWarningData();
-      var od = api.ExternalVpnGatewayListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExternalVpnGatewayListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExternalVpnGatewayListWarningData(
           od as api.ExternalVpnGatewayListWarningData);
     });
@@ -38694,7 +38949,9 @@
   unittest.group('obj-schema-ExternalVpnGatewayListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExternalVpnGatewayListWarning();
-      var od = api.ExternalVpnGatewayListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExternalVpnGatewayListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExternalVpnGatewayListWarning(
           od as api.ExternalVpnGatewayListWarning);
     });
@@ -38703,7 +38960,9 @@
   unittest.group('obj-schema-ExternalVpnGatewayList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExternalVpnGatewayList();
-      var od = api.ExternalVpnGatewayList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExternalVpnGatewayList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExternalVpnGatewayList(od as api.ExternalVpnGatewayList);
     });
   });
@@ -38711,7 +38970,9 @@
   unittest.group('obj-schema-FileContentBuffer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileContentBuffer();
-      var od = api.FileContentBuffer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileContentBuffer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileContentBuffer(od as api.FileContentBuffer);
     });
   });
@@ -38719,7 +38980,9 @@
   unittest.group('obj-schema-FirewallAllowed', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallAllowed();
-      var od = api.FirewallAllowed.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallAllowed.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallAllowed(od as api.FirewallAllowed);
     });
   });
@@ -38727,7 +38990,9 @@
   unittest.group('obj-schema-FirewallDenied', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallDenied();
-      var od = api.FirewallDenied.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallDenied.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallDenied(od as api.FirewallDenied);
     });
   });
@@ -38735,7 +39000,9 @@
   unittest.group('obj-schema-Firewall', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewall();
-      var od = api.Firewall.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Firewall.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFirewall(od as api.Firewall);
     });
   });
@@ -38743,7 +39010,9 @@
   unittest.group('obj-schema-FirewallListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallListWarningData();
-      var od = api.FirewallListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallListWarningData(od as api.FirewallListWarningData);
     });
   });
@@ -38751,7 +39020,9 @@
   unittest.group('obj-schema-FirewallListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallListWarning();
-      var od = api.FirewallListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallListWarning(od as api.FirewallListWarning);
     });
   });
@@ -38759,7 +39030,9 @@
   unittest.group('obj-schema-FirewallList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallList();
-      var od = api.FirewallList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallList(od as api.FirewallList);
     });
   });
@@ -38767,7 +39040,9 @@
   unittest.group('obj-schema-FirewallLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallLogConfig();
-      var od = api.FirewallLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallLogConfig(od as api.FirewallLogConfig);
     });
   });
@@ -38775,8 +39050,9 @@
   unittest.group('obj-schema-FirewallPoliciesListAssociationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallPoliciesListAssociationsResponse();
-      var od =
-          api.FirewallPoliciesListAssociationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallPoliciesListAssociationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallPoliciesListAssociationsResponse(
           od as api.FirewallPoliciesListAssociationsResponse);
     });
@@ -38785,7 +39061,9 @@
   unittest.group('obj-schema-FirewallPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallPolicy();
-      var od = api.FirewallPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallPolicy(od as api.FirewallPolicy);
     });
   });
@@ -38793,7 +39071,9 @@
   unittest.group('obj-schema-FirewallPolicyAssociation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallPolicyAssociation();
-      var od = api.FirewallPolicyAssociation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallPolicyAssociation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallPolicyAssociation(od as api.FirewallPolicyAssociation);
     });
   });
@@ -38801,7 +39081,9 @@
   unittest.group('obj-schema-FirewallPolicyListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallPolicyListWarningData();
-      var od = api.FirewallPolicyListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallPolicyListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallPolicyListWarningData(
           od as api.FirewallPolicyListWarningData);
     });
@@ -38810,7 +39092,9 @@
   unittest.group('obj-schema-FirewallPolicyListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallPolicyListWarning();
-      var od = api.FirewallPolicyListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallPolicyListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallPolicyListWarning(od as api.FirewallPolicyListWarning);
     });
   });
@@ -38818,7 +39102,9 @@
   unittest.group('obj-schema-FirewallPolicyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallPolicyList();
-      var od = api.FirewallPolicyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallPolicyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallPolicyList(od as api.FirewallPolicyList);
     });
   });
@@ -38826,7 +39112,9 @@
   unittest.group('obj-schema-FirewallPolicyRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallPolicyRule();
-      var od = api.FirewallPolicyRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallPolicyRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallPolicyRule(od as api.FirewallPolicyRule);
     });
   });
@@ -38834,7 +39122,9 @@
   unittest.group('obj-schema-FirewallPolicyRuleMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallPolicyRuleMatcher();
-      var od = api.FirewallPolicyRuleMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallPolicyRuleMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallPolicyRuleMatcher(od as api.FirewallPolicyRuleMatcher);
     });
   });
@@ -38842,7 +39132,9 @@
   unittest.group('obj-schema-FirewallPolicyRuleMatcherLayer4Config', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallPolicyRuleMatcherLayer4Config();
-      var od = api.FirewallPolicyRuleMatcherLayer4Config.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallPolicyRuleMatcherLayer4Config.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallPolicyRuleMatcherLayer4Config(
           od as api.FirewallPolicyRuleMatcherLayer4Config);
     });
@@ -38851,7 +39143,9 @@
   unittest.group('obj-schema-FixedOrPercent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFixedOrPercent();
-      var od = api.FixedOrPercent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FixedOrPercent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFixedOrPercent(od as api.FixedOrPercent);
     });
   });
@@ -38859,7 +39153,9 @@
   unittest.group('obj-schema-ForwardingRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRule();
-      var od = api.ForwardingRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRule(od as api.ForwardingRule);
     });
   });
@@ -38867,7 +39163,9 @@
   unittest.group('obj-schema-ForwardingRuleAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRuleAggregatedListWarningData();
-      var od = api.ForwardingRuleAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRuleAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRuleAggregatedListWarningData(
           od as api.ForwardingRuleAggregatedListWarningData);
     });
@@ -38876,7 +39174,9 @@
   unittest.group('obj-schema-ForwardingRuleAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRuleAggregatedListWarning();
-      var od = api.ForwardingRuleAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRuleAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRuleAggregatedListWarning(
           od as api.ForwardingRuleAggregatedListWarning);
     });
@@ -38885,7 +39185,9 @@
   unittest.group('obj-schema-ForwardingRuleAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRuleAggregatedList();
-      var od = api.ForwardingRuleAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRuleAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRuleAggregatedList(od as api.ForwardingRuleAggregatedList);
     });
   });
@@ -38893,7 +39195,9 @@
   unittest.group('obj-schema-ForwardingRuleListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRuleListWarningData();
-      var od = api.ForwardingRuleListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRuleListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRuleListWarningData(
           od as api.ForwardingRuleListWarningData);
     });
@@ -38902,7 +39206,9 @@
   unittest.group('obj-schema-ForwardingRuleListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRuleListWarning();
-      var od = api.ForwardingRuleListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRuleListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRuleListWarning(od as api.ForwardingRuleListWarning);
     });
   });
@@ -38910,7 +39216,9 @@
   unittest.group('obj-schema-ForwardingRuleList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRuleList();
-      var od = api.ForwardingRuleList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRuleList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRuleList(od as api.ForwardingRuleList);
     });
   });
@@ -38918,7 +39226,9 @@
   unittest.group('obj-schema-ForwardingRuleReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRuleReference();
-      var od = api.ForwardingRuleReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRuleReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRuleReference(od as api.ForwardingRuleReference);
     });
   });
@@ -38926,8 +39236,9 @@
   unittest.group('obj-schema-ForwardingRuleServiceDirectoryRegistration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRuleServiceDirectoryRegistration();
-      var od =
-          api.ForwardingRuleServiceDirectoryRegistration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRuleServiceDirectoryRegistration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRuleServiceDirectoryRegistration(
           od as api.ForwardingRuleServiceDirectoryRegistration);
     });
@@ -38936,7 +39247,9 @@
   unittest.group('obj-schema-ForwardingRulesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRulesScopedListWarningData();
-      var od = api.ForwardingRulesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRulesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRulesScopedListWarningData(
           od as api.ForwardingRulesScopedListWarningData);
     });
@@ -38945,7 +39258,9 @@
   unittest.group('obj-schema-ForwardingRulesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRulesScopedListWarning();
-      var od = api.ForwardingRulesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRulesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRulesScopedListWarning(
           od as api.ForwardingRulesScopedListWarning);
     });
@@ -38954,7 +39269,9 @@
   unittest.group('obj-schema-ForwardingRulesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRulesScopedList();
-      var od = api.ForwardingRulesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRulesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRulesScopedList(od as api.ForwardingRulesScopedList);
     });
   });
@@ -38962,7 +39279,9 @@
   unittest.group('obj-schema-GRPCHealthCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGRPCHealthCheck();
-      var od = api.GRPCHealthCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GRPCHealthCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGRPCHealthCheck(od as api.GRPCHealthCheck);
     });
   });
@@ -38971,8 +39290,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlobalNetworkEndpointGroupsAttachEndpointsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GlobalNetworkEndpointGroupsAttachEndpointsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGlobalNetworkEndpointGroupsAttachEndpointsRequest(
           od as api.GlobalNetworkEndpointGroupsAttachEndpointsRequest);
     });
@@ -38982,8 +39302,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlobalNetworkEndpointGroupsDetachEndpointsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GlobalNetworkEndpointGroupsDetachEndpointsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGlobalNetworkEndpointGroupsDetachEndpointsRequest(
           od as api.GlobalNetworkEndpointGroupsDetachEndpointsRequest);
     });
@@ -38992,7 +39313,9 @@
   unittest.group('obj-schema-GlobalOrganizationSetPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlobalOrganizationSetPolicyRequest();
-      var od = api.GlobalOrganizationSetPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GlobalOrganizationSetPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGlobalOrganizationSetPolicyRequest(
           od as api.GlobalOrganizationSetPolicyRequest);
     });
@@ -39001,7 +39324,9 @@
   unittest.group('obj-schema-GlobalSetLabelsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlobalSetLabelsRequest();
-      var od = api.GlobalSetLabelsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GlobalSetLabelsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGlobalSetLabelsRequest(od as api.GlobalSetLabelsRequest);
     });
   });
@@ -39009,7 +39334,9 @@
   unittest.group('obj-schema-GlobalSetPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlobalSetPolicyRequest();
-      var od = api.GlobalSetPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GlobalSetPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGlobalSetPolicyRequest(od as api.GlobalSetPolicyRequest);
     });
   });
@@ -39017,7 +39344,9 @@
   unittest.group('obj-schema-GuestAttributes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGuestAttributes();
-      var od = api.GuestAttributes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GuestAttributes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGuestAttributes(od as api.GuestAttributes);
     });
   });
@@ -39025,7 +39354,9 @@
   unittest.group('obj-schema-GuestAttributesEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGuestAttributesEntry();
-      var od = api.GuestAttributesEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GuestAttributesEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGuestAttributesEntry(od as api.GuestAttributesEntry);
     });
   });
@@ -39033,7 +39364,9 @@
   unittest.group('obj-schema-GuestAttributesValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGuestAttributesValue();
-      var od = api.GuestAttributesValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GuestAttributesValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGuestAttributesValue(od as api.GuestAttributesValue);
     });
   });
@@ -39041,7 +39374,9 @@
   unittest.group('obj-schema-GuestOsFeature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGuestOsFeature();
-      var od = api.GuestOsFeature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GuestOsFeature.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGuestOsFeature(od as api.GuestOsFeature);
     });
   });
@@ -39049,7 +39384,9 @@
   unittest.group('obj-schema-HTTP2HealthCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHTTP2HealthCheck();
-      var od = api.HTTP2HealthCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HTTP2HealthCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHTTP2HealthCheck(od as api.HTTP2HealthCheck);
     });
   });
@@ -39057,7 +39394,9 @@
   unittest.group('obj-schema-HTTPHealthCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHTTPHealthCheck();
-      var od = api.HTTPHealthCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HTTPHealthCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHTTPHealthCheck(od as api.HTTPHealthCheck);
     });
   });
@@ -39065,7 +39404,9 @@
   unittest.group('obj-schema-HTTPSHealthCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHTTPSHealthCheck();
-      var od = api.HTTPSHealthCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HTTPSHealthCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHTTPSHealthCheck(od as api.HTTPSHealthCheck);
     });
   });
@@ -39073,7 +39414,9 @@
   unittest.group('obj-schema-HealthCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheck();
-      var od = api.HealthCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheck(od as api.HealthCheck);
     });
   });
@@ -39081,7 +39424,9 @@
   unittest.group('obj-schema-HealthCheckListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheckListWarningData();
-      var od = api.HealthCheckListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheckListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheckListWarningData(od as api.HealthCheckListWarningData);
     });
   });
@@ -39089,7 +39434,9 @@
   unittest.group('obj-schema-HealthCheckListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheckListWarning();
-      var od = api.HealthCheckListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheckListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheckListWarning(od as api.HealthCheckListWarning);
     });
   });
@@ -39097,7 +39444,9 @@
   unittest.group('obj-schema-HealthCheckList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheckList();
-      var od = api.HealthCheckList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheckList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheckList(od as api.HealthCheckList);
     });
   });
@@ -39105,7 +39454,9 @@
   unittest.group('obj-schema-HealthCheckLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheckLogConfig();
-      var od = api.HealthCheckLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheckLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheckLogConfig(od as api.HealthCheckLogConfig);
     });
   });
@@ -39113,7 +39464,9 @@
   unittest.group('obj-schema-HealthCheckReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheckReference();
-      var od = api.HealthCheckReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheckReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheckReference(od as api.HealthCheckReference);
     });
   });
@@ -39121,7 +39474,9 @@
   unittest.group('obj-schema-HealthCheckService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheckService();
-      var od = api.HealthCheckService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheckService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheckService(od as api.HealthCheckService);
     });
   });
@@ -39129,7 +39484,9 @@
   unittest.group('obj-schema-HealthCheckServiceReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheckServiceReference();
-      var od = api.HealthCheckServiceReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheckServiceReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheckServiceReference(od as api.HealthCheckServiceReference);
     });
   });
@@ -39137,7 +39494,9 @@
   unittest.group('obj-schema-HealthCheckServicesListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheckServicesListWarningData();
-      var od = api.HealthCheckServicesListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheckServicesListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheckServicesListWarningData(
           od as api.HealthCheckServicesListWarningData);
     });
@@ -39146,7 +39505,9 @@
   unittest.group('obj-schema-HealthCheckServicesListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheckServicesListWarning();
-      var od = api.HealthCheckServicesListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheckServicesListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheckServicesListWarning(
           od as api.HealthCheckServicesListWarning);
     });
@@ -39155,7 +39516,9 @@
   unittest.group('obj-schema-HealthCheckServicesList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthCheckServicesList();
-      var od = api.HealthCheckServicesList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthCheckServicesList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthCheckServicesList(od as api.HealthCheckServicesList);
     });
   });
@@ -39163,7 +39526,9 @@
   unittest.group('obj-schema-HealthChecksAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthChecksAggregatedListWarningData();
-      var od = api.HealthChecksAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthChecksAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthChecksAggregatedListWarningData(
           od as api.HealthChecksAggregatedListWarningData);
     });
@@ -39172,7 +39537,9 @@
   unittest.group('obj-schema-HealthChecksAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthChecksAggregatedListWarning();
-      var od = api.HealthChecksAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthChecksAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthChecksAggregatedListWarning(
           od as api.HealthChecksAggregatedListWarning);
     });
@@ -39181,7 +39548,9 @@
   unittest.group('obj-schema-HealthChecksAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthChecksAggregatedList();
-      var od = api.HealthChecksAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthChecksAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthChecksAggregatedList(od as api.HealthChecksAggregatedList);
     });
   });
@@ -39189,7 +39558,9 @@
   unittest.group('obj-schema-HealthChecksScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthChecksScopedListWarningData();
-      var od = api.HealthChecksScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthChecksScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthChecksScopedListWarningData(
           od as api.HealthChecksScopedListWarningData);
     });
@@ -39198,7 +39569,9 @@
   unittest.group('obj-schema-HealthChecksScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthChecksScopedListWarning();
-      var od = api.HealthChecksScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthChecksScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthChecksScopedListWarning(
           od as api.HealthChecksScopedListWarning);
     });
@@ -39207,7 +39580,9 @@
   unittest.group('obj-schema-HealthChecksScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthChecksScopedList();
-      var od = api.HealthChecksScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthChecksScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthChecksScopedList(od as api.HealthChecksScopedList);
     });
   });
@@ -39215,7 +39590,9 @@
   unittest.group('obj-schema-HealthStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthStatus();
-      var od = api.HealthStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthStatus(od as api.HealthStatus);
     });
   });
@@ -39223,7 +39600,9 @@
   unittest.group('obj-schema-HealthStatusForNetworkEndpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHealthStatusForNetworkEndpoint();
-      var od = api.HealthStatusForNetworkEndpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HealthStatusForNetworkEndpoint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHealthStatusForNetworkEndpoint(
           od as api.HealthStatusForNetworkEndpoint);
     });
@@ -39232,7 +39611,9 @@
   unittest.group('obj-schema-HostRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHostRule();
-      var od = api.HostRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HostRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHostRule(od as api.HostRule);
     });
   });
@@ -39240,7 +39621,9 @@
   unittest.group('obj-schema-HttpFaultAbort', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpFaultAbort();
-      var od = api.HttpFaultAbort.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpFaultAbort.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpFaultAbort(od as api.HttpFaultAbort);
     });
   });
@@ -39248,7 +39631,9 @@
   unittest.group('obj-schema-HttpFaultDelay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpFaultDelay();
-      var od = api.HttpFaultDelay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpFaultDelay.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpFaultDelay(od as api.HttpFaultDelay);
     });
   });
@@ -39256,7 +39641,9 @@
   unittest.group('obj-schema-HttpFaultInjection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpFaultInjection();
-      var od = api.HttpFaultInjection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpFaultInjection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpFaultInjection(od as api.HttpFaultInjection);
     });
   });
@@ -39264,7 +39651,9 @@
   unittest.group('obj-schema-HttpHeaderAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpHeaderAction();
-      var od = api.HttpHeaderAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpHeaderAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpHeaderAction(od as api.HttpHeaderAction);
     });
   });
@@ -39272,7 +39661,9 @@
   unittest.group('obj-schema-HttpHeaderMatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpHeaderMatch();
-      var od = api.HttpHeaderMatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpHeaderMatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpHeaderMatch(od as api.HttpHeaderMatch);
     });
   });
@@ -39280,7 +39671,9 @@
   unittest.group('obj-schema-HttpHeaderOption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpHeaderOption();
-      var od = api.HttpHeaderOption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpHeaderOption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpHeaderOption(od as api.HttpHeaderOption);
     });
   });
@@ -39288,7 +39681,9 @@
   unittest.group('obj-schema-HttpHealthCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpHealthCheck();
-      var od = api.HttpHealthCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpHealthCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpHealthCheck(od as api.HttpHealthCheck);
     });
   });
@@ -39296,7 +39691,9 @@
   unittest.group('obj-schema-HttpHealthCheckListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpHealthCheckListWarningData();
-      var od = api.HttpHealthCheckListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpHealthCheckListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpHealthCheckListWarningData(
           od as api.HttpHealthCheckListWarningData);
     });
@@ -39305,7 +39702,9 @@
   unittest.group('obj-schema-HttpHealthCheckListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpHealthCheckListWarning();
-      var od = api.HttpHealthCheckListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpHealthCheckListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpHealthCheckListWarning(od as api.HttpHealthCheckListWarning);
     });
   });
@@ -39313,7 +39712,9 @@
   unittest.group('obj-schema-HttpHealthCheckList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpHealthCheckList();
-      var od = api.HttpHealthCheckList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpHealthCheckList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpHealthCheckList(od as api.HttpHealthCheckList);
     });
   });
@@ -39321,7 +39722,9 @@
   unittest.group('obj-schema-HttpQueryParameterMatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpQueryParameterMatch();
-      var od = api.HttpQueryParameterMatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpQueryParameterMatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpQueryParameterMatch(od as api.HttpQueryParameterMatch);
     });
   });
@@ -39329,7 +39732,9 @@
   unittest.group('obj-schema-HttpRedirectAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRedirectAction();
-      var od = api.HttpRedirectAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpRedirectAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpRedirectAction(od as api.HttpRedirectAction);
     });
   });
@@ -39337,7 +39742,9 @@
   unittest.group('obj-schema-HttpRetryPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRetryPolicy();
-      var od = api.HttpRetryPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpRetryPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpRetryPolicy(od as api.HttpRetryPolicy);
     });
   });
@@ -39345,7 +39752,9 @@
   unittest.group('obj-schema-HttpRouteAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRouteAction();
-      var od = api.HttpRouteAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpRouteAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpRouteAction(od as api.HttpRouteAction);
     });
   });
@@ -39353,7 +39762,9 @@
   unittest.group('obj-schema-HttpRouteRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRouteRule();
-      var od = api.HttpRouteRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpRouteRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpRouteRule(od as api.HttpRouteRule);
     });
   });
@@ -39361,7 +39772,9 @@
   unittest.group('obj-schema-HttpRouteRuleMatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRouteRuleMatch();
-      var od = api.HttpRouteRuleMatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpRouteRuleMatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpRouteRuleMatch(od as api.HttpRouteRuleMatch);
     });
   });
@@ -39369,7 +39782,9 @@
   unittest.group('obj-schema-HttpsHealthCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpsHealthCheck();
-      var od = api.HttpsHealthCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpsHealthCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpsHealthCheck(od as api.HttpsHealthCheck);
     });
   });
@@ -39377,7 +39792,9 @@
   unittest.group('obj-schema-HttpsHealthCheckListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpsHealthCheckListWarningData();
-      var od = api.HttpsHealthCheckListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpsHealthCheckListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpsHealthCheckListWarningData(
           od as api.HttpsHealthCheckListWarningData);
     });
@@ -39386,7 +39803,9 @@
   unittest.group('obj-schema-HttpsHealthCheckListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpsHealthCheckListWarning();
-      var od = api.HttpsHealthCheckListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpsHealthCheckListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpsHealthCheckListWarning(od as api.HttpsHealthCheckListWarning);
     });
   });
@@ -39394,7 +39813,9 @@
   unittest.group('obj-schema-HttpsHealthCheckList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpsHealthCheckList();
-      var od = api.HttpsHealthCheckList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpsHealthCheckList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpsHealthCheckList(od as api.HttpsHealthCheckList);
     });
   });
@@ -39402,7 +39823,9 @@
   unittest.group('obj-schema-ImageRawDisk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageRawDisk();
-      var od = api.ImageRawDisk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageRawDisk.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageRawDisk(od as api.ImageRawDisk);
     });
   });
@@ -39410,7 +39833,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -39418,7 +39842,9 @@
   unittest.group('obj-schema-ImageListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageListWarningData();
-      var od = api.ImageListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageListWarningData(od as api.ImageListWarningData);
     });
   });
@@ -39426,7 +39852,9 @@
   unittest.group('obj-schema-ImageListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageListWarning();
-      var od = api.ImageListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageListWarning(od as api.ImageListWarning);
     });
   });
@@ -39434,7 +39862,9 @@
   unittest.group('obj-schema-ImageList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageList();
-      var od = api.ImageList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ImageList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImageList(od as api.ImageList);
     });
   });
@@ -39442,7 +39872,9 @@
   unittest.group('obj-schema-InitialStateConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInitialStateConfig();
-      var od = api.InitialStateConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InitialStateConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInitialStateConfig(od as api.InitialStateConfig);
     });
   });
@@ -39450,7 +39882,9 @@
   unittest.group('obj-schema-Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstance();
-      var od = api.Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Instance.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstance(od as api.Instance);
     });
   });
@@ -39458,7 +39892,9 @@
   unittest.group('obj-schema-InstanceAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceAggregatedListWarningData();
-      var od = api.InstanceAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceAggregatedListWarningData(
           od as api.InstanceAggregatedListWarningData);
     });
@@ -39467,7 +39903,9 @@
   unittest.group('obj-schema-InstanceAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceAggregatedListWarning();
-      var od = api.InstanceAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceAggregatedListWarning(
           od as api.InstanceAggregatedListWarning);
     });
@@ -39476,7 +39914,9 @@
   unittest.group('obj-schema-InstanceAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceAggregatedList();
-      var od = api.InstanceAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceAggregatedList(od as api.InstanceAggregatedList);
     });
   });
@@ -39484,7 +39924,9 @@
   unittest.group('obj-schema-InstanceGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroup();
-      var od = api.InstanceGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroup(od as api.InstanceGroup);
     });
   });
@@ -39492,7 +39934,9 @@
   unittest.group('obj-schema-InstanceGroupAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupAggregatedListWarningData();
-      var od = api.InstanceGroupAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupAggregatedListWarningData(
           od as api.InstanceGroupAggregatedListWarningData);
     });
@@ -39501,7 +39945,9 @@
   unittest.group('obj-schema-InstanceGroupAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupAggregatedListWarning();
-      var od = api.InstanceGroupAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupAggregatedListWarning(
           od as api.InstanceGroupAggregatedListWarning);
     });
@@ -39510,7 +39956,9 @@
   unittest.group('obj-schema-InstanceGroupAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupAggregatedList();
-      var od = api.InstanceGroupAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupAggregatedList(od as api.InstanceGroupAggregatedList);
     });
   });
@@ -39518,7 +39966,9 @@
   unittest.group('obj-schema-InstanceGroupListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupListWarningData();
-      var od = api.InstanceGroupListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupListWarningData(od as api.InstanceGroupListWarningData);
     });
   });
@@ -39526,7 +39976,9 @@
   unittest.group('obj-schema-InstanceGroupListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupListWarning();
-      var od = api.InstanceGroupListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupListWarning(od as api.InstanceGroupListWarning);
     });
   });
@@ -39534,7 +39986,9 @@
   unittest.group('obj-schema-InstanceGroupList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupList();
-      var od = api.InstanceGroupList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupList(od as api.InstanceGroupList);
     });
   });
@@ -39542,7 +39996,9 @@
   unittest.group('obj-schema-InstanceGroupManager', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManager();
-      var od = api.InstanceGroupManager.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManager.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManager(od as api.InstanceGroupManager);
     });
   });
@@ -39550,7 +40006,9 @@
   unittest.group('obj-schema-InstanceGroupManagerActionsSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerActionsSummary();
-      var od = api.InstanceGroupManagerActionsSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerActionsSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerActionsSummary(
           od as api.InstanceGroupManagerActionsSummary);
     });
@@ -39560,8 +40018,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerAggregatedListWarningData();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceGroupManagerAggregatedListWarningData.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerAggregatedListWarningData(
           od as api.InstanceGroupManagerAggregatedListWarningData);
     });
@@ -39570,8 +40029,9 @@
   unittest.group('obj-schema-InstanceGroupManagerAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerAggregatedListWarning();
-      var od =
-          api.InstanceGroupManagerAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerAggregatedListWarning(
           od as api.InstanceGroupManagerAggregatedListWarning);
     });
@@ -39580,7 +40040,9 @@
   unittest.group('obj-schema-InstanceGroupManagerAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerAggregatedList();
-      var od = api.InstanceGroupManagerAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerAggregatedList(
           od as api.InstanceGroupManagerAggregatedList);
     });
@@ -39589,7 +40051,9 @@
   unittest.group('obj-schema-InstanceGroupManagerAutoHealingPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerAutoHealingPolicy();
-      var od = api.InstanceGroupManagerAutoHealingPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerAutoHealingPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerAutoHealingPolicy(
           od as api.InstanceGroupManagerAutoHealingPolicy);
     });
@@ -39598,7 +40062,9 @@
   unittest.group('obj-schema-InstanceGroupManagerListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerListWarningData();
-      var od = api.InstanceGroupManagerListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerListWarningData(
           od as api.InstanceGroupManagerListWarningData);
     });
@@ -39607,7 +40073,9 @@
   unittest.group('obj-schema-InstanceGroupManagerListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerListWarning();
-      var od = api.InstanceGroupManagerListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerListWarning(
           od as api.InstanceGroupManagerListWarning);
     });
@@ -39616,7 +40084,9 @@
   unittest.group('obj-schema-InstanceGroupManagerList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerList();
-      var od = api.InstanceGroupManagerList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerList(od as api.InstanceGroupManagerList);
     });
   });
@@ -39624,7 +40094,9 @@
   unittest.group('obj-schema-InstanceGroupManagerStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerStatus();
-      var od = api.InstanceGroupManagerStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerStatus(od as api.InstanceGroupManagerStatus);
     });
   });
@@ -39632,7 +40104,9 @@
   unittest.group('obj-schema-InstanceGroupManagerStatusStateful', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerStatusStateful();
-      var od = api.InstanceGroupManagerStatusStateful.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerStatusStateful.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerStatusStateful(
           od as api.InstanceGroupManagerStatusStateful);
     });
@@ -39642,9 +40116,10 @@
       'obj-schema-InstanceGroupManagerStatusStatefulPerInstanceConfigs', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerStatusStatefulPerInstanceConfigs();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.InstanceGroupManagerStatusStatefulPerInstanceConfigs.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerStatusStatefulPerInstanceConfigs(
           od as api.InstanceGroupManagerStatusStatefulPerInstanceConfigs);
     });
@@ -39653,7 +40128,9 @@
   unittest.group('obj-schema-InstanceGroupManagerStatusVersionTarget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerStatusVersionTarget();
-      var od = api.InstanceGroupManagerStatusVersionTarget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerStatusVersionTarget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerStatusVersionTarget(
           od as api.InstanceGroupManagerStatusVersionTarget);
     });
@@ -39662,7 +40139,9 @@
   unittest.group('obj-schema-InstanceGroupManagerUpdatePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerUpdatePolicy();
-      var od = api.InstanceGroupManagerUpdatePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerUpdatePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerUpdatePolicy(
           od as api.InstanceGroupManagerUpdatePolicy);
     });
@@ -39671,7 +40150,9 @@
   unittest.group('obj-schema-InstanceGroupManagerVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagerVersion();
-      var od = api.InstanceGroupManagerVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagerVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagerVersion(od as api.InstanceGroupManagerVersion);
     });
   });
@@ -39679,8 +40160,9 @@
   unittest.group('obj-schema-InstanceGroupManagersAbandonInstancesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersAbandonInstancesRequest();
-      var od =
-          api.InstanceGroupManagersAbandonInstancesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagersAbandonInstancesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersAbandonInstancesRequest(
           od as api.InstanceGroupManagersAbandonInstancesRequest);
     });
@@ -39689,8 +40171,9 @@
   unittest.group('obj-schema-InstanceGroupManagersApplyUpdatesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersApplyUpdatesRequest();
-      var od =
-          api.InstanceGroupManagersApplyUpdatesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagersApplyUpdatesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersApplyUpdatesRequest(
           od as api.InstanceGroupManagersApplyUpdatesRequest);
     });
@@ -39699,8 +40182,9 @@
   unittest.group('obj-schema-InstanceGroupManagersCreateInstancesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersCreateInstancesRequest();
-      var od =
-          api.InstanceGroupManagersCreateInstancesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagersCreateInstancesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersCreateInstancesRequest(
           od as api.InstanceGroupManagersCreateInstancesRequest);
     });
@@ -39709,8 +40193,9 @@
   unittest.group('obj-schema-InstanceGroupManagersDeleteInstancesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersDeleteInstancesRequest();
-      var od =
-          api.InstanceGroupManagersDeleteInstancesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagersDeleteInstancesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersDeleteInstancesRequest(
           od as api.InstanceGroupManagersDeleteInstancesRequest);
     });
@@ -39720,8 +40205,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersDeletePerInstanceConfigsReq();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceGroupManagersDeletePerInstanceConfigsReq.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersDeletePerInstanceConfigsReq(
           od as api.InstanceGroupManagersDeletePerInstanceConfigsReq);
     });
@@ -39730,7 +40216,9 @@
   unittest.group('obj-schema-InstanceGroupManagersListErrorsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersListErrorsResponse();
-      var od = api.InstanceGroupManagersListErrorsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagersListErrorsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersListErrorsResponse(
           od as api.InstanceGroupManagersListErrorsResponse);
     });
@@ -39740,8 +40228,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersListManagedInstancesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceGroupManagersListManagedInstancesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersListManagedInstancesResponse(
           od as api.InstanceGroupManagersListManagedInstancesResponse);
     });
@@ -39752,8 +40241,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersListPerInstanceConfigsRespWarningData();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceGroupManagersListPerInstanceConfigsRespWarningData
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersListPerInstanceConfigsRespWarningData(
           od as api.InstanceGroupManagersListPerInstanceConfigsRespWarningData);
     });
@@ -39763,9 +40253,10 @@
       'obj-schema-InstanceGroupManagersListPerInstanceConfigsRespWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersListPerInstanceConfigsRespWarning();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.InstanceGroupManagersListPerInstanceConfigsRespWarning.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersListPerInstanceConfigsRespWarning(
           od as api.InstanceGroupManagersListPerInstanceConfigsRespWarning);
     });
@@ -39775,8 +40266,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersListPerInstanceConfigsResp();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceGroupManagersListPerInstanceConfigsResp.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersListPerInstanceConfigsResp(
           od as api.InstanceGroupManagersListPerInstanceConfigsResp);
     });
@@ -39786,8 +40278,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersPatchPerInstanceConfigsReq();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceGroupManagersPatchPerInstanceConfigsReq.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersPatchPerInstanceConfigsReq(
           od as api.InstanceGroupManagersPatchPerInstanceConfigsReq);
     });
@@ -39797,8 +40290,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersRecreateInstancesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceGroupManagersRecreateInstancesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersRecreateInstancesRequest(
           od as api.InstanceGroupManagersRecreateInstancesRequest);
     });
@@ -39807,8 +40301,9 @@
   unittest.group('obj-schema-InstanceGroupManagersScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersScopedListWarningData();
-      var od =
-          api.InstanceGroupManagersScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagersScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersScopedListWarningData(
           od as api.InstanceGroupManagersScopedListWarningData);
     });
@@ -39817,7 +40312,9 @@
   unittest.group('obj-schema-InstanceGroupManagersScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersScopedListWarning();
-      var od = api.InstanceGroupManagersScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagersScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersScopedListWarning(
           od as api.InstanceGroupManagersScopedListWarning);
     });
@@ -39826,7 +40323,9 @@
   unittest.group('obj-schema-InstanceGroupManagersScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersScopedList();
-      var od = api.InstanceGroupManagersScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagersScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersScopedList(
           od as api.InstanceGroupManagersScopedList);
     });
@@ -39836,8 +40335,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersSetInstanceTemplateRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceGroupManagersSetInstanceTemplateRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersSetInstanceTemplateRequest(
           od as api.InstanceGroupManagersSetInstanceTemplateRequest);
     });
@@ -39846,8 +40346,9 @@
   unittest.group('obj-schema-InstanceGroupManagersSetTargetPoolsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersSetTargetPoolsRequest();
-      var od =
-          api.InstanceGroupManagersSetTargetPoolsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupManagersSetTargetPoolsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersSetTargetPoolsRequest(
           od as api.InstanceGroupManagersSetTargetPoolsRequest);
     });
@@ -39857,8 +40358,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupManagersUpdatePerInstanceConfigsReq();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceGroupManagersUpdatePerInstanceConfigsReq.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupManagersUpdatePerInstanceConfigsReq(
           od as api.InstanceGroupManagersUpdatePerInstanceConfigsReq);
     });
@@ -39867,7 +40369,9 @@
   unittest.group('obj-schema-InstanceGroupsAddInstancesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupsAddInstancesRequest();
-      var od = api.InstanceGroupsAddInstancesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupsAddInstancesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupsAddInstancesRequest(
           od as api.InstanceGroupsAddInstancesRequest);
     });
@@ -39876,7 +40380,9 @@
   unittest.group('obj-schema-InstanceGroupsListInstancesWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupsListInstancesWarningData();
-      var od = api.InstanceGroupsListInstancesWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupsListInstancesWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupsListInstancesWarningData(
           od as api.InstanceGroupsListInstancesWarningData);
     });
@@ -39885,7 +40391,9 @@
   unittest.group('obj-schema-InstanceGroupsListInstancesWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupsListInstancesWarning();
-      var od = api.InstanceGroupsListInstancesWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupsListInstancesWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupsListInstancesWarning(
           od as api.InstanceGroupsListInstancesWarning);
     });
@@ -39894,7 +40402,9 @@
   unittest.group('obj-schema-InstanceGroupsListInstances', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupsListInstances();
-      var od = api.InstanceGroupsListInstances.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupsListInstances.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupsListInstances(od as api.InstanceGroupsListInstances);
     });
   });
@@ -39902,7 +40412,9 @@
   unittest.group('obj-schema-InstanceGroupsListInstancesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupsListInstancesRequest();
-      var od = api.InstanceGroupsListInstancesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupsListInstancesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupsListInstancesRequest(
           od as api.InstanceGroupsListInstancesRequest);
     });
@@ -39911,7 +40423,9 @@
   unittest.group('obj-schema-InstanceGroupsRemoveInstancesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupsRemoveInstancesRequest();
-      var od = api.InstanceGroupsRemoveInstancesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupsRemoveInstancesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupsRemoveInstancesRequest(
           od as api.InstanceGroupsRemoveInstancesRequest);
     });
@@ -39920,7 +40434,9 @@
   unittest.group('obj-schema-InstanceGroupsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupsScopedListWarningData();
-      var od = api.InstanceGroupsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupsScopedListWarningData(
           od as api.InstanceGroupsScopedListWarningData);
     });
@@ -39929,7 +40445,9 @@
   unittest.group('obj-schema-InstanceGroupsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupsScopedListWarning();
-      var od = api.InstanceGroupsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupsScopedListWarning(
           od as api.InstanceGroupsScopedListWarning);
     });
@@ -39938,7 +40456,9 @@
   unittest.group('obj-schema-InstanceGroupsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupsScopedList();
-      var od = api.InstanceGroupsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupsScopedList(od as api.InstanceGroupsScopedList);
     });
   });
@@ -39946,7 +40466,9 @@
   unittest.group('obj-schema-InstanceGroupsSetNamedPortsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupsSetNamedPortsRequest();
-      var od = api.InstanceGroupsSetNamedPortsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupsSetNamedPortsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupsSetNamedPortsRequest(
           od as api.InstanceGroupsSetNamedPortsRequest);
     });
@@ -39955,7 +40477,9 @@
   unittest.group('obj-schema-InstanceListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceListWarningData();
-      var od = api.InstanceListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceListWarningData(od as api.InstanceListWarningData);
     });
   });
@@ -39963,7 +40487,9 @@
   unittest.group('obj-schema-InstanceListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceListWarning();
-      var od = api.InstanceListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceListWarning(od as api.InstanceListWarning);
     });
   });
@@ -39971,7 +40497,9 @@
   unittest.group('obj-schema-InstanceList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceList();
-      var od = api.InstanceList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceList(od as api.InstanceList);
     });
   });
@@ -39979,7 +40507,9 @@
   unittest.group('obj-schema-InstanceListReferrersWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceListReferrersWarningData();
-      var od = api.InstanceListReferrersWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceListReferrersWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceListReferrersWarningData(
           od as api.InstanceListReferrersWarningData);
     });
@@ -39988,7 +40518,9 @@
   unittest.group('obj-schema-InstanceListReferrersWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceListReferrersWarning();
-      var od = api.InstanceListReferrersWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceListReferrersWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceListReferrersWarning(od as api.InstanceListReferrersWarning);
     });
   });
@@ -39996,7 +40528,9 @@
   unittest.group('obj-schema-InstanceListReferrers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceListReferrers();
-      var od = api.InstanceListReferrers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceListReferrers.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceListReferrers(od as api.InstanceListReferrers);
     });
   });
@@ -40004,7 +40538,9 @@
   unittest.group('obj-schema-InstanceManagedByIgmError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceManagedByIgmError();
-      var od = api.InstanceManagedByIgmError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceManagedByIgmError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceManagedByIgmError(od as api.InstanceManagedByIgmError);
     });
   });
@@ -40013,8 +40549,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceManagedByIgmErrorInstanceActionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceManagedByIgmErrorInstanceActionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceManagedByIgmErrorInstanceActionDetails(
           od as api.InstanceManagedByIgmErrorInstanceActionDetails);
     });
@@ -40024,8 +40561,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceManagedByIgmErrorManagedInstanceError();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstanceManagedByIgmErrorManagedInstanceError.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceManagedByIgmErrorManagedInstanceError(
           od as api.InstanceManagedByIgmErrorManagedInstanceError);
     });
@@ -40034,7 +40572,9 @@
   unittest.group('obj-schema-InstanceMoveRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceMoveRequest();
-      var od = api.InstanceMoveRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceMoveRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceMoveRequest(od as api.InstanceMoveRequest);
     });
   });
@@ -40042,7 +40582,9 @@
   unittest.group('obj-schema-InstanceProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceProperties();
-      var od = api.InstanceProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceProperties(od as api.InstanceProperties);
     });
   });
@@ -40050,7 +40592,9 @@
   unittest.group('obj-schema-InstanceReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceReference();
-      var od = api.InstanceReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceReference(od as api.InstanceReference);
     });
   });
@@ -40058,7 +40602,9 @@
   unittest.group('obj-schema-InstanceTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceTemplate();
-      var od = api.InstanceTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceTemplate(od as api.InstanceTemplate);
     });
   });
@@ -40066,7 +40612,9 @@
   unittest.group('obj-schema-InstanceTemplateListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceTemplateListWarningData();
-      var od = api.InstanceTemplateListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceTemplateListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceTemplateListWarningData(
           od as api.InstanceTemplateListWarningData);
     });
@@ -40075,7 +40623,9 @@
   unittest.group('obj-schema-InstanceTemplateListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceTemplateListWarning();
-      var od = api.InstanceTemplateListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceTemplateListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceTemplateListWarning(od as api.InstanceTemplateListWarning);
     });
   });
@@ -40083,7 +40633,9 @@
   unittest.group('obj-schema-InstanceTemplateList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceTemplateList();
-      var od = api.InstanceTemplateList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceTemplateList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceTemplateList(od as api.InstanceTemplateList);
     });
   });
@@ -40091,7 +40643,9 @@
   unittest.group('obj-schema-InstanceWithNamedPorts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceWithNamedPorts();
-      var od = api.InstanceWithNamedPorts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceWithNamedPorts.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceWithNamedPorts(od as api.InstanceWithNamedPorts);
     });
   });
@@ -40099,7 +40653,9 @@
   unittest.group('obj-schema-InstancesAddResourcePoliciesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesAddResourcePoliciesRequest();
-      var od = api.InstancesAddResourcePoliciesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesAddResourcePoliciesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesAddResourcePoliciesRequest(
           od as api.InstancesAddResourcePoliciesRequest);
     });
@@ -40108,7 +40664,9 @@
   unittest.group('obj-schema-InstancesGetEffectiveFirewallsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesGetEffectiveFirewallsResponse();
-      var od = api.InstancesGetEffectiveFirewallsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesGetEffectiveFirewallsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesGetEffectiveFirewallsResponse(
           od as api.InstancesGetEffectiveFirewallsResponse);
     });
@@ -40120,8 +40678,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildInstancesGetEffectiveFirewallsResponseEffectiveFirewallPolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InstancesGetEffectiveFirewallsResponseEffectiveFirewallPolicy
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstancesGetEffectiveFirewallsResponseEffectiveFirewallPolicy(od
           as api.InstancesGetEffectiveFirewallsResponseEffectiveFirewallPolicy);
     });
@@ -40130,7 +40689,9 @@
   unittest.group('obj-schema-InstancesRemoveResourcePoliciesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesRemoveResourcePoliciesRequest();
-      var od = api.InstancesRemoveResourcePoliciesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesRemoveResourcePoliciesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesRemoveResourcePoliciesRequest(
           od as api.InstancesRemoveResourcePoliciesRequest);
     });
@@ -40139,7 +40700,9 @@
   unittest.group('obj-schema-InstancesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesScopedListWarningData();
-      var od = api.InstancesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesScopedListWarningData(
           od as api.InstancesScopedListWarningData);
     });
@@ -40148,7 +40711,9 @@
   unittest.group('obj-schema-InstancesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesScopedListWarning();
-      var od = api.InstancesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesScopedListWarning(od as api.InstancesScopedListWarning);
     });
   });
@@ -40156,7 +40721,9 @@
   unittest.group('obj-schema-InstancesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesScopedList();
-      var od = api.InstancesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesScopedList(od as api.InstancesScopedList);
     });
   });
@@ -40164,7 +40731,9 @@
   unittest.group('obj-schema-InstancesSetLabelsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesSetLabelsRequest();
-      var od = api.InstancesSetLabelsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesSetLabelsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesSetLabelsRequest(od as api.InstancesSetLabelsRequest);
     });
   });
@@ -40172,7 +40741,9 @@
   unittest.group('obj-schema-InstancesSetMachineResourcesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesSetMachineResourcesRequest();
-      var od = api.InstancesSetMachineResourcesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesSetMachineResourcesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesSetMachineResourcesRequest(
           od as api.InstancesSetMachineResourcesRequest);
     });
@@ -40181,7 +40752,9 @@
   unittest.group('obj-schema-InstancesSetMachineTypeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesSetMachineTypeRequest();
-      var od = api.InstancesSetMachineTypeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesSetMachineTypeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesSetMachineTypeRequest(
           od as api.InstancesSetMachineTypeRequest);
     });
@@ -40190,7 +40763,9 @@
   unittest.group('obj-schema-InstancesSetMinCpuPlatformRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesSetMinCpuPlatformRequest();
-      var od = api.InstancesSetMinCpuPlatformRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesSetMinCpuPlatformRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesSetMinCpuPlatformRequest(
           od as api.InstancesSetMinCpuPlatformRequest);
     });
@@ -40199,7 +40774,9 @@
   unittest.group('obj-schema-InstancesSetServiceAccountRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesSetServiceAccountRequest();
-      var od = api.InstancesSetServiceAccountRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesSetServiceAccountRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesSetServiceAccountRequest(
           od as api.InstancesSetServiceAccountRequest);
     });
@@ -40208,7 +40785,9 @@
   unittest.group('obj-schema-InstancesStartWithEncryptionKeyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesStartWithEncryptionKeyRequest();
-      var od = api.InstancesStartWithEncryptionKeyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesStartWithEncryptionKeyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesStartWithEncryptionKeyRequest(
           od as api.InstancesStartWithEncryptionKeyRequest);
     });
@@ -40217,7 +40796,9 @@
   unittest.group('obj-schema-Int64RangeMatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInt64RangeMatch();
-      var od = api.Int64RangeMatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Int64RangeMatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInt64RangeMatch(od as api.Int64RangeMatch);
     });
   });
@@ -40225,7 +40806,9 @@
   unittest.group('obj-schema-Interconnect', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnect();
-      var od = api.Interconnect.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Interconnect.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnect(od as api.Interconnect);
     });
   });
@@ -40233,7 +40816,9 @@
   unittest.group('obj-schema-InterconnectAttachment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachment();
-      var od = api.InterconnectAttachment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachment(od as api.InterconnectAttachment);
     });
   });
@@ -40242,8 +40827,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentAggregatedListWarningData();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InterconnectAttachmentAggregatedListWarningData.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentAggregatedListWarningData(
           od as api.InterconnectAttachmentAggregatedListWarningData);
     });
@@ -40252,8 +40838,9 @@
   unittest.group('obj-schema-InterconnectAttachmentAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentAggregatedListWarning();
-      var od =
-          api.InterconnectAttachmentAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachmentAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentAggregatedListWarning(
           od as api.InterconnectAttachmentAggregatedListWarning);
     });
@@ -40262,7 +40849,9 @@
   unittest.group('obj-schema-InterconnectAttachmentAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentAggregatedList();
-      var od = api.InterconnectAttachmentAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachmentAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentAggregatedList(
           od as api.InterconnectAttachmentAggregatedList);
     });
@@ -40271,7 +40860,9 @@
   unittest.group('obj-schema-InterconnectAttachmentListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentListWarningData();
-      var od = api.InterconnectAttachmentListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachmentListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentListWarningData(
           od as api.InterconnectAttachmentListWarningData);
     });
@@ -40280,7 +40871,9 @@
   unittest.group('obj-schema-InterconnectAttachmentListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentListWarning();
-      var od = api.InterconnectAttachmentListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachmentListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentListWarning(
           od as api.InterconnectAttachmentListWarning);
     });
@@ -40289,7 +40882,9 @@
   unittest.group('obj-schema-InterconnectAttachmentList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentList();
-      var od = api.InterconnectAttachmentList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachmentList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentList(od as api.InterconnectAttachmentList);
     });
   });
@@ -40297,7 +40892,9 @@
   unittest.group('obj-schema-InterconnectAttachmentPartnerMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentPartnerMetadata();
-      var od = api.InterconnectAttachmentPartnerMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachmentPartnerMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentPartnerMetadata(
           od as api.InterconnectAttachmentPartnerMetadata);
     });
@@ -40306,7 +40903,9 @@
   unittest.group('obj-schema-InterconnectAttachmentPrivateInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentPrivateInfo();
-      var od = api.InterconnectAttachmentPrivateInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachmentPrivateInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentPrivateInfo(
           od as api.InterconnectAttachmentPrivateInfo);
     });
@@ -40315,8 +40914,9 @@
   unittest.group('obj-schema-InterconnectAttachmentsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentsScopedListWarningData();
-      var od =
-          api.InterconnectAttachmentsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachmentsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentsScopedListWarningData(
           od as api.InterconnectAttachmentsScopedListWarningData);
     });
@@ -40325,8 +40925,9 @@
   unittest.group('obj-schema-InterconnectAttachmentsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentsScopedListWarning();
-      var od =
-          api.InterconnectAttachmentsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachmentsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentsScopedListWarning(
           od as api.InterconnectAttachmentsScopedListWarning);
     });
@@ -40335,7 +40936,9 @@
   unittest.group('obj-schema-InterconnectAttachmentsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectAttachmentsScopedList();
-      var od = api.InterconnectAttachmentsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectAttachmentsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectAttachmentsScopedList(
           od as api.InterconnectAttachmentsScopedList);
     });
@@ -40344,7 +40947,9 @@
   unittest.group('obj-schema-InterconnectCircuitInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectCircuitInfo();
-      var od = api.InterconnectCircuitInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectCircuitInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectCircuitInfo(od as api.InterconnectCircuitInfo);
     });
   });
@@ -40352,7 +40957,9 @@
   unittest.group('obj-schema-InterconnectDiagnostics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectDiagnostics();
-      var od = api.InterconnectDiagnostics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectDiagnostics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectDiagnostics(od as api.InterconnectDiagnostics);
     });
   });
@@ -40360,7 +40967,9 @@
   unittest.group('obj-schema-InterconnectDiagnosticsARPEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectDiagnosticsARPEntry();
-      var od = api.InterconnectDiagnosticsARPEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectDiagnosticsARPEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectDiagnosticsARPEntry(
           od as api.InterconnectDiagnosticsARPEntry);
     });
@@ -40369,7 +40978,9 @@
   unittest.group('obj-schema-InterconnectDiagnosticsLinkLACPStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectDiagnosticsLinkLACPStatus();
-      var od = api.InterconnectDiagnosticsLinkLACPStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectDiagnosticsLinkLACPStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectDiagnosticsLinkLACPStatus(
           od as api.InterconnectDiagnosticsLinkLACPStatus);
     });
@@ -40378,7 +40989,9 @@
   unittest.group('obj-schema-InterconnectDiagnosticsLinkOpticalPower', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectDiagnosticsLinkOpticalPower();
-      var od = api.InterconnectDiagnosticsLinkOpticalPower.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectDiagnosticsLinkOpticalPower.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectDiagnosticsLinkOpticalPower(
           od as api.InterconnectDiagnosticsLinkOpticalPower);
     });
@@ -40387,7 +41000,9 @@
   unittest.group('obj-schema-InterconnectDiagnosticsLinkStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectDiagnosticsLinkStatus();
-      var od = api.InterconnectDiagnosticsLinkStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectDiagnosticsLinkStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectDiagnosticsLinkStatus(
           od as api.InterconnectDiagnosticsLinkStatus);
     });
@@ -40396,7 +41011,9 @@
   unittest.group('obj-schema-InterconnectListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectListWarningData();
-      var od = api.InterconnectListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectListWarningData(od as api.InterconnectListWarningData);
     });
   });
@@ -40404,7 +41021,9 @@
   unittest.group('obj-schema-InterconnectListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectListWarning();
-      var od = api.InterconnectListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectListWarning(od as api.InterconnectListWarning);
     });
   });
@@ -40412,7 +41031,9 @@
   unittest.group('obj-schema-InterconnectList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectList();
-      var od = api.InterconnectList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectList(od as api.InterconnectList);
     });
   });
@@ -40420,7 +41041,9 @@
   unittest.group('obj-schema-InterconnectLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectLocation();
-      var od = api.InterconnectLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectLocation(od as api.InterconnectLocation);
     });
   });
@@ -40428,7 +41051,9 @@
   unittest.group('obj-schema-InterconnectLocationListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectLocationListWarningData();
-      var od = api.InterconnectLocationListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectLocationListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectLocationListWarningData(
           od as api.InterconnectLocationListWarningData);
     });
@@ -40437,7 +41062,9 @@
   unittest.group('obj-schema-InterconnectLocationListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectLocationListWarning();
-      var od = api.InterconnectLocationListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectLocationListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectLocationListWarning(
           od as api.InterconnectLocationListWarning);
     });
@@ -40446,7 +41073,9 @@
   unittest.group('obj-schema-InterconnectLocationList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectLocationList();
-      var od = api.InterconnectLocationList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectLocationList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectLocationList(od as api.InterconnectLocationList);
     });
   });
@@ -40454,7 +41083,9 @@
   unittest.group('obj-schema-InterconnectLocationRegionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectLocationRegionInfo();
-      var od = api.InterconnectLocationRegionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectLocationRegionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectLocationRegionInfo(
           od as api.InterconnectLocationRegionInfo);
     });
@@ -40463,7 +41094,9 @@
   unittest.group('obj-schema-InterconnectOutageNotification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectOutageNotification();
-      var od = api.InterconnectOutageNotification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectOutageNotification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectOutageNotification(
           od as api.InterconnectOutageNotification);
     });
@@ -40472,7 +41105,9 @@
   unittest.group('obj-schema-InterconnectsGetDiagnosticsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterconnectsGetDiagnosticsResponse();
-      var od = api.InterconnectsGetDiagnosticsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterconnectsGetDiagnosticsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterconnectsGetDiagnosticsResponse(
           od as api.InterconnectsGetDiagnosticsResponse);
     });
@@ -40481,7 +41116,9 @@
   unittest.group('obj-schema-License', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicense();
-      var od = api.License.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.License.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLicense(od as api.License);
     });
   });
@@ -40489,7 +41126,9 @@
   unittest.group('obj-schema-LicenseCode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicenseCode();
-      var od = api.LicenseCode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LicenseCode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLicenseCode(od as api.LicenseCode);
     });
   });
@@ -40497,7 +41136,9 @@
   unittest.group('obj-schema-LicenseCodeLicenseAlias', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicenseCodeLicenseAlias();
-      var od = api.LicenseCodeLicenseAlias.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LicenseCodeLicenseAlias.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLicenseCodeLicenseAlias(od as api.LicenseCodeLicenseAlias);
     });
   });
@@ -40505,7 +41146,9 @@
   unittest.group('obj-schema-LicenseResourceCommitment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicenseResourceCommitment();
-      var od = api.LicenseResourceCommitment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LicenseResourceCommitment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLicenseResourceCommitment(od as api.LicenseResourceCommitment);
     });
   });
@@ -40513,7 +41156,9 @@
   unittest.group('obj-schema-LicenseResourceRequirements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicenseResourceRequirements();
-      var od = api.LicenseResourceRequirements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LicenseResourceRequirements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLicenseResourceRequirements(od as api.LicenseResourceRequirements);
     });
   });
@@ -40521,7 +41166,9 @@
   unittest.group('obj-schema-LicensesListResponseWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicensesListResponseWarningData();
-      var od = api.LicensesListResponseWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LicensesListResponseWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLicensesListResponseWarningData(
           od as api.LicensesListResponseWarningData);
     });
@@ -40530,7 +41177,9 @@
   unittest.group('obj-schema-LicensesListResponseWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicensesListResponseWarning();
-      var od = api.LicensesListResponseWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LicensesListResponseWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLicensesListResponseWarning(od as api.LicensesListResponseWarning);
     });
   });
@@ -40538,7 +41187,9 @@
   unittest.group('obj-schema-LicensesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicensesListResponse();
-      var od = api.LicensesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LicensesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLicensesListResponse(od as api.LicensesListResponse);
     });
   });
@@ -40546,7 +41197,9 @@
   unittest.group('obj-schema-LocalDisk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalDisk();
-      var od = api.LocalDisk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LocalDisk.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocalDisk(od as api.LocalDisk);
     });
   });
@@ -40554,7 +41207,9 @@
   unittest.group('obj-schema-LocationPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationPolicy();
-      var od = api.LocationPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationPolicy(od as api.LocationPolicy);
     });
   });
@@ -40562,7 +41217,9 @@
   unittest.group('obj-schema-LocationPolicyLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationPolicyLocation();
-      var od = api.LocationPolicyLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationPolicyLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationPolicyLocation(od as api.LocationPolicyLocation);
     });
   });
@@ -40570,7 +41227,9 @@
   unittest.group('obj-schema-LogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogConfig();
-      var od = api.LogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LogConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogConfig(od as api.LogConfig);
     });
   });
@@ -40578,7 +41237,9 @@
   unittest.group('obj-schema-LogConfigCloudAuditOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogConfigCloudAuditOptions();
-      var od = api.LogConfigCloudAuditOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogConfigCloudAuditOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogConfigCloudAuditOptions(od as api.LogConfigCloudAuditOptions);
     });
   });
@@ -40586,7 +41247,9 @@
   unittest.group('obj-schema-LogConfigCounterOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogConfigCounterOptions();
-      var od = api.LogConfigCounterOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogConfigCounterOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogConfigCounterOptions(od as api.LogConfigCounterOptions);
     });
   });
@@ -40594,7 +41257,9 @@
   unittest.group('obj-schema-LogConfigCounterOptionsCustomField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogConfigCounterOptionsCustomField();
-      var od = api.LogConfigCounterOptionsCustomField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogConfigCounterOptionsCustomField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogConfigCounterOptionsCustomField(
           od as api.LogConfigCounterOptionsCustomField);
     });
@@ -40603,7 +41268,9 @@
   unittest.group('obj-schema-LogConfigDataAccessOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogConfigDataAccessOptions();
-      var od = api.LogConfigDataAccessOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogConfigDataAccessOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogConfigDataAccessOptions(od as api.LogConfigDataAccessOptions);
     });
   });
@@ -40611,7 +41278,9 @@
   unittest.group('obj-schema-MachineTypeAccelerators', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypeAccelerators();
-      var od = api.MachineTypeAccelerators.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypeAccelerators.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypeAccelerators(od as api.MachineTypeAccelerators);
     });
   });
@@ -40619,7 +41288,9 @@
   unittest.group('obj-schema-MachineTypeScratchDisks', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypeScratchDisks();
-      var od = api.MachineTypeScratchDisks.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypeScratchDisks.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypeScratchDisks(od as api.MachineTypeScratchDisks);
     });
   });
@@ -40627,7 +41298,9 @@
   unittest.group('obj-schema-MachineType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineType();
-      var od = api.MachineType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineType(od as api.MachineType);
     });
   });
@@ -40635,7 +41308,9 @@
   unittest.group('obj-schema-MachineTypeAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypeAggregatedListWarningData();
-      var od = api.MachineTypeAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypeAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypeAggregatedListWarningData(
           od as api.MachineTypeAggregatedListWarningData);
     });
@@ -40644,7 +41319,9 @@
   unittest.group('obj-schema-MachineTypeAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypeAggregatedListWarning();
-      var od = api.MachineTypeAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypeAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypeAggregatedListWarning(
           od as api.MachineTypeAggregatedListWarning);
     });
@@ -40653,7 +41330,9 @@
   unittest.group('obj-schema-MachineTypeAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypeAggregatedList();
-      var od = api.MachineTypeAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypeAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypeAggregatedList(od as api.MachineTypeAggregatedList);
     });
   });
@@ -40661,7 +41340,9 @@
   unittest.group('obj-schema-MachineTypeListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypeListWarningData();
-      var od = api.MachineTypeListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypeListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypeListWarningData(od as api.MachineTypeListWarningData);
     });
   });
@@ -40669,7 +41350,9 @@
   unittest.group('obj-schema-MachineTypeListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypeListWarning();
-      var od = api.MachineTypeListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypeListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypeListWarning(od as api.MachineTypeListWarning);
     });
   });
@@ -40677,7 +41360,9 @@
   unittest.group('obj-schema-MachineTypeList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypeList();
-      var od = api.MachineTypeList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypeList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypeList(od as api.MachineTypeList);
     });
   });
@@ -40685,7 +41370,9 @@
   unittest.group('obj-schema-MachineTypesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypesScopedListWarningData();
-      var od = api.MachineTypesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypesScopedListWarningData(
           od as api.MachineTypesScopedListWarningData);
     });
@@ -40694,7 +41381,9 @@
   unittest.group('obj-schema-MachineTypesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypesScopedListWarning();
-      var od = api.MachineTypesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypesScopedListWarning(
           od as api.MachineTypesScopedListWarning);
     });
@@ -40703,7 +41392,9 @@
   unittest.group('obj-schema-MachineTypesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMachineTypesScopedList();
-      var od = api.MachineTypesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MachineTypesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMachineTypesScopedList(od as api.MachineTypesScopedList);
     });
   });
@@ -40711,7 +41402,9 @@
   unittest.group('obj-schema-ManagedInstance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedInstance();
-      var od = api.ManagedInstance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedInstance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedInstance(od as api.ManagedInstance);
     });
   });
@@ -40719,7 +41412,9 @@
   unittest.group('obj-schema-ManagedInstanceInstanceHealth', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedInstanceInstanceHealth();
-      var od = api.ManagedInstanceInstanceHealth.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedInstanceInstanceHealth.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedInstanceInstanceHealth(
           od as api.ManagedInstanceInstanceHealth);
     });
@@ -40728,7 +41423,9 @@
   unittest.group('obj-schema-ManagedInstanceLastAttemptErrorsErrors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedInstanceLastAttemptErrorsErrors();
-      var od = api.ManagedInstanceLastAttemptErrorsErrors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedInstanceLastAttemptErrorsErrors.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedInstanceLastAttemptErrorsErrors(
           od as api.ManagedInstanceLastAttemptErrorsErrors);
     });
@@ -40737,7 +41434,9 @@
   unittest.group('obj-schema-ManagedInstanceLastAttemptErrors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedInstanceLastAttemptErrors();
-      var od = api.ManagedInstanceLastAttemptErrors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedInstanceLastAttemptErrors.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedInstanceLastAttemptErrors(
           od as api.ManagedInstanceLastAttemptErrors);
     });
@@ -40746,7 +41445,9 @@
   unittest.group('obj-schema-ManagedInstanceLastAttempt', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedInstanceLastAttempt();
-      var od = api.ManagedInstanceLastAttempt.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedInstanceLastAttempt.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedInstanceLastAttempt(od as api.ManagedInstanceLastAttempt);
     });
   });
@@ -40754,7 +41455,9 @@
   unittest.group('obj-schema-ManagedInstanceVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedInstanceVersion();
-      var od = api.ManagedInstanceVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedInstanceVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedInstanceVersion(od as api.ManagedInstanceVersion);
     });
   });
@@ -40762,7 +41465,9 @@
   unittest.group('obj-schema-MetadataItems', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadataItems();
-      var od = api.MetadataItems.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetadataItems.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetadataItems(od as api.MetadataItems);
     });
   });
@@ -40770,7 +41475,9 @@
   unittest.group('obj-schema-Metadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadata();
-      var od = api.Metadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metadata.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetadata(od as api.Metadata);
     });
   });
@@ -40778,7 +41485,9 @@
   unittest.group('obj-schema-MetadataFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadataFilter();
-      var od = api.MetadataFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetadataFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetadataFilter(od as api.MetadataFilter);
     });
   });
@@ -40786,7 +41495,9 @@
   unittest.group('obj-schema-MetadataFilterLabelMatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadataFilterLabelMatch();
-      var od = api.MetadataFilterLabelMatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetadataFilterLabelMatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetadataFilterLabelMatch(od as api.MetadataFilterLabelMatch);
     });
   });
@@ -40794,7 +41505,9 @@
   unittest.group('obj-schema-NamedPort', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamedPort();
-      var od = api.NamedPort.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NamedPort.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNamedPort(od as api.NamedPort);
     });
   });
@@ -40802,7 +41515,9 @@
   unittest.group('obj-schema-Network', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetwork();
-      var od = api.Network.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Network.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNetwork(od as api.Network);
     });
   });
@@ -40810,7 +41525,9 @@
   unittest.group('obj-schema-NetworkEndpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpoint();
-      var od = api.NetworkEndpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpoint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpoint(od as api.NetworkEndpoint);
     });
   });
@@ -40818,7 +41535,9 @@
   unittest.group('obj-schema-NetworkEndpointGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroup();
-      var od = api.NetworkEndpointGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroup(od as api.NetworkEndpointGroup);
     });
   });
@@ -40827,8 +41546,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupAggregatedListWarningData();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.NetworkEndpointGroupAggregatedListWarningData.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupAggregatedListWarningData(
           od as api.NetworkEndpointGroupAggregatedListWarningData);
     });
@@ -40837,8 +41557,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupAggregatedListWarning();
-      var od =
-          api.NetworkEndpointGroupAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupAggregatedListWarning(
           od as api.NetworkEndpointGroupAggregatedListWarning);
     });
@@ -40847,7 +41568,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupAggregatedList();
-      var od = api.NetworkEndpointGroupAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupAggregatedList(
           od as api.NetworkEndpointGroupAggregatedList);
     });
@@ -40856,7 +41579,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupAppEngine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupAppEngine();
-      var od = api.NetworkEndpointGroupAppEngine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupAppEngine.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupAppEngine(
           od as api.NetworkEndpointGroupAppEngine);
     });
@@ -40865,7 +41590,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupCloudFunction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupCloudFunction();
-      var od = api.NetworkEndpointGroupCloudFunction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupCloudFunction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupCloudFunction(
           od as api.NetworkEndpointGroupCloudFunction);
     });
@@ -40874,7 +41601,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupCloudRun', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupCloudRun();
-      var od = api.NetworkEndpointGroupCloudRun.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupCloudRun.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupCloudRun(od as api.NetworkEndpointGroupCloudRun);
     });
   });
@@ -40882,7 +41611,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupListWarningData();
-      var od = api.NetworkEndpointGroupListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupListWarningData(
           od as api.NetworkEndpointGroupListWarningData);
     });
@@ -40891,7 +41622,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupListWarning();
-      var od = api.NetworkEndpointGroupListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupListWarning(
           od as api.NetworkEndpointGroupListWarning);
     });
@@ -40900,7 +41633,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupList();
-      var od = api.NetworkEndpointGroupList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupList(od as api.NetworkEndpointGroupList);
     });
   });
@@ -40908,8 +41643,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupsAttachEndpointsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupsAttachEndpointsRequest();
-      var od =
-          api.NetworkEndpointGroupsAttachEndpointsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupsAttachEndpointsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupsAttachEndpointsRequest(
           od as api.NetworkEndpointGroupsAttachEndpointsRequest);
     });
@@ -40918,8 +41654,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupsDetachEndpointsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupsDetachEndpointsRequest();
-      var od =
-          api.NetworkEndpointGroupsDetachEndpointsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupsDetachEndpointsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupsDetachEndpointsRequest(
           od as api.NetworkEndpointGroupsDetachEndpointsRequest);
     });
@@ -40928,8 +41665,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupsListEndpointsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupsListEndpointsRequest();
-      var od =
-          api.NetworkEndpointGroupsListEndpointsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupsListEndpointsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupsListEndpointsRequest(
           od as api.NetworkEndpointGroupsListEndpointsRequest);
     });
@@ -40939,9 +41677,10 @@
       'obj-schema-NetworkEndpointGroupsListNetworkEndpointsWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupsListNetworkEndpointsWarningData();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.NetworkEndpointGroupsListNetworkEndpointsWarningData.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupsListNetworkEndpointsWarningData(
           od as api.NetworkEndpointGroupsListNetworkEndpointsWarningData);
     });
@@ -40951,8 +41690,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupsListNetworkEndpointsWarning();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.NetworkEndpointGroupsListNetworkEndpointsWarning.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupsListNetworkEndpointsWarning(
           od as api.NetworkEndpointGroupsListNetworkEndpointsWarning);
     });
@@ -40961,8 +41701,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupsListNetworkEndpoints', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupsListNetworkEndpoints();
-      var od =
-          api.NetworkEndpointGroupsListNetworkEndpoints.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupsListNetworkEndpoints.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupsListNetworkEndpoints(
           od as api.NetworkEndpointGroupsListNetworkEndpoints);
     });
@@ -40971,8 +41712,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupsScopedListWarningData();
-      var od =
-          api.NetworkEndpointGroupsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupsScopedListWarningData(
           od as api.NetworkEndpointGroupsScopedListWarningData);
     });
@@ -40981,7 +41723,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupsScopedListWarning();
-      var od = api.NetworkEndpointGroupsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupsScopedListWarning(
           od as api.NetworkEndpointGroupsScopedListWarning);
     });
@@ -40990,7 +41734,9 @@
   unittest.group('obj-schema-NetworkEndpointGroupsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointGroupsScopedList();
-      var od = api.NetworkEndpointGroupsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointGroupsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointGroupsScopedList(
           od as api.NetworkEndpointGroupsScopedList);
     });
@@ -40999,7 +41745,9 @@
   unittest.group('obj-schema-NetworkEndpointWithHealthStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpointWithHealthStatus();
-      var od = api.NetworkEndpointWithHealthStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpointWithHealthStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpointWithHealthStatus(
           od as api.NetworkEndpointWithHealthStatus);
     });
@@ -41008,7 +41756,9 @@
   unittest.group('obj-schema-NetworkInterface', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkInterface();
-      var od = api.NetworkInterface.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkInterface.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkInterface(od as api.NetworkInterface);
     });
   });
@@ -41016,7 +41766,9 @@
   unittest.group('obj-schema-NetworkListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkListWarningData();
-      var od = api.NetworkListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkListWarningData(od as api.NetworkListWarningData);
     });
   });
@@ -41024,7 +41776,9 @@
   unittest.group('obj-schema-NetworkListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkListWarning();
-      var od = api.NetworkListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkListWarning(od as api.NetworkListWarning);
     });
   });
@@ -41032,7 +41786,9 @@
   unittest.group('obj-schema-NetworkList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkList();
-      var od = api.NetworkList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkList(od as api.NetworkList);
     });
   });
@@ -41040,7 +41796,9 @@
   unittest.group('obj-schema-NetworkPeering', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkPeering();
-      var od = api.NetworkPeering.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkPeering.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkPeering(od as api.NetworkPeering);
     });
   });
@@ -41048,7 +41806,9 @@
   unittest.group('obj-schema-NetworkRoutingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkRoutingConfig();
-      var od = api.NetworkRoutingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkRoutingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkRoutingConfig(od as api.NetworkRoutingConfig);
     });
   });
@@ -41056,7 +41816,9 @@
   unittest.group('obj-schema-NetworksAddPeeringRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworksAddPeeringRequest();
-      var od = api.NetworksAddPeeringRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworksAddPeeringRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworksAddPeeringRequest(od as api.NetworksAddPeeringRequest);
     });
   });
@@ -41064,7 +41826,9 @@
   unittest.group('obj-schema-NetworksGetEffectiveFirewallsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworksGetEffectiveFirewallsResponse();
-      var od = api.NetworksGetEffectiveFirewallsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworksGetEffectiveFirewallsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworksGetEffectiveFirewallsResponse(
           od as api.NetworksGetEffectiveFirewallsResponse);
     });
@@ -41076,8 +41840,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildNetworksGetEffectiveFirewallsResponseEffectiveFirewallPolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.NetworksGetEffectiveFirewallsResponseEffectiveFirewallPolicy
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNetworksGetEffectiveFirewallsResponseEffectiveFirewallPolicy(od
           as api.NetworksGetEffectiveFirewallsResponseEffectiveFirewallPolicy);
     });
@@ -41086,7 +41851,9 @@
   unittest.group('obj-schema-NetworksRemovePeeringRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworksRemovePeeringRequest();
-      var od = api.NetworksRemovePeeringRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworksRemovePeeringRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworksRemovePeeringRequest(od as api.NetworksRemovePeeringRequest);
     });
   });
@@ -41094,7 +41861,9 @@
   unittest.group('obj-schema-NetworksUpdatePeeringRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworksUpdatePeeringRequest();
-      var od = api.NetworksUpdatePeeringRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworksUpdatePeeringRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworksUpdatePeeringRequest(od as api.NetworksUpdatePeeringRequest);
     });
   });
@@ -41102,7 +41871,9 @@
   unittest.group('obj-schema-NodeGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroup();
-      var od = api.NodeGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NodeGroup.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroup(od as api.NodeGroup);
     });
   });
@@ -41110,7 +41881,9 @@
   unittest.group('obj-schema-NodeGroupAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupAggregatedListWarningData();
-      var od = api.NodeGroupAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupAggregatedListWarningData(
           od as api.NodeGroupAggregatedListWarningData);
     });
@@ -41119,7 +41892,9 @@
   unittest.group('obj-schema-NodeGroupAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupAggregatedListWarning();
-      var od = api.NodeGroupAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupAggregatedListWarning(
           od as api.NodeGroupAggregatedListWarning);
     });
@@ -41128,7 +41903,9 @@
   unittest.group('obj-schema-NodeGroupAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupAggregatedList();
-      var od = api.NodeGroupAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupAggregatedList(od as api.NodeGroupAggregatedList);
     });
   });
@@ -41136,7 +41913,9 @@
   unittest.group('obj-schema-NodeGroupAutoscalingPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupAutoscalingPolicy();
-      var od = api.NodeGroupAutoscalingPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupAutoscalingPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupAutoscalingPolicy(od as api.NodeGroupAutoscalingPolicy);
     });
   });
@@ -41144,7 +41923,9 @@
   unittest.group('obj-schema-NodeGroupListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupListWarningData();
-      var od = api.NodeGroupListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupListWarningData(od as api.NodeGroupListWarningData);
     });
   });
@@ -41152,7 +41933,9 @@
   unittest.group('obj-schema-NodeGroupListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupListWarning();
-      var od = api.NodeGroupListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupListWarning(od as api.NodeGroupListWarning);
     });
   });
@@ -41160,7 +41943,9 @@
   unittest.group('obj-schema-NodeGroupList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupList();
-      var od = api.NodeGroupList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupList(od as api.NodeGroupList);
     });
   });
@@ -41168,7 +41953,9 @@
   unittest.group('obj-schema-NodeGroupMaintenanceWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupMaintenanceWindow();
-      var od = api.NodeGroupMaintenanceWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupMaintenanceWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupMaintenanceWindow(od as api.NodeGroupMaintenanceWindow);
     });
   });
@@ -41176,7 +41963,9 @@
   unittest.group('obj-schema-NodeGroupNode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupNode();
-      var od = api.NodeGroupNode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupNode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupNode(od as api.NodeGroupNode);
     });
   });
@@ -41184,7 +41973,9 @@
   unittest.group('obj-schema-NodeGroupsAddNodesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupsAddNodesRequest();
-      var od = api.NodeGroupsAddNodesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupsAddNodesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupsAddNodesRequest(od as api.NodeGroupsAddNodesRequest);
     });
   });
@@ -41192,7 +41983,9 @@
   unittest.group('obj-schema-NodeGroupsDeleteNodesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupsDeleteNodesRequest();
-      var od = api.NodeGroupsDeleteNodesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupsDeleteNodesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupsDeleteNodesRequest(od as api.NodeGroupsDeleteNodesRequest);
     });
   });
@@ -41200,7 +41993,9 @@
   unittest.group('obj-schema-NodeGroupsListNodesWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupsListNodesWarningData();
-      var od = api.NodeGroupsListNodesWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupsListNodesWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupsListNodesWarningData(
           od as api.NodeGroupsListNodesWarningData);
     });
@@ -41209,7 +42004,9 @@
   unittest.group('obj-schema-NodeGroupsListNodesWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupsListNodesWarning();
-      var od = api.NodeGroupsListNodesWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupsListNodesWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupsListNodesWarning(od as api.NodeGroupsListNodesWarning);
     });
   });
@@ -41217,7 +42014,9 @@
   unittest.group('obj-schema-NodeGroupsListNodes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupsListNodes();
-      var od = api.NodeGroupsListNodes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupsListNodes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupsListNodes(od as api.NodeGroupsListNodes);
     });
   });
@@ -41225,7 +42024,9 @@
   unittest.group('obj-schema-NodeGroupsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupsScopedListWarningData();
-      var od = api.NodeGroupsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupsScopedListWarningData(
           od as api.NodeGroupsScopedListWarningData);
     });
@@ -41234,7 +42035,9 @@
   unittest.group('obj-schema-NodeGroupsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupsScopedListWarning();
-      var od = api.NodeGroupsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupsScopedListWarning(od as api.NodeGroupsScopedListWarning);
     });
   });
@@ -41242,7 +42045,9 @@
   unittest.group('obj-schema-NodeGroupsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupsScopedList();
-      var od = api.NodeGroupsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupsScopedList(od as api.NodeGroupsScopedList);
     });
   });
@@ -41250,7 +42055,9 @@
   unittest.group('obj-schema-NodeGroupsSetNodeTemplateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupsSetNodeTemplateRequest();
-      var od = api.NodeGroupsSetNodeTemplateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupsSetNodeTemplateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupsSetNodeTemplateRequest(
           od as api.NodeGroupsSetNodeTemplateRequest);
     });
@@ -41259,7 +42066,9 @@
   unittest.group('obj-schema-NodeTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplate();
-      var od = api.NodeTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplate(od as api.NodeTemplate);
     });
   });
@@ -41267,7 +42076,9 @@
   unittest.group('obj-schema-NodeTemplateAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplateAggregatedListWarningData();
-      var od = api.NodeTemplateAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplateAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplateAggregatedListWarningData(
           od as api.NodeTemplateAggregatedListWarningData);
     });
@@ -41276,7 +42087,9 @@
   unittest.group('obj-schema-NodeTemplateAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplateAggregatedListWarning();
-      var od = api.NodeTemplateAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplateAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplateAggregatedListWarning(
           od as api.NodeTemplateAggregatedListWarning);
     });
@@ -41285,7 +42098,9 @@
   unittest.group('obj-schema-NodeTemplateAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplateAggregatedList();
-      var od = api.NodeTemplateAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplateAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplateAggregatedList(od as api.NodeTemplateAggregatedList);
     });
   });
@@ -41293,7 +42108,9 @@
   unittest.group('obj-schema-NodeTemplateListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplateListWarningData();
-      var od = api.NodeTemplateListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplateListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplateListWarningData(od as api.NodeTemplateListWarningData);
     });
   });
@@ -41301,7 +42118,9 @@
   unittest.group('obj-schema-NodeTemplateListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplateListWarning();
-      var od = api.NodeTemplateListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplateListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplateListWarning(od as api.NodeTemplateListWarning);
     });
   });
@@ -41309,7 +42128,9 @@
   unittest.group('obj-schema-NodeTemplateList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplateList();
-      var od = api.NodeTemplateList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplateList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplateList(od as api.NodeTemplateList);
     });
   });
@@ -41317,7 +42138,9 @@
   unittest.group('obj-schema-NodeTemplateNodeTypeFlexibility', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplateNodeTypeFlexibility();
-      var od = api.NodeTemplateNodeTypeFlexibility.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplateNodeTypeFlexibility.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplateNodeTypeFlexibility(
           od as api.NodeTemplateNodeTypeFlexibility);
     });
@@ -41326,7 +42149,9 @@
   unittest.group('obj-schema-NodeTemplatesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplatesScopedListWarningData();
-      var od = api.NodeTemplatesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplatesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplatesScopedListWarningData(
           od as api.NodeTemplatesScopedListWarningData);
     });
@@ -41335,7 +42160,9 @@
   unittest.group('obj-schema-NodeTemplatesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplatesScopedListWarning();
-      var od = api.NodeTemplatesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplatesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplatesScopedListWarning(
           od as api.NodeTemplatesScopedListWarning);
     });
@@ -41344,7 +42171,9 @@
   unittest.group('obj-schema-NodeTemplatesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTemplatesScopedList();
-      var od = api.NodeTemplatesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTemplatesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTemplatesScopedList(od as api.NodeTemplatesScopedList);
     });
   });
@@ -41352,7 +42181,9 @@
   unittest.group('obj-schema-NodeType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeType();
-      var od = api.NodeType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NodeType.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNodeType(od as api.NodeType);
     });
   });
@@ -41360,7 +42191,9 @@
   unittest.group('obj-schema-NodeTypeAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTypeAggregatedListWarningData();
-      var od = api.NodeTypeAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTypeAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTypeAggregatedListWarningData(
           od as api.NodeTypeAggregatedListWarningData);
     });
@@ -41369,7 +42202,9 @@
   unittest.group('obj-schema-NodeTypeAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTypeAggregatedListWarning();
-      var od = api.NodeTypeAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTypeAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTypeAggregatedListWarning(
           od as api.NodeTypeAggregatedListWarning);
     });
@@ -41378,7 +42213,9 @@
   unittest.group('obj-schema-NodeTypeAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTypeAggregatedList();
-      var od = api.NodeTypeAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTypeAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTypeAggregatedList(od as api.NodeTypeAggregatedList);
     });
   });
@@ -41386,7 +42223,9 @@
   unittest.group('obj-schema-NodeTypeListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTypeListWarningData();
-      var od = api.NodeTypeListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTypeListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTypeListWarningData(od as api.NodeTypeListWarningData);
     });
   });
@@ -41394,7 +42233,9 @@
   unittest.group('obj-schema-NodeTypeListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTypeListWarning();
-      var od = api.NodeTypeListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTypeListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTypeListWarning(od as api.NodeTypeListWarning);
     });
   });
@@ -41402,7 +42243,9 @@
   unittest.group('obj-schema-NodeTypeList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTypeList();
-      var od = api.NodeTypeList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTypeList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTypeList(od as api.NodeTypeList);
     });
   });
@@ -41410,7 +42253,9 @@
   unittest.group('obj-schema-NodeTypesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTypesScopedListWarningData();
-      var od = api.NodeTypesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTypesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTypesScopedListWarningData(
           od as api.NodeTypesScopedListWarningData);
     });
@@ -41419,7 +42264,9 @@
   unittest.group('obj-schema-NodeTypesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTypesScopedListWarning();
-      var od = api.NodeTypesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTypesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTypesScopedListWarning(od as api.NodeTypesScopedListWarning);
     });
   });
@@ -41427,7 +42274,9 @@
   unittest.group('obj-schema-NodeTypesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTypesScopedList();
-      var od = api.NodeTypesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeTypesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeTypesScopedList(od as api.NodeTypesScopedList);
     });
   });
@@ -41435,7 +42284,9 @@
   unittest.group('obj-schema-NotificationEndpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationEndpoint();
-      var od = api.NotificationEndpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationEndpoint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationEndpoint(od as api.NotificationEndpoint);
     });
   });
@@ -41443,7 +42294,9 @@
   unittest.group('obj-schema-NotificationEndpointGrpcSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationEndpointGrpcSettings();
-      var od = api.NotificationEndpointGrpcSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationEndpointGrpcSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationEndpointGrpcSettings(
           od as api.NotificationEndpointGrpcSettings);
     });
@@ -41452,7 +42305,9 @@
   unittest.group('obj-schema-NotificationEndpointListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationEndpointListWarningData();
-      var od = api.NotificationEndpointListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationEndpointListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationEndpointListWarningData(
           od as api.NotificationEndpointListWarningData);
     });
@@ -41461,7 +42316,9 @@
   unittest.group('obj-schema-NotificationEndpointListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationEndpointListWarning();
-      var od = api.NotificationEndpointListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationEndpointListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationEndpointListWarning(
           od as api.NotificationEndpointListWarning);
     });
@@ -41470,7 +42327,9 @@
   unittest.group('obj-schema-NotificationEndpointList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationEndpointList();
-      var od = api.NotificationEndpointList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationEndpointList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationEndpointList(od as api.NotificationEndpointList);
     });
   });
@@ -41478,7 +42337,9 @@
   unittest.group('obj-schema-OperationErrorErrors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationErrorErrors();
-      var od = api.OperationErrorErrors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationErrorErrors.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationErrorErrors(od as api.OperationErrorErrors);
     });
   });
@@ -41486,7 +42347,9 @@
   unittest.group('obj-schema-OperationError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationError();
-      var od = api.OperationError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationError(od as api.OperationError);
     });
   });
@@ -41494,7 +42357,9 @@
   unittest.group('obj-schema-OperationWarningsData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationWarningsData();
-      var od = api.OperationWarningsData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationWarningsData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationWarningsData(od as api.OperationWarningsData);
     });
   });
@@ -41502,7 +42367,9 @@
   unittest.group('obj-schema-OperationWarnings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationWarnings();
-      var od = api.OperationWarnings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationWarnings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationWarnings(od as api.OperationWarnings);
     });
   });
@@ -41510,7 +42377,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -41518,7 +42387,9 @@
   unittest.group('obj-schema-OperationAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationAggregatedListWarningData();
-      var od = api.OperationAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationAggregatedListWarningData(
           od as api.OperationAggregatedListWarningData);
     });
@@ -41527,7 +42398,9 @@
   unittest.group('obj-schema-OperationAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationAggregatedListWarning();
-      var od = api.OperationAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationAggregatedListWarning(
           od as api.OperationAggregatedListWarning);
     });
@@ -41536,7 +42409,9 @@
   unittest.group('obj-schema-OperationAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationAggregatedList();
-      var od = api.OperationAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationAggregatedList(od as api.OperationAggregatedList);
     });
   });
@@ -41544,7 +42419,9 @@
   unittest.group('obj-schema-OperationListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationListWarningData();
-      var od = api.OperationListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationListWarningData(od as api.OperationListWarningData);
     });
   });
@@ -41552,7 +42429,9 @@
   unittest.group('obj-schema-OperationListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationListWarning();
-      var od = api.OperationListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationListWarning(od as api.OperationListWarning);
     });
   });
@@ -41560,7 +42439,9 @@
   unittest.group('obj-schema-OperationList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationList();
-      var od = api.OperationList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationList(od as api.OperationList);
     });
   });
@@ -41568,7 +42449,9 @@
   unittest.group('obj-schema-OperationsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationsScopedListWarningData();
-      var od = api.OperationsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationsScopedListWarningData(
           od as api.OperationsScopedListWarningData);
     });
@@ -41577,7 +42460,9 @@
   unittest.group('obj-schema-OperationsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationsScopedListWarning();
-      var od = api.OperationsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationsScopedListWarning(od as api.OperationsScopedListWarning);
     });
   });
@@ -41585,7 +42470,9 @@
   unittest.group('obj-schema-OperationsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationsScopedList();
-      var od = api.OperationsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationsScopedList(od as api.OperationsScopedList);
     });
   });
@@ -41593,7 +42480,9 @@
   unittest.group('obj-schema-OutlierDetection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOutlierDetection();
-      var od = api.OutlierDetection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OutlierDetection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOutlierDetection(od as api.OutlierDetection);
     });
   });
@@ -41601,7 +42490,9 @@
   unittest.group('obj-schema-PacketMirroring', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroring();
-      var od = api.PacketMirroring.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroring.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroring(od as api.PacketMirroring);
     });
   });
@@ -41609,8 +42500,9 @@
   unittest.group('obj-schema-PacketMirroringAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringAggregatedListWarningData();
-      var od =
-          api.PacketMirroringAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringAggregatedListWarningData(
           od as api.PacketMirroringAggregatedListWarningData);
     });
@@ -41619,7 +42511,9 @@
   unittest.group('obj-schema-PacketMirroringAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringAggregatedListWarning();
-      var od = api.PacketMirroringAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringAggregatedListWarning(
           od as api.PacketMirroringAggregatedListWarning);
     });
@@ -41628,7 +42522,9 @@
   unittest.group('obj-schema-PacketMirroringAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringAggregatedList();
-      var od = api.PacketMirroringAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringAggregatedList(
           od as api.PacketMirroringAggregatedList);
     });
@@ -41637,7 +42533,9 @@
   unittest.group('obj-schema-PacketMirroringFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringFilter();
-      var od = api.PacketMirroringFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringFilter(od as api.PacketMirroringFilter);
     });
   });
@@ -41645,7 +42543,9 @@
   unittest.group('obj-schema-PacketMirroringForwardingRuleInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringForwardingRuleInfo();
-      var od = api.PacketMirroringForwardingRuleInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringForwardingRuleInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringForwardingRuleInfo(
           od as api.PacketMirroringForwardingRuleInfo);
     });
@@ -41654,7 +42554,9 @@
   unittest.group('obj-schema-PacketMirroringListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringListWarningData();
-      var od = api.PacketMirroringListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringListWarningData(
           od as api.PacketMirroringListWarningData);
     });
@@ -41663,7 +42565,9 @@
   unittest.group('obj-schema-PacketMirroringListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringListWarning();
-      var od = api.PacketMirroringListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringListWarning(od as api.PacketMirroringListWarning);
     });
   });
@@ -41671,7 +42575,9 @@
   unittest.group('obj-schema-PacketMirroringList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringList();
-      var od = api.PacketMirroringList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringList(od as api.PacketMirroringList);
     });
   });
@@ -41679,7 +42585,9 @@
   unittest.group('obj-schema-PacketMirroringMirroredResourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringMirroredResourceInfo();
-      var od = api.PacketMirroringMirroredResourceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringMirroredResourceInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringMirroredResourceInfo(
           od as api.PacketMirroringMirroredResourceInfo);
     });
@@ -41689,8 +42597,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringMirroredResourceInfoInstanceInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.PacketMirroringMirroredResourceInfoInstanceInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringMirroredResourceInfoInstanceInfo(
           od as api.PacketMirroringMirroredResourceInfoInstanceInfo);
     });
@@ -41700,8 +42609,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringMirroredResourceInfoSubnetInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.PacketMirroringMirroredResourceInfoSubnetInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringMirroredResourceInfoSubnetInfo(
           od as api.PacketMirroringMirroredResourceInfoSubnetInfo);
     });
@@ -41710,7 +42620,9 @@
   unittest.group('obj-schema-PacketMirroringNetworkInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringNetworkInfo();
-      var od = api.PacketMirroringNetworkInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringNetworkInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringNetworkInfo(od as api.PacketMirroringNetworkInfo);
     });
   });
@@ -41718,7 +42630,9 @@
   unittest.group('obj-schema-PacketMirroringsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringsScopedListWarningData();
-      var od = api.PacketMirroringsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringsScopedListWarningData(
           od as api.PacketMirroringsScopedListWarningData);
     });
@@ -41727,7 +42641,9 @@
   unittest.group('obj-schema-PacketMirroringsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringsScopedListWarning();
-      var od = api.PacketMirroringsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringsScopedListWarning(
           od as api.PacketMirroringsScopedListWarning);
     });
@@ -41736,7 +42652,9 @@
   unittest.group('obj-schema-PacketMirroringsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacketMirroringsScopedList();
-      var od = api.PacketMirroringsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PacketMirroringsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPacketMirroringsScopedList(od as api.PacketMirroringsScopedList);
     });
   });
@@ -41744,7 +42662,9 @@
   unittest.group('obj-schema-PathMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathMatcher();
-      var od = api.PathMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PathMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPathMatcher(od as api.PathMatcher);
     });
   });
@@ -41752,7 +42672,9 @@
   unittest.group('obj-schema-PathRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathRule();
-      var od = api.PathRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PathRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPathRule(od as api.PathRule);
     });
   });
@@ -41760,7 +42682,9 @@
   unittest.group('obj-schema-PerInstanceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerInstanceConfig();
-      var od = api.PerInstanceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerInstanceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerInstanceConfig(od as api.PerInstanceConfig);
     });
   });
@@ -41768,7 +42692,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -41776,7 +42702,9 @@
   unittest.group('obj-schema-PreconfiguredWafSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPreconfiguredWafSet();
-      var od = api.PreconfiguredWafSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PreconfiguredWafSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPreconfiguredWafSet(od as api.PreconfiguredWafSet);
     });
   });
@@ -41784,7 +42712,9 @@
   unittest.group('obj-schema-PreservedState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPreservedState();
-      var od = api.PreservedState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PreservedState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPreservedState(od as api.PreservedState);
     });
   });
@@ -41792,7 +42722,9 @@
   unittest.group('obj-schema-PreservedStatePreservedDisk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPreservedStatePreservedDisk();
-      var od = api.PreservedStatePreservedDisk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PreservedStatePreservedDisk.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPreservedStatePreservedDisk(od as api.PreservedStatePreservedDisk);
     });
   });
@@ -41800,7 +42732,9 @@
   unittest.group('obj-schema-Project', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProject();
-      var od = api.Project.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Project.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProject(od as api.Project);
     });
   });
@@ -41808,7 +42742,9 @@
   unittest.group('obj-schema-ProjectsDisableXpnResourceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectsDisableXpnResourceRequest();
-      var od = api.ProjectsDisableXpnResourceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectsDisableXpnResourceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectsDisableXpnResourceRequest(
           od as api.ProjectsDisableXpnResourceRequest);
     });
@@ -41817,7 +42753,9 @@
   unittest.group('obj-schema-ProjectsEnableXpnResourceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectsEnableXpnResourceRequest();
-      var od = api.ProjectsEnableXpnResourceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectsEnableXpnResourceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectsEnableXpnResourceRequest(
           od as api.ProjectsEnableXpnResourceRequest);
     });
@@ -41826,7 +42764,9 @@
   unittest.group('obj-schema-ProjectsGetXpnResources', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectsGetXpnResources();
-      var od = api.ProjectsGetXpnResources.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectsGetXpnResources.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectsGetXpnResources(od as api.ProjectsGetXpnResources);
     });
   });
@@ -41834,7 +42774,9 @@
   unittest.group('obj-schema-ProjectsListXpnHostsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectsListXpnHostsRequest();
-      var od = api.ProjectsListXpnHostsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectsListXpnHostsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectsListXpnHostsRequest(od as api.ProjectsListXpnHostsRequest);
     });
   });
@@ -41842,7 +42784,9 @@
   unittest.group('obj-schema-ProjectsSetDefaultNetworkTierRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectsSetDefaultNetworkTierRequest();
-      var od = api.ProjectsSetDefaultNetworkTierRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectsSetDefaultNetworkTierRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectsSetDefaultNetworkTierRequest(
           od as api.ProjectsSetDefaultNetworkTierRequest);
     });
@@ -41851,7 +42795,8 @@
   unittest.group('obj-schema-Quota', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuota();
-      var od = api.Quota.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Quota.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuota(od as api.Quota);
     });
   });
@@ -41859,7 +42804,9 @@
   unittest.group('obj-schema-Reference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReference();
-      var od = api.Reference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Reference.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReference(od as api.Reference);
     });
   });
@@ -41867,7 +42814,9 @@
   unittest.group('obj-schema-Region', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegion();
-      var od = api.Region.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Region.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRegion(od as api.Region);
     });
   });
@@ -41875,7 +42824,9 @@
   unittest.group('obj-schema-RegionAutoscalerListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionAutoscalerListWarningData();
-      var od = api.RegionAutoscalerListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionAutoscalerListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionAutoscalerListWarningData(
           od as api.RegionAutoscalerListWarningData);
     });
@@ -41884,7 +42835,9 @@
   unittest.group('obj-schema-RegionAutoscalerListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionAutoscalerListWarning();
-      var od = api.RegionAutoscalerListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionAutoscalerListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionAutoscalerListWarning(od as api.RegionAutoscalerListWarning);
     });
   });
@@ -41892,7 +42845,9 @@
   unittest.group('obj-schema-RegionAutoscalerList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionAutoscalerList();
-      var od = api.RegionAutoscalerList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionAutoscalerList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionAutoscalerList(od as api.RegionAutoscalerList);
     });
   });
@@ -41900,7 +42855,9 @@
   unittest.group('obj-schema-RegionDiskTypeListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionDiskTypeListWarningData();
-      var od = api.RegionDiskTypeListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionDiskTypeListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionDiskTypeListWarningData(
           od as api.RegionDiskTypeListWarningData);
     });
@@ -41909,7 +42866,9 @@
   unittest.group('obj-schema-RegionDiskTypeListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionDiskTypeListWarning();
-      var od = api.RegionDiskTypeListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionDiskTypeListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionDiskTypeListWarning(od as api.RegionDiskTypeListWarning);
     });
   });
@@ -41917,7 +42876,9 @@
   unittest.group('obj-schema-RegionDiskTypeList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionDiskTypeList();
-      var od = api.RegionDiskTypeList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionDiskTypeList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionDiskTypeList(od as api.RegionDiskTypeList);
     });
   });
@@ -41925,7 +42886,9 @@
   unittest.group('obj-schema-RegionDisksAddResourcePoliciesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionDisksAddResourcePoliciesRequest();
-      var od = api.RegionDisksAddResourcePoliciesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionDisksAddResourcePoliciesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionDisksAddResourcePoliciesRequest(
           od as api.RegionDisksAddResourcePoliciesRequest);
     });
@@ -41934,8 +42897,9 @@
   unittest.group('obj-schema-RegionDisksRemoveResourcePoliciesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionDisksRemoveResourcePoliciesRequest();
-      var od =
-          api.RegionDisksRemoveResourcePoliciesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionDisksRemoveResourcePoliciesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionDisksRemoveResourcePoliciesRequest(
           od as api.RegionDisksRemoveResourcePoliciesRequest);
     });
@@ -41944,7 +42908,9 @@
   unittest.group('obj-schema-RegionDisksResizeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionDisksResizeRequest();
-      var od = api.RegionDisksResizeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionDisksResizeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionDisksResizeRequest(od as api.RegionDisksResizeRequest);
     });
   });
@@ -41952,7 +42918,9 @@
   unittest.group('obj-schema-RegionInstanceGroupListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupListWarningData();
-      var od = api.RegionInstanceGroupListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupListWarningData(
           od as api.RegionInstanceGroupListWarningData);
     });
@@ -41961,7 +42929,9 @@
   unittest.group('obj-schema-RegionInstanceGroupListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupListWarning();
-      var od = api.RegionInstanceGroupListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupListWarning(
           od as api.RegionInstanceGroupListWarning);
     });
@@ -41970,7 +42940,9 @@
   unittest.group('obj-schema-RegionInstanceGroupList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupList();
-      var od = api.RegionInstanceGroupList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupList(od as api.RegionInstanceGroupList);
     });
   });
@@ -41979,8 +42951,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagerDeleteInstanceConfigReq();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagerDeleteInstanceConfigReq.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagerDeleteInstanceConfigReq(
           od as api.RegionInstanceGroupManagerDeleteInstanceConfigReq);
     });
@@ -41989,8 +42962,9 @@
   unittest.group('obj-schema-RegionInstanceGroupManagerListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagerListWarningData();
-      var od =
-          api.RegionInstanceGroupManagerListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupManagerListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagerListWarningData(
           od as api.RegionInstanceGroupManagerListWarningData);
     });
@@ -41999,7 +42973,9 @@
   unittest.group('obj-schema-RegionInstanceGroupManagerListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagerListWarning();
-      var od = api.RegionInstanceGroupManagerListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupManagerListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagerListWarning(
           od as api.RegionInstanceGroupManagerListWarning);
     });
@@ -42008,7 +42984,9 @@
   unittest.group('obj-schema-RegionInstanceGroupManagerList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagerList();
-      var od = api.RegionInstanceGroupManagerList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupManagerList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagerList(
           od as api.RegionInstanceGroupManagerList);
     });
@@ -42018,8 +42996,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagerPatchInstanceConfigReq();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagerPatchInstanceConfigReq.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagerPatchInstanceConfigReq(
           od as api.RegionInstanceGroupManagerPatchInstanceConfigReq);
     });
@@ -42029,8 +43008,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagerUpdateInstanceConfigReq();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagerUpdateInstanceConfigReq.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagerUpdateInstanceConfigReq(
           od as api.RegionInstanceGroupManagerUpdateInstanceConfigReq);
     });
@@ -42040,8 +43020,9 @@
       'obj-schema-RegionInstanceGroupManagersAbandonInstancesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersAbandonInstancesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersAbandonInstancesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersAbandonInstancesRequest(
           od as api.RegionInstanceGroupManagersAbandonInstancesRequest);
     });
@@ -42051,8 +43032,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersApplyUpdatesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersApplyUpdatesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersApplyUpdatesRequest(
           od as api.RegionInstanceGroupManagersApplyUpdatesRequest);
     });
@@ -42062,8 +43044,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersCreateInstancesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersCreateInstancesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersCreateInstancesRequest(
           od as api.RegionInstanceGroupManagersCreateInstancesRequest);
     });
@@ -42073,8 +43056,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersDeleteInstancesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersDeleteInstancesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersDeleteInstancesRequest(
           od as api.RegionInstanceGroupManagersDeleteInstancesRequest);
     });
@@ -42084,8 +43068,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersListErrorsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersListErrorsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersListErrorsResponse(
           od as api.RegionInstanceGroupManagersListErrorsResponse);
     });
@@ -42097,8 +43082,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildRegionInstanceGroupManagersListInstanceConfigsRespWarningData();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersListInstanceConfigsRespWarningData
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersListInstanceConfigsRespWarningData(od
           as api.RegionInstanceGroupManagersListInstanceConfigsRespWarningData);
     });
@@ -42109,8 +43095,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersListInstanceConfigsRespWarning();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersListInstanceConfigsRespWarning
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersListInstanceConfigsRespWarning(
           od as api.RegionInstanceGroupManagersListInstanceConfigsRespWarning);
     });
@@ -42120,8 +43107,9 @@
       'obj-schema-RegionInstanceGroupManagersListInstanceConfigsResp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersListInstanceConfigsResp();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersListInstanceConfigsResp.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersListInstanceConfigsResp(
           od as api.RegionInstanceGroupManagersListInstanceConfigsResp);
     });
@@ -42131,8 +43119,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersListInstancesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersListInstancesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersListInstancesResponse(
           od as api.RegionInstanceGroupManagersListInstancesResponse);
     });
@@ -42141,8 +43130,9 @@
   unittest.group('obj-schema-RegionInstanceGroupManagersRecreateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersRecreateRequest();
-      var od =
-          api.RegionInstanceGroupManagersRecreateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupManagersRecreateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersRecreateRequest(
           od as api.RegionInstanceGroupManagersRecreateRequest);
     });
@@ -42152,8 +43142,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersSetTargetPoolsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersSetTargetPoolsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersSetTargetPoolsRequest(
           od as api.RegionInstanceGroupManagersSetTargetPoolsRequest);
     });
@@ -42163,8 +43154,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupManagersSetTemplateRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionInstanceGroupManagersSetTemplateRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupManagersSetTemplateRequest(
           od as api.RegionInstanceGroupManagersSetTemplateRequest);
     });
@@ -42173,8 +43165,9 @@
   unittest.group('obj-schema-RegionInstanceGroupsListInstancesWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupsListInstancesWarningData();
-      var od =
-          api.RegionInstanceGroupsListInstancesWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupsListInstancesWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupsListInstancesWarningData(
           od as api.RegionInstanceGroupsListInstancesWarningData);
     });
@@ -42183,8 +43176,9 @@
   unittest.group('obj-schema-RegionInstanceGroupsListInstancesWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupsListInstancesWarning();
-      var od =
-          api.RegionInstanceGroupsListInstancesWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupsListInstancesWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupsListInstancesWarning(
           od as api.RegionInstanceGroupsListInstancesWarning);
     });
@@ -42193,7 +43187,9 @@
   unittest.group('obj-schema-RegionInstanceGroupsListInstances', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupsListInstances();
-      var od = api.RegionInstanceGroupsListInstances.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupsListInstances.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupsListInstances(
           od as api.RegionInstanceGroupsListInstances);
     });
@@ -42202,8 +43198,9 @@
   unittest.group('obj-schema-RegionInstanceGroupsListInstancesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupsListInstancesRequest();
-      var od =
-          api.RegionInstanceGroupsListInstancesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupsListInstancesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupsListInstancesRequest(
           od as api.RegionInstanceGroupsListInstancesRequest);
     });
@@ -42212,8 +43209,9 @@
   unittest.group('obj-schema-RegionInstanceGroupsSetNamedPortsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionInstanceGroupsSetNamedPortsRequest();
-      var od =
-          api.RegionInstanceGroupsSetNamedPortsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionInstanceGroupsSetNamedPortsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionInstanceGroupsSetNamedPortsRequest(
           od as api.RegionInstanceGroupsSetNamedPortsRequest);
     });
@@ -42222,7 +43220,9 @@
   unittest.group('obj-schema-RegionListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionListWarningData();
-      var od = api.RegionListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionListWarningData(od as api.RegionListWarningData);
     });
   });
@@ -42230,7 +43230,9 @@
   unittest.group('obj-schema-RegionListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionListWarning();
-      var od = api.RegionListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionListWarning(od as api.RegionListWarning);
     });
   });
@@ -42238,7 +43240,9 @@
   unittest.group('obj-schema-RegionList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionList();
-      var od = api.RegionList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RegionList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRegionList(od as api.RegionList);
     });
   });
@@ -42246,7 +43250,9 @@
   unittest.group('obj-schema-RegionSetLabelsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionSetLabelsRequest();
-      var od = api.RegionSetLabelsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionSetLabelsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionSetLabelsRequest(od as api.RegionSetLabelsRequest);
     });
   });
@@ -42254,7 +43260,9 @@
   unittest.group('obj-schema-RegionSetPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionSetPolicyRequest();
-      var od = api.RegionSetPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionSetPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionSetPolicyRequest(od as api.RegionSetPolicyRequest);
     });
   });
@@ -42263,8 +43271,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionTargetHttpsProxiesSetSslCertificatesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionTargetHttpsProxiesSetSslCertificatesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionTargetHttpsProxiesSetSslCertificatesRequest(
           od as api.RegionTargetHttpsProxiesSetSslCertificatesRequest);
     });
@@ -42273,7 +43282,9 @@
   unittest.group('obj-schema-RegionUrlMapsValidateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionUrlMapsValidateRequest();
-      var od = api.RegionUrlMapsValidateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionUrlMapsValidateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionUrlMapsValidateRequest(od as api.RegionUrlMapsValidateRequest);
     });
   });
@@ -42281,7 +43292,9 @@
   unittest.group('obj-schema-RequestMirrorPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestMirrorPolicy();
-      var od = api.RequestMirrorPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestMirrorPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestMirrorPolicy(od as api.RequestMirrorPolicy);
     });
   });
@@ -42289,7 +43302,9 @@
   unittest.group('obj-schema-Reservation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservation();
-      var od = api.Reservation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Reservation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservation(od as api.Reservation);
     });
   });
@@ -42297,7 +43312,9 @@
   unittest.group('obj-schema-ReservationAffinity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationAffinity();
-      var od = api.ReservationAffinity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationAffinity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationAffinity(od as api.ReservationAffinity);
     });
   });
@@ -42305,7 +43322,9 @@
   unittest.group('obj-schema-ReservationAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationAggregatedListWarningData();
-      var od = api.ReservationAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationAggregatedListWarningData(
           od as api.ReservationAggregatedListWarningData);
     });
@@ -42314,7 +43333,9 @@
   unittest.group('obj-schema-ReservationAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationAggregatedListWarning();
-      var od = api.ReservationAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationAggregatedListWarning(
           od as api.ReservationAggregatedListWarning);
     });
@@ -42323,7 +43344,9 @@
   unittest.group('obj-schema-ReservationAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationAggregatedList();
-      var od = api.ReservationAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationAggregatedList(od as api.ReservationAggregatedList);
     });
   });
@@ -42331,7 +43354,9 @@
   unittest.group('obj-schema-ReservationListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationListWarningData();
-      var od = api.ReservationListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationListWarningData(od as api.ReservationListWarningData);
     });
   });
@@ -42339,7 +43364,9 @@
   unittest.group('obj-schema-ReservationListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationListWarning();
-      var od = api.ReservationListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationListWarning(od as api.ReservationListWarning);
     });
   });
@@ -42347,7 +43374,9 @@
   unittest.group('obj-schema-ReservationList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationList();
-      var od = api.ReservationList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationList(od as api.ReservationList);
     });
   });
@@ -42355,7 +43384,9 @@
   unittest.group('obj-schema-ReservationsResizeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationsResizeRequest();
-      var od = api.ReservationsResizeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationsResizeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationsResizeRequest(od as api.ReservationsResizeRequest);
     });
   });
@@ -42363,7 +43394,9 @@
   unittest.group('obj-schema-ReservationsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationsScopedListWarningData();
-      var od = api.ReservationsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationsScopedListWarningData(
           od as api.ReservationsScopedListWarningData);
     });
@@ -42372,7 +43405,9 @@
   unittest.group('obj-schema-ReservationsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationsScopedListWarning();
-      var od = api.ReservationsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationsScopedListWarning(
           od as api.ReservationsScopedListWarning);
     });
@@ -42381,7 +43416,9 @@
   unittest.group('obj-schema-ReservationsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationsScopedList();
-      var od = api.ReservationsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationsScopedList(od as api.ReservationsScopedList);
     });
   });
@@ -42389,7 +43426,9 @@
   unittest.group('obj-schema-ResourceCommitment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceCommitment();
-      var od = api.ResourceCommitment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceCommitment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceCommitment(od as api.ResourceCommitment);
     });
   });
@@ -42397,7 +43436,9 @@
   unittest.group('obj-schema-ResourceGroupReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceGroupReference();
-      var od = api.ResourceGroupReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceGroupReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceGroupReference(od as api.ResourceGroupReference);
     });
   });
@@ -42405,7 +43446,9 @@
   unittest.group('obj-schema-ResourcePoliciesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePoliciesScopedListWarningData();
-      var od = api.ResourcePoliciesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePoliciesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePoliciesScopedListWarningData(
           od as api.ResourcePoliciesScopedListWarningData);
     });
@@ -42414,7 +43457,9 @@
   unittest.group('obj-schema-ResourcePoliciesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePoliciesScopedListWarning();
-      var od = api.ResourcePoliciesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePoliciesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePoliciesScopedListWarning(
           od as api.ResourcePoliciesScopedListWarning);
     });
@@ -42423,7 +43468,9 @@
   unittest.group('obj-schema-ResourcePoliciesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePoliciesScopedList();
-      var od = api.ResourcePoliciesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePoliciesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePoliciesScopedList(od as api.ResourcePoliciesScopedList);
     });
   });
@@ -42431,7 +43478,9 @@
   unittest.group('obj-schema-ResourcePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicy();
-      var od = api.ResourcePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicy(od as api.ResourcePolicy);
     });
   });
@@ -42439,7 +43488,9 @@
   unittest.group('obj-schema-ResourcePolicyAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyAggregatedListWarningData();
-      var od = api.ResourcePolicyAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyAggregatedListWarningData(
           od as api.ResourcePolicyAggregatedListWarningData);
     });
@@ -42448,7 +43499,9 @@
   unittest.group('obj-schema-ResourcePolicyAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyAggregatedListWarning();
-      var od = api.ResourcePolicyAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyAggregatedListWarning(
           od as api.ResourcePolicyAggregatedListWarning);
     });
@@ -42457,7 +43510,9 @@
   unittest.group('obj-schema-ResourcePolicyAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyAggregatedList();
-      var od = api.ResourcePolicyAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyAggregatedList(od as api.ResourcePolicyAggregatedList);
     });
   });
@@ -42465,7 +43520,9 @@
   unittest.group('obj-schema-ResourcePolicyDailyCycle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyDailyCycle();
-      var od = api.ResourcePolicyDailyCycle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyDailyCycle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyDailyCycle(od as api.ResourcePolicyDailyCycle);
     });
   });
@@ -42473,7 +43530,9 @@
   unittest.group('obj-schema-ResourcePolicyGroupPlacementPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyGroupPlacementPolicy();
-      var od = api.ResourcePolicyGroupPlacementPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyGroupPlacementPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyGroupPlacementPolicy(
           od as api.ResourcePolicyGroupPlacementPolicy);
     });
@@ -42482,7 +43541,9 @@
   unittest.group('obj-schema-ResourcePolicyHourlyCycle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyHourlyCycle();
-      var od = api.ResourcePolicyHourlyCycle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyHourlyCycle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyHourlyCycle(od as api.ResourcePolicyHourlyCycle);
     });
   });
@@ -42490,7 +43551,9 @@
   unittest.group('obj-schema-ResourcePolicyInstanceSchedulePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyInstanceSchedulePolicy();
-      var od = api.ResourcePolicyInstanceSchedulePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyInstanceSchedulePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyInstanceSchedulePolicy(
           od as api.ResourcePolicyInstanceSchedulePolicy);
     });
@@ -42499,8 +43562,9 @@
   unittest.group('obj-schema-ResourcePolicyInstanceSchedulePolicySchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyInstanceSchedulePolicySchedule();
-      var od =
-          api.ResourcePolicyInstanceSchedulePolicySchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyInstanceSchedulePolicySchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyInstanceSchedulePolicySchedule(
           od as api.ResourcePolicyInstanceSchedulePolicySchedule);
     });
@@ -42509,7 +43573,9 @@
   unittest.group('obj-schema-ResourcePolicyListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyListWarningData();
-      var od = api.ResourcePolicyListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyListWarningData(
           od as api.ResourcePolicyListWarningData);
     });
@@ -42518,7 +43584,9 @@
   unittest.group('obj-schema-ResourcePolicyListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyListWarning();
-      var od = api.ResourcePolicyListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyListWarning(od as api.ResourcePolicyListWarning);
     });
   });
@@ -42526,7 +43594,9 @@
   unittest.group('obj-schema-ResourcePolicyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyList();
-      var od = api.ResourcePolicyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyList(od as api.ResourcePolicyList);
     });
   });
@@ -42534,7 +43604,9 @@
   unittest.group('obj-schema-ResourcePolicyResourceStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyResourceStatus();
-      var od = api.ResourcePolicyResourceStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyResourceStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyResourceStatus(od as api.ResourcePolicyResourceStatus);
     });
   });
@@ -42544,9 +43616,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyResourceStatusInstanceSchedulePolicyStatus();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.ResourcePolicyResourceStatusInstanceSchedulePolicyStatus.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyResourceStatusInstanceSchedulePolicyStatus(
           od as api.ResourcePolicyResourceStatusInstanceSchedulePolicyStatus);
     });
@@ -42555,7 +43628,9 @@
   unittest.group('obj-schema-ResourcePolicySnapshotSchedulePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicySnapshotSchedulePolicy();
-      var od = api.ResourcePolicySnapshotSchedulePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicySnapshotSchedulePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicySnapshotSchedulePolicy(
           od as api.ResourcePolicySnapshotSchedulePolicy);
     });
@@ -42565,8 +43640,9 @@
       'obj-schema-ResourcePolicySnapshotSchedulePolicyRetentionPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicySnapshotSchedulePolicyRetentionPolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ResourcePolicySnapshotSchedulePolicyRetentionPolicy.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicySnapshotSchedulePolicyRetentionPolicy(
           od as api.ResourcePolicySnapshotSchedulePolicyRetentionPolicy);
     });
@@ -42575,8 +43651,9 @@
   unittest.group('obj-schema-ResourcePolicySnapshotSchedulePolicySchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicySnapshotSchedulePolicySchedule();
-      var od =
-          api.ResourcePolicySnapshotSchedulePolicySchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicySnapshotSchedulePolicySchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicySnapshotSchedulePolicySchedule(
           od as api.ResourcePolicySnapshotSchedulePolicySchedule);
     });
@@ -42586,9 +43663,10 @@
       'obj-schema-ResourcePolicySnapshotSchedulePolicySnapshotProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicySnapshotSchedulePolicySnapshotProperties();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.ResourcePolicySnapshotSchedulePolicySnapshotProperties.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicySnapshotSchedulePolicySnapshotProperties(
           od as api.ResourcePolicySnapshotSchedulePolicySnapshotProperties);
     });
@@ -42597,7 +43675,9 @@
   unittest.group('obj-schema-ResourcePolicyWeeklyCycle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyWeeklyCycle();
-      var od = api.ResourcePolicyWeeklyCycle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyWeeklyCycle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyWeeklyCycle(od as api.ResourcePolicyWeeklyCycle);
     });
   });
@@ -42605,7 +43685,9 @@
   unittest.group('obj-schema-ResourcePolicyWeeklyCycleDayOfWeek', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcePolicyWeeklyCycleDayOfWeek();
-      var od = api.ResourcePolicyWeeklyCycleDayOfWeek.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcePolicyWeeklyCycleDayOfWeek.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcePolicyWeeklyCycleDayOfWeek(
           od as api.ResourcePolicyWeeklyCycleDayOfWeek);
     });
@@ -42614,7 +43696,9 @@
   unittest.group('obj-schema-RouteWarningsData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouteWarningsData();
-      var od = api.RouteWarningsData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouteWarningsData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouteWarningsData(od as api.RouteWarningsData);
     });
   });
@@ -42622,7 +43706,9 @@
   unittest.group('obj-schema-RouteWarnings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouteWarnings();
-      var od = api.RouteWarnings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouteWarnings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouteWarnings(od as api.RouteWarnings);
     });
   });
@@ -42630,7 +43716,8 @@
   unittest.group('obj-schema-Route', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoute();
-      var od = api.Route.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Route.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRoute(od as api.Route);
     });
   });
@@ -42638,7 +43725,9 @@
   unittest.group('obj-schema-RouteListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouteListWarningData();
-      var od = api.RouteListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouteListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouteListWarningData(od as api.RouteListWarningData);
     });
   });
@@ -42646,7 +43735,9 @@
   unittest.group('obj-schema-RouteListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouteListWarning();
-      var od = api.RouteListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouteListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouteListWarning(od as api.RouteListWarning);
     });
   });
@@ -42654,7 +43745,9 @@
   unittest.group('obj-schema-RouteList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouteList();
-      var od = api.RouteList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RouteList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRouteList(od as api.RouteList);
     });
   });
@@ -42662,7 +43755,9 @@
   unittest.group('obj-schema-Router', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouter();
-      var od = api.Router.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Router.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRouter(od as api.Router);
     });
   });
@@ -42670,7 +43765,9 @@
   unittest.group('obj-schema-RouterAdvertisedIpRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterAdvertisedIpRange();
-      var od = api.RouterAdvertisedIpRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterAdvertisedIpRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterAdvertisedIpRange(od as api.RouterAdvertisedIpRange);
     });
   });
@@ -42678,7 +43775,9 @@
   unittest.group('obj-schema-RouterAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterAggregatedListWarningData();
-      var od = api.RouterAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterAggregatedListWarningData(
           od as api.RouterAggregatedListWarningData);
     });
@@ -42687,7 +43786,9 @@
   unittest.group('obj-schema-RouterAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterAggregatedListWarning();
-      var od = api.RouterAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterAggregatedListWarning(od as api.RouterAggregatedListWarning);
     });
   });
@@ -42695,7 +43796,9 @@
   unittest.group('obj-schema-RouterAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterAggregatedList();
-      var od = api.RouterAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterAggregatedList(od as api.RouterAggregatedList);
     });
   });
@@ -42703,7 +43806,9 @@
   unittest.group('obj-schema-RouterBgp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterBgp();
-      var od = api.RouterBgp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RouterBgp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRouterBgp(od as api.RouterBgp);
     });
   });
@@ -42711,7 +43816,9 @@
   unittest.group('obj-schema-RouterBgpPeer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterBgpPeer();
-      var od = api.RouterBgpPeer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterBgpPeer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterBgpPeer(od as api.RouterBgpPeer);
     });
   });
@@ -42719,7 +43826,9 @@
   unittest.group('obj-schema-RouterInterface', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterInterface();
-      var od = api.RouterInterface.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterInterface.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterInterface(od as api.RouterInterface);
     });
   });
@@ -42727,7 +43836,9 @@
   unittest.group('obj-schema-RouterListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterListWarningData();
-      var od = api.RouterListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterListWarningData(od as api.RouterListWarningData);
     });
   });
@@ -42735,7 +43846,9 @@
   unittest.group('obj-schema-RouterListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterListWarning();
-      var od = api.RouterListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterListWarning(od as api.RouterListWarning);
     });
   });
@@ -42743,7 +43856,9 @@
   unittest.group('obj-schema-RouterList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterList();
-      var od = api.RouterList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RouterList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRouterList(od as api.RouterList);
     });
   });
@@ -42751,7 +43866,9 @@
   unittest.group('obj-schema-RouterNat', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterNat();
-      var od = api.RouterNat.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RouterNat.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRouterNat(od as api.RouterNat);
     });
   });
@@ -42759,7 +43876,9 @@
   unittest.group('obj-schema-RouterNatLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterNatLogConfig();
-      var od = api.RouterNatLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterNatLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterNatLogConfig(od as api.RouterNatLogConfig);
     });
   });
@@ -42767,7 +43886,9 @@
   unittest.group('obj-schema-RouterNatSubnetworkToNat', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterNatSubnetworkToNat();
-      var od = api.RouterNatSubnetworkToNat.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterNatSubnetworkToNat.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterNatSubnetworkToNat(od as api.RouterNatSubnetworkToNat);
     });
   });
@@ -42775,7 +43896,9 @@
   unittest.group('obj-schema-RouterStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterStatus();
-      var od = api.RouterStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterStatus(od as api.RouterStatus);
     });
   });
@@ -42783,7 +43906,9 @@
   unittest.group('obj-schema-RouterStatusBgpPeerStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterStatusBgpPeerStatus();
-      var od = api.RouterStatusBgpPeerStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterStatusBgpPeerStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterStatusBgpPeerStatus(od as api.RouterStatusBgpPeerStatus);
     });
   });
@@ -42791,7 +43916,9 @@
   unittest.group('obj-schema-RouterStatusNatStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterStatusNatStatus();
-      var od = api.RouterStatusNatStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterStatusNatStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterStatusNatStatus(od as api.RouterStatusNatStatus);
     });
   });
@@ -42799,7 +43926,9 @@
   unittest.group('obj-schema-RouterStatusResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterStatusResponse();
-      var od = api.RouterStatusResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterStatusResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterStatusResponse(od as api.RouterStatusResponse);
     });
   });
@@ -42807,7 +43936,9 @@
   unittest.group('obj-schema-RoutersPreviewResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoutersPreviewResponse();
-      var od = api.RoutersPreviewResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoutersPreviewResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoutersPreviewResponse(od as api.RoutersPreviewResponse);
     });
   });
@@ -42815,7 +43946,9 @@
   unittest.group('obj-schema-RoutersScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoutersScopedListWarningData();
-      var od = api.RoutersScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoutersScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoutersScopedListWarningData(od as api.RoutersScopedListWarningData);
     });
   });
@@ -42823,7 +43956,9 @@
   unittest.group('obj-schema-RoutersScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoutersScopedListWarning();
-      var od = api.RoutersScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoutersScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoutersScopedListWarning(od as api.RoutersScopedListWarning);
     });
   });
@@ -42831,7 +43966,9 @@
   unittest.group('obj-schema-RoutersScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoutersScopedList();
-      var od = api.RoutersScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoutersScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoutersScopedList(od as api.RoutersScopedList);
     });
   });
@@ -42839,7 +43976,8 @@
   unittest.group('obj-schema-Rule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRule();
-      var od = api.Rule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Rule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRule(od as api.Rule);
     });
   });
@@ -42847,7 +43985,9 @@
   unittest.group('obj-schema-SSLHealthCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSSLHealthCheck();
-      var od = api.SSLHealthCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SSLHealthCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSSLHealthCheck(od as api.SSLHealthCheck);
     });
   });
@@ -42855,7 +43995,9 @@
   unittest.group('obj-schema-Scheduling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScheduling();
-      var od = api.Scheduling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Scheduling.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkScheduling(od as api.Scheduling);
     });
   });
@@ -42863,7 +44005,9 @@
   unittest.group('obj-schema-SchedulingNodeAffinity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchedulingNodeAffinity();
-      var od = api.SchedulingNodeAffinity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SchedulingNodeAffinity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSchedulingNodeAffinity(od as api.SchedulingNodeAffinity);
     });
   });
@@ -42871,7 +44015,9 @@
   unittest.group('obj-schema-Screenshot', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScreenshot();
-      var od = api.Screenshot.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Screenshot.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkScreenshot(od as api.Screenshot);
     });
   });
@@ -42880,9 +44026,10 @@
       'obj-schema-SecurityPoliciesListPreconfiguredExpressionSetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPoliciesListPreconfiguredExpressionSetsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.SecurityPoliciesListPreconfiguredExpressionSetsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPoliciesListPreconfiguredExpressionSetsResponse(
           od as api.SecurityPoliciesListPreconfiguredExpressionSetsResponse);
     });
@@ -42891,7 +44038,9 @@
   unittest.group('obj-schema-SecurityPoliciesWafConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPoliciesWafConfig();
-      var od = api.SecurityPoliciesWafConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityPoliciesWafConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPoliciesWafConfig(od as api.SecurityPoliciesWafConfig);
     });
   });
@@ -42899,7 +44048,9 @@
   unittest.group('obj-schema-SecurityPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPolicy();
-      var od = api.SecurityPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPolicy(od as api.SecurityPolicy);
     });
   });
@@ -42907,7 +44058,9 @@
   unittest.group('obj-schema-SecurityPolicyListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPolicyListWarningData();
-      var od = api.SecurityPolicyListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityPolicyListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPolicyListWarningData(
           od as api.SecurityPolicyListWarningData);
     });
@@ -42916,7 +44069,9 @@
   unittest.group('obj-schema-SecurityPolicyListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPolicyListWarning();
-      var od = api.SecurityPolicyListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityPolicyListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPolicyListWarning(od as api.SecurityPolicyListWarning);
     });
   });
@@ -42924,7 +44079,9 @@
   unittest.group('obj-schema-SecurityPolicyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPolicyList();
-      var od = api.SecurityPolicyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityPolicyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPolicyList(od as api.SecurityPolicyList);
     });
   });
@@ -42932,7 +44089,9 @@
   unittest.group('obj-schema-SecurityPolicyReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPolicyReference();
-      var od = api.SecurityPolicyReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityPolicyReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPolicyReference(od as api.SecurityPolicyReference);
     });
   });
@@ -42940,7 +44099,9 @@
   unittest.group('obj-schema-SecurityPolicyRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPolicyRule();
-      var od = api.SecurityPolicyRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityPolicyRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPolicyRule(od as api.SecurityPolicyRule);
     });
   });
@@ -42948,7 +44109,9 @@
   unittest.group('obj-schema-SecurityPolicyRuleMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPolicyRuleMatcher();
-      var od = api.SecurityPolicyRuleMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityPolicyRuleMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPolicyRuleMatcher(od as api.SecurityPolicyRuleMatcher);
     });
   });
@@ -42956,7 +44119,9 @@
   unittest.group('obj-schema-SecurityPolicyRuleMatcherConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityPolicyRuleMatcherConfig();
-      var od = api.SecurityPolicyRuleMatcherConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityPolicyRuleMatcherConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityPolicyRuleMatcherConfig(
           od as api.SecurityPolicyRuleMatcherConfig);
     });
@@ -42965,7 +44130,9 @@
   unittest.group('obj-schema-SecuritySettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecuritySettings();
-      var od = api.SecuritySettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecuritySettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecuritySettings(od as api.SecuritySettings);
     });
   });
@@ -42973,7 +44140,9 @@
   unittest.group('obj-schema-SerialPortOutput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSerialPortOutput();
-      var od = api.SerialPortOutput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SerialPortOutput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSerialPortOutput(od as api.SerialPortOutput);
     });
   });
@@ -42981,7 +44150,9 @@
   unittest.group('obj-schema-ServerBinding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServerBinding();
-      var od = api.ServerBinding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServerBinding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServerBinding(od as api.ServerBinding);
     });
   });
@@ -42989,7 +44160,9 @@
   unittest.group('obj-schema-ServiceAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccount();
-      var od = api.ServiceAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccount(od as api.ServiceAccount);
     });
   });
@@ -42997,7 +44170,9 @@
   unittest.group('obj-schema-ShieldedInstanceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShieldedInstanceConfig();
-      var od = api.ShieldedInstanceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShieldedInstanceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShieldedInstanceConfig(od as api.ShieldedInstanceConfig);
     });
   });
@@ -43005,7 +44180,9 @@
   unittest.group('obj-schema-ShieldedInstanceIdentity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShieldedInstanceIdentity();
-      var od = api.ShieldedInstanceIdentity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShieldedInstanceIdentity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShieldedInstanceIdentity(od as api.ShieldedInstanceIdentity);
     });
   });
@@ -43013,7 +44190,9 @@
   unittest.group('obj-schema-ShieldedInstanceIdentityEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShieldedInstanceIdentityEntry();
-      var od = api.ShieldedInstanceIdentityEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShieldedInstanceIdentityEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShieldedInstanceIdentityEntry(
           od as api.ShieldedInstanceIdentityEntry);
     });
@@ -43022,7 +44201,9 @@
   unittest.group('obj-schema-ShieldedInstanceIntegrityPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShieldedInstanceIntegrityPolicy();
-      var od = api.ShieldedInstanceIntegrityPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShieldedInstanceIntegrityPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShieldedInstanceIntegrityPolicy(
           od as api.ShieldedInstanceIntegrityPolicy);
     });
@@ -43031,7 +44212,9 @@
   unittest.group('obj-schema-SignedUrlKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignedUrlKey();
-      var od = api.SignedUrlKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SignedUrlKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSignedUrlKey(od as api.SignedUrlKey);
     });
   });
@@ -43039,7 +44222,9 @@
   unittest.group('obj-schema-Snapshot', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshot();
-      var od = api.Snapshot.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Snapshot.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSnapshot(od as api.Snapshot);
     });
   });
@@ -43047,7 +44232,9 @@
   unittest.group('obj-schema-SnapshotListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotListWarningData();
-      var od = api.SnapshotListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotListWarningData(od as api.SnapshotListWarningData);
     });
   });
@@ -43055,7 +44242,9 @@
   unittest.group('obj-schema-SnapshotListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotListWarning();
-      var od = api.SnapshotListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotListWarning(od as api.SnapshotListWarning);
     });
   });
@@ -43063,7 +44252,9 @@
   unittest.group('obj-schema-SnapshotList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotList();
-      var od = api.SnapshotList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotList(od as api.SnapshotList);
     });
   });
@@ -43071,7 +44262,9 @@
   unittest.group('obj-schema-SourceInstanceParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceInstanceParams();
-      var od = api.SourceInstanceParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceInstanceParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceInstanceParams(od as api.SourceInstanceParams);
     });
   });
@@ -43079,7 +44272,9 @@
   unittest.group('obj-schema-SslCertificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificate();
-      var od = api.SslCertificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificate(od as api.SslCertificate);
     });
   });
@@ -43087,7 +44282,9 @@
   unittest.group('obj-schema-SslCertificateAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificateAggregatedListWarningData();
-      var od = api.SslCertificateAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificateAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificateAggregatedListWarningData(
           od as api.SslCertificateAggregatedListWarningData);
     });
@@ -43096,7 +44293,9 @@
   unittest.group('obj-schema-SslCertificateAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificateAggregatedListWarning();
-      var od = api.SslCertificateAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificateAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificateAggregatedListWarning(
           od as api.SslCertificateAggregatedListWarning);
     });
@@ -43105,7 +44304,9 @@
   unittest.group('obj-schema-SslCertificateAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificateAggregatedList();
-      var od = api.SslCertificateAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificateAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificateAggregatedList(od as api.SslCertificateAggregatedList);
     });
   });
@@ -43113,7 +44314,9 @@
   unittest.group('obj-schema-SslCertificateListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificateListWarningData();
-      var od = api.SslCertificateListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificateListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificateListWarningData(
           od as api.SslCertificateListWarningData);
     });
@@ -43122,7 +44325,9 @@
   unittest.group('obj-schema-SslCertificateListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificateListWarning();
-      var od = api.SslCertificateListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificateListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificateListWarning(od as api.SslCertificateListWarning);
     });
   });
@@ -43130,7 +44335,9 @@
   unittest.group('obj-schema-SslCertificateList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificateList();
-      var od = api.SslCertificateList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificateList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificateList(od as api.SslCertificateList);
     });
   });
@@ -43138,7 +44345,9 @@
   unittest.group('obj-schema-SslCertificateManagedSslCertificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificateManagedSslCertificate();
-      var od = api.SslCertificateManagedSslCertificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificateManagedSslCertificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificateManagedSslCertificate(
           od as api.SslCertificateManagedSslCertificate);
     });
@@ -43147,7 +44356,9 @@
   unittest.group('obj-schema-SslCertificateSelfManagedSslCertificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificateSelfManagedSslCertificate();
-      var od = api.SslCertificateSelfManagedSslCertificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificateSelfManagedSslCertificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificateSelfManagedSslCertificate(
           od as api.SslCertificateSelfManagedSslCertificate);
     });
@@ -43156,7 +44367,9 @@
   unittest.group('obj-schema-SslCertificatesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificatesScopedListWarningData();
-      var od = api.SslCertificatesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificatesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificatesScopedListWarningData(
           od as api.SslCertificatesScopedListWarningData);
     });
@@ -43165,7 +44378,9 @@
   unittest.group('obj-schema-SslCertificatesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificatesScopedListWarning();
-      var od = api.SslCertificatesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificatesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificatesScopedListWarning(
           od as api.SslCertificatesScopedListWarning);
     });
@@ -43174,7 +44389,9 @@
   unittest.group('obj-schema-SslCertificatesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertificatesScopedList();
-      var od = api.SslCertificatesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertificatesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertificatesScopedList(od as api.SslCertificatesScopedList);
     });
   });
@@ -43182,7 +44399,9 @@
   unittest.group('obj-schema-SslPoliciesListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslPoliciesListWarningData();
-      var od = api.SslPoliciesListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslPoliciesListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslPoliciesListWarningData(od as api.SslPoliciesListWarningData);
     });
   });
@@ -43190,7 +44409,9 @@
   unittest.group('obj-schema-SslPoliciesListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslPoliciesListWarning();
-      var od = api.SslPoliciesListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslPoliciesListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslPoliciesListWarning(od as api.SslPoliciesListWarning);
     });
   });
@@ -43198,7 +44419,9 @@
   unittest.group('obj-schema-SslPoliciesList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslPoliciesList();
-      var od = api.SslPoliciesList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslPoliciesList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslPoliciesList(od as api.SslPoliciesList);
     });
   });
@@ -43206,8 +44429,9 @@
   unittest.group('obj-schema-SslPoliciesListAvailableFeaturesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslPoliciesListAvailableFeaturesResponse();
-      var od =
-          api.SslPoliciesListAvailableFeaturesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslPoliciesListAvailableFeaturesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslPoliciesListAvailableFeaturesResponse(
           od as api.SslPoliciesListAvailableFeaturesResponse);
     });
@@ -43216,7 +44440,9 @@
   unittest.group('obj-schema-SslPolicyWarningsData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslPolicyWarningsData();
-      var od = api.SslPolicyWarningsData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslPolicyWarningsData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslPolicyWarningsData(od as api.SslPolicyWarningsData);
     });
   });
@@ -43224,7 +44450,9 @@
   unittest.group('obj-schema-SslPolicyWarnings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslPolicyWarnings();
-      var od = api.SslPolicyWarnings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslPolicyWarnings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslPolicyWarnings(od as api.SslPolicyWarnings);
     });
   });
@@ -43232,7 +44460,9 @@
   unittest.group('obj-schema-SslPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslPolicy();
-      var od = api.SslPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SslPolicy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSslPolicy(od as api.SslPolicy);
     });
   });
@@ -43240,7 +44470,9 @@
   unittest.group('obj-schema-SslPolicyReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslPolicyReference();
-      var od = api.SslPolicyReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslPolicyReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslPolicyReference(od as api.SslPolicyReference);
     });
   });
@@ -43248,7 +44480,9 @@
   unittest.group('obj-schema-StatefulPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatefulPolicy();
-      var od = api.StatefulPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StatefulPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStatefulPolicy(od as api.StatefulPolicy);
     });
   });
@@ -43256,7 +44490,9 @@
   unittest.group('obj-schema-StatefulPolicyPreservedState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatefulPolicyPreservedState();
-      var od = api.StatefulPolicyPreservedState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StatefulPolicyPreservedState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStatefulPolicyPreservedState(od as api.StatefulPolicyPreservedState);
     });
   });
@@ -43264,7 +44500,9 @@
   unittest.group('obj-schema-StatefulPolicyPreservedStateDiskDevice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatefulPolicyPreservedStateDiskDevice();
-      var od = api.StatefulPolicyPreservedStateDiskDevice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StatefulPolicyPreservedStateDiskDevice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStatefulPolicyPreservedStateDiskDevice(
           od as api.StatefulPolicyPreservedStateDiskDevice);
     });
@@ -43273,7 +44511,9 @@
   unittest.group('obj-schema-Subnetwork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetwork();
-      var od = api.Subnetwork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Subnetwork.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSubnetwork(od as api.Subnetwork);
     });
   });
@@ -43281,7 +44521,9 @@
   unittest.group('obj-schema-SubnetworkAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworkAggregatedListWarningData();
-      var od = api.SubnetworkAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworkAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworkAggregatedListWarningData(
           od as api.SubnetworkAggregatedListWarningData);
     });
@@ -43290,7 +44532,9 @@
   unittest.group('obj-schema-SubnetworkAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworkAggregatedListWarning();
-      var od = api.SubnetworkAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworkAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworkAggregatedListWarning(
           od as api.SubnetworkAggregatedListWarning);
     });
@@ -43299,7 +44543,9 @@
   unittest.group('obj-schema-SubnetworkAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworkAggregatedList();
-      var od = api.SubnetworkAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworkAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworkAggregatedList(od as api.SubnetworkAggregatedList);
     });
   });
@@ -43307,7 +44553,9 @@
   unittest.group('obj-schema-SubnetworkListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworkListWarningData();
-      var od = api.SubnetworkListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworkListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworkListWarningData(od as api.SubnetworkListWarningData);
     });
   });
@@ -43315,7 +44563,9 @@
   unittest.group('obj-schema-SubnetworkListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworkListWarning();
-      var od = api.SubnetworkListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworkListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworkListWarning(od as api.SubnetworkListWarning);
     });
   });
@@ -43323,7 +44573,9 @@
   unittest.group('obj-schema-SubnetworkList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworkList();
-      var od = api.SubnetworkList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworkList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworkList(od as api.SubnetworkList);
     });
   });
@@ -43331,7 +44583,9 @@
   unittest.group('obj-schema-SubnetworkLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworkLogConfig();
-      var od = api.SubnetworkLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworkLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworkLogConfig(od as api.SubnetworkLogConfig);
     });
   });
@@ -43339,7 +44593,9 @@
   unittest.group('obj-schema-SubnetworkSecondaryRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworkSecondaryRange();
-      var od = api.SubnetworkSecondaryRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworkSecondaryRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworkSecondaryRange(od as api.SubnetworkSecondaryRange);
     });
   });
@@ -43347,7 +44603,9 @@
   unittest.group('obj-schema-SubnetworksExpandIpCidrRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworksExpandIpCidrRangeRequest();
-      var od = api.SubnetworksExpandIpCidrRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworksExpandIpCidrRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworksExpandIpCidrRangeRequest(
           od as api.SubnetworksExpandIpCidrRangeRequest);
     });
@@ -43356,7 +44614,9 @@
   unittest.group('obj-schema-SubnetworksScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworksScopedListWarningData();
-      var od = api.SubnetworksScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworksScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworksScopedListWarningData(
           od as api.SubnetworksScopedListWarningData);
     });
@@ -43365,7 +44625,9 @@
   unittest.group('obj-schema-SubnetworksScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworksScopedListWarning();
-      var od = api.SubnetworksScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworksScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworksScopedListWarning(od as api.SubnetworksScopedListWarning);
     });
   });
@@ -43373,7 +44635,9 @@
   unittest.group('obj-schema-SubnetworksScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworksScopedList();
-      var od = api.SubnetworksScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworksScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworksScopedList(od as api.SubnetworksScopedList);
     });
   });
@@ -43381,8 +44645,9 @@
   unittest.group('obj-schema-SubnetworksSetPrivateIpGoogleAccessRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetworksSetPrivateIpGoogleAccessRequest();
-      var od =
-          api.SubnetworksSetPrivateIpGoogleAccessRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubnetworksSetPrivateIpGoogleAccessRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubnetworksSetPrivateIpGoogleAccessRequest(
           od as api.SubnetworksSetPrivateIpGoogleAccessRequest);
     });
@@ -43391,7 +44656,9 @@
   unittest.group('obj-schema-TCPHealthCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTCPHealthCheck();
-      var od = api.TCPHealthCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TCPHealthCheck.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTCPHealthCheck(od as api.TCPHealthCheck);
     });
   });
@@ -43399,7 +44666,8 @@
   unittest.group('obj-schema-Tags', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTags();
-      var od = api.Tags.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Tags.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTags(od as api.Tags);
     });
   });
@@ -43407,7 +44675,9 @@
   unittest.group('obj-schema-TargetGrpcProxy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetGrpcProxy();
-      var od = api.TargetGrpcProxy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetGrpcProxy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetGrpcProxy(od as api.TargetGrpcProxy);
     });
   });
@@ -43415,7 +44685,9 @@
   unittest.group('obj-schema-TargetGrpcProxyListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetGrpcProxyListWarningData();
-      var od = api.TargetGrpcProxyListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetGrpcProxyListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetGrpcProxyListWarningData(
           od as api.TargetGrpcProxyListWarningData);
     });
@@ -43424,7 +44696,9 @@
   unittest.group('obj-schema-TargetGrpcProxyListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetGrpcProxyListWarning();
-      var od = api.TargetGrpcProxyListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetGrpcProxyListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetGrpcProxyListWarning(od as api.TargetGrpcProxyListWarning);
     });
   });
@@ -43432,7 +44706,9 @@
   unittest.group('obj-schema-TargetGrpcProxyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetGrpcProxyList();
-      var od = api.TargetGrpcProxyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetGrpcProxyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetGrpcProxyList(od as api.TargetGrpcProxyList);
     });
   });
@@ -43440,7 +44716,9 @@
   unittest.group('obj-schema-TargetHttpProxiesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpProxiesScopedListWarningData();
-      var od = api.TargetHttpProxiesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpProxiesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpProxiesScopedListWarningData(
           od as api.TargetHttpProxiesScopedListWarningData);
     });
@@ -43449,7 +44727,9 @@
   unittest.group('obj-schema-TargetHttpProxiesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpProxiesScopedListWarning();
-      var od = api.TargetHttpProxiesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpProxiesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpProxiesScopedListWarning(
           od as api.TargetHttpProxiesScopedListWarning);
     });
@@ -43458,7 +44738,9 @@
   unittest.group('obj-schema-TargetHttpProxiesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpProxiesScopedList();
-      var od = api.TargetHttpProxiesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpProxiesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpProxiesScopedList(od as api.TargetHttpProxiesScopedList);
     });
   });
@@ -43466,7 +44748,9 @@
   unittest.group('obj-schema-TargetHttpProxy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpProxy();
-      var od = api.TargetHttpProxy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpProxy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpProxy(od as api.TargetHttpProxy);
     });
   });
@@ -43474,7 +44758,9 @@
   unittest.group('obj-schema-TargetHttpProxyAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpProxyAggregatedList();
-      var od = api.TargetHttpProxyAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpProxyAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpProxyAggregatedList(
           od as api.TargetHttpProxyAggregatedList);
     });
@@ -43483,7 +44769,9 @@
   unittest.group('obj-schema-TargetHttpProxyListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpProxyListWarningData();
-      var od = api.TargetHttpProxyListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpProxyListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpProxyListWarningData(
           od as api.TargetHttpProxyListWarningData);
     });
@@ -43492,7 +44780,9 @@
   unittest.group('obj-schema-TargetHttpProxyListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpProxyListWarning();
-      var od = api.TargetHttpProxyListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpProxyListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpProxyListWarning(od as api.TargetHttpProxyListWarning);
     });
   });
@@ -43500,7 +44790,9 @@
   unittest.group('obj-schema-TargetHttpProxyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpProxyList();
-      var od = api.TargetHttpProxyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpProxyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpProxyList(od as api.TargetHttpProxyList);
     });
   });
@@ -43508,7 +44800,9 @@
   unittest.group('obj-schema-TargetHttpsProxiesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxiesScopedListWarningData();
-      var od = api.TargetHttpsProxiesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxiesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxiesScopedListWarningData(
           od as api.TargetHttpsProxiesScopedListWarningData);
     });
@@ -43517,7 +44811,9 @@
   unittest.group('obj-schema-TargetHttpsProxiesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxiesScopedListWarning();
-      var od = api.TargetHttpsProxiesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxiesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxiesScopedListWarning(
           od as api.TargetHttpsProxiesScopedListWarning);
     });
@@ -43526,7 +44822,9 @@
   unittest.group('obj-schema-TargetHttpsProxiesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxiesScopedList();
-      var od = api.TargetHttpsProxiesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxiesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxiesScopedList(od as api.TargetHttpsProxiesScopedList);
     });
   });
@@ -43534,8 +44832,9 @@
   unittest.group('obj-schema-TargetHttpsProxiesSetQuicOverrideRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxiesSetQuicOverrideRequest();
-      var od =
-          api.TargetHttpsProxiesSetQuicOverrideRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxiesSetQuicOverrideRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxiesSetQuicOverrideRequest(
           od as api.TargetHttpsProxiesSetQuicOverrideRequest);
     });
@@ -43544,8 +44843,9 @@
   unittest.group('obj-schema-TargetHttpsProxiesSetSslCertificatesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxiesSetSslCertificatesRequest();
-      var od =
-          api.TargetHttpsProxiesSetSslCertificatesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxiesSetSslCertificatesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxiesSetSslCertificatesRequest(
           od as api.TargetHttpsProxiesSetSslCertificatesRequest);
     });
@@ -43554,7 +44854,9 @@
   unittest.group('obj-schema-TargetHttpsProxy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxy();
-      var od = api.TargetHttpsProxy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxy(od as api.TargetHttpsProxy);
     });
   });
@@ -43562,8 +44864,9 @@
   unittest.group('obj-schema-TargetHttpsProxyAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxyAggregatedListWarningData();
-      var od =
-          api.TargetHttpsProxyAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxyAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxyAggregatedListWarningData(
           od as api.TargetHttpsProxyAggregatedListWarningData);
     });
@@ -43572,7 +44875,9 @@
   unittest.group('obj-schema-TargetHttpsProxyAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxyAggregatedListWarning();
-      var od = api.TargetHttpsProxyAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxyAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxyAggregatedListWarning(
           od as api.TargetHttpsProxyAggregatedListWarning);
     });
@@ -43581,7 +44886,9 @@
   unittest.group('obj-schema-TargetHttpsProxyAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxyAggregatedList();
-      var od = api.TargetHttpsProxyAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxyAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxyAggregatedList(
           od as api.TargetHttpsProxyAggregatedList);
     });
@@ -43590,7 +44897,9 @@
   unittest.group('obj-schema-TargetHttpsProxyListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxyListWarningData();
-      var od = api.TargetHttpsProxyListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxyListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxyListWarningData(
           od as api.TargetHttpsProxyListWarningData);
     });
@@ -43599,7 +44908,9 @@
   unittest.group('obj-schema-TargetHttpsProxyListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxyListWarning();
-      var od = api.TargetHttpsProxyListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxyListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxyListWarning(od as api.TargetHttpsProxyListWarning);
     });
   });
@@ -43607,7 +44918,9 @@
   unittest.group('obj-schema-TargetHttpsProxyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetHttpsProxyList();
-      var od = api.TargetHttpsProxyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetHttpsProxyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetHttpsProxyList(od as api.TargetHttpsProxyList);
     });
   });
@@ -43615,7 +44928,9 @@
   unittest.group('obj-schema-TargetInstance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetInstance();
-      var od = api.TargetInstance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetInstance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetInstance(od as api.TargetInstance);
     });
   });
@@ -43623,7 +44938,9 @@
   unittest.group('obj-schema-TargetInstanceAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetInstanceAggregatedListWarningData();
-      var od = api.TargetInstanceAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetInstanceAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetInstanceAggregatedListWarningData(
           od as api.TargetInstanceAggregatedListWarningData);
     });
@@ -43632,7 +44949,9 @@
   unittest.group('obj-schema-TargetInstanceAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetInstanceAggregatedListWarning();
-      var od = api.TargetInstanceAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetInstanceAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetInstanceAggregatedListWarning(
           od as api.TargetInstanceAggregatedListWarning);
     });
@@ -43641,7 +44960,9 @@
   unittest.group('obj-schema-TargetInstanceAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetInstanceAggregatedList();
-      var od = api.TargetInstanceAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetInstanceAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetInstanceAggregatedList(od as api.TargetInstanceAggregatedList);
     });
   });
@@ -43649,7 +44970,9 @@
   unittest.group('obj-schema-TargetInstanceListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetInstanceListWarningData();
-      var od = api.TargetInstanceListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetInstanceListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetInstanceListWarningData(
           od as api.TargetInstanceListWarningData);
     });
@@ -43658,7 +44981,9 @@
   unittest.group('obj-schema-TargetInstanceListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetInstanceListWarning();
-      var od = api.TargetInstanceListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetInstanceListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetInstanceListWarning(od as api.TargetInstanceListWarning);
     });
   });
@@ -43666,7 +44991,9 @@
   unittest.group('obj-schema-TargetInstanceList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetInstanceList();
-      var od = api.TargetInstanceList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetInstanceList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetInstanceList(od as api.TargetInstanceList);
     });
   });
@@ -43674,7 +45001,9 @@
   unittest.group('obj-schema-TargetInstancesScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetInstancesScopedListWarningData();
-      var od = api.TargetInstancesScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetInstancesScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetInstancesScopedListWarningData(
           od as api.TargetInstancesScopedListWarningData);
     });
@@ -43683,7 +45012,9 @@
   unittest.group('obj-schema-TargetInstancesScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetInstancesScopedListWarning();
-      var od = api.TargetInstancesScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetInstancesScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetInstancesScopedListWarning(
           od as api.TargetInstancesScopedListWarning);
     });
@@ -43692,7 +45023,9 @@
   unittest.group('obj-schema-TargetInstancesScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetInstancesScopedList();
-      var od = api.TargetInstancesScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetInstancesScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetInstancesScopedList(od as api.TargetInstancesScopedList);
     });
   });
@@ -43700,7 +45033,9 @@
   unittest.group('obj-schema-TargetPool', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPool();
-      var od = api.TargetPool.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TargetPool.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTargetPool(od as api.TargetPool);
     });
   });
@@ -43708,7 +45043,9 @@
   unittest.group('obj-schema-TargetPoolAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolAggregatedListWarningData();
-      var od = api.TargetPoolAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolAggregatedListWarningData(
           od as api.TargetPoolAggregatedListWarningData);
     });
@@ -43717,7 +45054,9 @@
   unittest.group('obj-schema-TargetPoolAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolAggregatedListWarning();
-      var od = api.TargetPoolAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolAggregatedListWarning(
           od as api.TargetPoolAggregatedListWarning);
     });
@@ -43726,7 +45065,9 @@
   unittest.group('obj-schema-TargetPoolAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolAggregatedList();
-      var od = api.TargetPoolAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolAggregatedList(od as api.TargetPoolAggregatedList);
     });
   });
@@ -43734,7 +45075,9 @@
   unittest.group('obj-schema-TargetPoolInstanceHealth', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolInstanceHealth();
-      var od = api.TargetPoolInstanceHealth.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolInstanceHealth.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolInstanceHealth(od as api.TargetPoolInstanceHealth);
     });
   });
@@ -43742,7 +45085,9 @@
   unittest.group('obj-schema-TargetPoolListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolListWarningData();
-      var od = api.TargetPoolListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolListWarningData(od as api.TargetPoolListWarningData);
     });
   });
@@ -43750,7 +45095,9 @@
   unittest.group('obj-schema-TargetPoolListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolListWarning();
-      var od = api.TargetPoolListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolListWarning(od as api.TargetPoolListWarning);
     });
   });
@@ -43758,7 +45105,9 @@
   unittest.group('obj-schema-TargetPoolList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolList();
-      var od = api.TargetPoolList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolList(od as api.TargetPoolList);
     });
   });
@@ -43766,7 +45115,9 @@
   unittest.group('obj-schema-TargetPoolsAddHealthCheckRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolsAddHealthCheckRequest();
-      var od = api.TargetPoolsAddHealthCheckRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolsAddHealthCheckRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolsAddHealthCheckRequest(
           od as api.TargetPoolsAddHealthCheckRequest);
     });
@@ -43775,7 +45126,9 @@
   unittest.group('obj-schema-TargetPoolsAddInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolsAddInstanceRequest();
-      var od = api.TargetPoolsAddInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolsAddInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolsAddInstanceRequest(
           od as api.TargetPoolsAddInstanceRequest);
     });
@@ -43784,7 +45137,9 @@
   unittest.group('obj-schema-TargetPoolsRemoveHealthCheckRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolsRemoveHealthCheckRequest();
-      var od = api.TargetPoolsRemoveHealthCheckRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolsRemoveHealthCheckRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolsRemoveHealthCheckRequest(
           od as api.TargetPoolsRemoveHealthCheckRequest);
     });
@@ -43793,7 +45148,9 @@
   unittest.group('obj-schema-TargetPoolsRemoveInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolsRemoveInstanceRequest();
-      var od = api.TargetPoolsRemoveInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolsRemoveInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolsRemoveInstanceRequest(
           od as api.TargetPoolsRemoveInstanceRequest);
     });
@@ -43802,7 +45159,9 @@
   unittest.group('obj-schema-TargetPoolsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolsScopedListWarningData();
-      var od = api.TargetPoolsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolsScopedListWarningData(
           od as api.TargetPoolsScopedListWarningData);
     });
@@ -43811,7 +45170,9 @@
   unittest.group('obj-schema-TargetPoolsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolsScopedListWarning();
-      var od = api.TargetPoolsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolsScopedListWarning(od as api.TargetPoolsScopedListWarning);
     });
   });
@@ -43819,7 +45180,9 @@
   unittest.group('obj-schema-TargetPoolsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetPoolsScopedList();
-      var od = api.TargetPoolsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetPoolsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetPoolsScopedList(od as api.TargetPoolsScopedList);
     });
   });
@@ -43827,7 +45190,9 @@
   unittest.group('obj-schema-TargetReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetReference();
-      var od = api.TargetReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetReference(od as api.TargetReference);
     });
   });
@@ -43835,8 +45200,9 @@
   unittest.group('obj-schema-TargetSslProxiesSetBackendServiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetSslProxiesSetBackendServiceRequest();
-      var od =
-          api.TargetSslProxiesSetBackendServiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetSslProxiesSetBackendServiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetSslProxiesSetBackendServiceRequest(
           od as api.TargetSslProxiesSetBackendServiceRequest);
     });
@@ -43845,7 +45211,9 @@
   unittest.group('obj-schema-TargetSslProxiesSetProxyHeaderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetSslProxiesSetProxyHeaderRequest();
-      var od = api.TargetSslProxiesSetProxyHeaderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetSslProxiesSetProxyHeaderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetSslProxiesSetProxyHeaderRequest(
           od as api.TargetSslProxiesSetProxyHeaderRequest);
     });
@@ -43854,8 +45222,9 @@
   unittest.group('obj-schema-TargetSslProxiesSetSslCertificatesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetSslProxiesSetSslCertificatesRequest();
-      var od =
-          api.TargetSslProxiesSetSslCertificatesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetSslProxiesSetSslCertificatesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetSslProxiesSetSslCertificatesRequest(
           od as api.TargetSslProxiesSetSslCertificatesRequest);
     });
@@ -43864,7 +45233,9 @@
   unittest.group('obj-schema-TargetSslProxy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetSslProxy();
-      var od = api.TargetSslProxy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetSslProxy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetSslProxy(od as api.TargetSslProxy);
     });
   });
@@ -43872,7 +45243,9 @@
   unittest.group('obj-schema-TargetSslProxyListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetSslProxyListWarningData();
-      var od = api.TargetSslProxyListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetSslProxyListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetSslProxyListWarningData(
           od as api.TargetSslProxyListWarningData);
     });
@@ -43881,7 +45254,9 @@
   unittest.group('obj-schema-TargetSslProxyListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetSslProxyListWarning();
-      var od = api.TargetSslProxyListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetSslProxyListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetSslProxyListWarning(od as api.TargetSslProxyListWarning);
     });
   });
@@ -43889,7 +45264,9 @@
   unittest.group('obj-schema-TargetSslProxyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetSslProxyList();
-      var od = api.TargetSslProxyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetSslProxyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetSslProxyList(od as api.TargetSslProxyList);
     });
   });
@@ -43897,8 +45274,9 @@
   unittest.group('obj-schema-TargetTcpProxiesSetBackendServiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetTcpProxiesSetBackendServiceRequest();
-      var od =
-          api.TargetTcpProxiesSetBackendServiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetTcpProxiesSetBackendServiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetTcpProxiesSetBackendServiceRequest(
           od as api.TargetTcpProxiesSetBackendServiceRequest);
     });
@@ -43907,7 +45285,9 @@
   unittest.group('obj-schema-TargetTcpProxiesSetProxyHeaderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetTcpProxiesSetProxyHeaderRequest();
-      var od = api.TargetTcpProxiesSetProxyHeaderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetTcpProxiesSetProxyHeaderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetTcpProxiesSetProxyHeaderRequest(
           od as api.TargetTcpProxiesSetProxyHeaderRequest);
     });
@@ -43916,7 +45296,9 @@
   unittest.group('obj-schema-TargetTcpProxy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetTcpProxy();
-      var od = api.TargetTcpProxy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetTcpProxy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetTcpProxy(od as api.TargetTcpProxy);
     });
   });
@@ -43924,7 +45306,9 @@
   unittest.group('obj-schema-TargetTcpProxyListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetTcpProxyListWarningData();
-      var od = api.TargetTcpProxyListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetTcpProxyListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetTcpProxyListWarningData(
           od as api.TargetTcpProxyListWarningData);
     });
@@ -43933,7 +45317,9 @@
   unittest.group('obj-schema-TargetTcpProxyListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetTcpProxyListWarning();
-      var od = api.TargetTcpProxyListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetTcpProxyListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetTcpProxyListWarning(od as api.TargetTcpProxyListWarning);
     });
   });
@@ -43941,7 +45327,9 @@
   unittest.group('obj-schema-TargetTcpProxyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetTcpProxyList();
-      var od = api.TargetTcpProxyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetTcpProxyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetTcpProxyList(od as api.TargetTcpProxyList);
     });
   });
@@ -43949,7 +45337,9 @@
   unittest.group('obj-schema-TargetVpnGateway', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetVpnGateway();
-      var od = api.TargetVpnGateway.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetVpnGateway.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetVpnGateway(od as api.TargetVpnGateway);
     });
   });
@@ -43957,8 +45347,9 @@
   unittest.group('obj-schema-TargetVpnGatewayAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetVpnGatewayAggregatedListWarningData();
-      var od =
-          api.TargetVpnGatewayAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetVpnGatewayAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetVpnGatewayAggregatedListWarningData(
           od as api.TargetVpnGatewayAggregatedListWarningData);
     });
@@ -43967,7 +45358,9 @@
   unittest.group('obj-schema-TargetVpnGatewayAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetVpnGatewayAggregatedListWarning();
-      var od = api.TargetVpnGatewayAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetVpnGatewayAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetVpnGatewayAggregatedListWarning(
           od as api.TargetVpnGatewayAggregatedListWarning);
     });
@@ -43976,7 +45369,9 @@
   unittest.group('obj-schema-TargetVpnGatewayAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetVpnGatewayAggregatedList();
-      var od = api.TargetVpnGatewayAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetVpnGatewayAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetVpnGatewayAggregatedList(
           od as api.TargetVpnGatewayAggregatedList);
     });
@@ -43985,7 +45380,9 @@
   unittest.group('obj-schema-TargetVpnGatewayListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetVpnGatewayListWarningData();
-      var od = api.TargetVpnGatewayListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetVpnGatewayListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetVpnGatewayListWarningData(
           od as api.TargetVpnGatewayListWarningData);
     });
@@ -43994,7 +45391,9 @@
   unittest.group('obj-schema-TargetVpnGatewayListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetVpnGatewayListWarning();
-      var od = api.TargetVpnGatewayListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetVpnGatewayListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetVpnGatewayListWarning(od as api.TargetVpnGatewayListWarning);
     });
   });
@@ -44002,7 +45401,9 @@
   unittest.group('obj-schema-TargetVpnGatewayList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetVpnGatewayList();
-      var od = api.TargetVpnGatewayList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetVpnGatewayList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetVpnGatewayList(od as api.TargetVpnGatewayList);
     });
   });
@@ -44010,7 +45411,9 @@
   unittest.group('obj-schema-TargetVpnGatewaysScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetVpnGatewaysScopedListWarningData();
-      var od = api.TargetVpnGatewaysScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetVpnGatewaysScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetVpnGatewaysScopedListWarningData(
           od as api.TargetVpnGatewaysScopedListWarningData);
     });
@@ -44019,7 +45422,9 @@
   unittest.group('obj-schema-TargetVpnGatewaysScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetVpnGatewaysScopedListWarning();
-      var od = api.TargetVpnGatewaysScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetVpnGatewaysScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetVpnGatewaysScopedListWarning(
           od as api.TargetVpnGatewaysScopedListWarning);
     });
@@ -44028,7 +45433,9 @@
   unittest.group('obj-schema-TargetVpnGatewaysScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetVpnGatewaysScopedList();
-      var od = api.TargetVpnGatewaysScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetVpnGatewaysScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetVpnGatewaysScopedList(od as api.TargetVpnGatewaysScopedList);
     });
   });
@@ -44036,7 +45443,9 @@
   unittest.group('obj-schema-TestFailure', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestFailure();
-      var od = api.TestFailure.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestFailure.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestFailure(od as api.TestFailure);
     });
   });
@@ -44044,7 +45453,9 @@
   unittest.group('obj-schema-TestPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestPermissionsRequest();
-      var od = api.TestPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestPermissionsRequest(od as api.TestPermissionsRequest);
     });
   });
@@ -44052,7 +45463,9 @@
   unittest.group('obj-schema-TestPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestPermissionsResponse();
-      var od = api.TestPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestPermissionsResponse(od as api.TestPermissionsResponse);
     });
   });
@@ -44060,7 +45473,9 @@
   unittest.group('obj-schema-UrlMap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMap();
-      var od = api.UrlMap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UrlMap.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUrlMap(od as api.UrlMap);
     });
   });
@@ -44068,7 +45483,9 @@
   unittest.group('obj-schema-UrlMapListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapListWarningData();
-      var od = api.UrlMapListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapListWarningData(od as api.UrlMapListWarningData);
     });
   });
@@ -44076,7 +45493,9 @@
   unittest.group('obj-schema-UrlMapListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapListWarning();
-      var od = api.UrlMapListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapListWarning(od as api.UrlMapListWarning);
     });
   });
@@ -44084,7 +45503,9 @@
   unittest.group('obj-schema-UrlMapList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapList();
-      var od = api.UrlMapList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UrlMapList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapList(od as api.UrlMapList);
     });
   });
@@ -44092,7 +45513,9 @@
   unittest.group('obj-schema-UrlMapReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapReference();
-      var od = api.UrlMapReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapReference(od as api.UrlMapReference);
     });
   });
@@ -44100,7 +45523,9 @@
   unittest.group('obj-schema-UrlMapTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapTest();
-      var od = api.UrlMapTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UrlMapTest.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapTest(od as api.UrlMapTest);
     });
   });
@@ -44108,7 +45533,9 @@
   unittest.group('obj-schema-UrlMapTestHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapTestHeader();
-      var od = api.UrlMapTestHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapTestHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapTestHeader(od as api.UrlMapTestHeader);
     });
   });
@@ -44116,7 +45543,9 @@
   unittest.group('obj-schema-UrlMapValidationResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapValidationResult();
-      var od = api.UrlMapValidationResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapValidationResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapValidationResult(od as api.UrlMapValidationResult);
     });
   });
@@ -44124,7 +45553,9 @@
   unittest.group('obj-schema-UrlMapsAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapsAggregatedListWarningData();
-      var od = api.UrlMapsAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapsAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapsAggregatedListWarningData(
           od as api.UrlMapsAggregatedListWarningData);
     });
@@ -44133,7 +45564,9 @@
   unittest.group('obj-schema-UrlMapsAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapsAggregatedListWarning();
-      var od = api.UrlMapsAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapsAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapsAggregatedListWarning(od as api.UrlMapsAggregatedListWarning);
     });
   });
@@ -44141,7 +45574,9 @@
   unittest.group('obj-schema-UrlMapsAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapsAggregatedList();
-      var od = api.UrlMapsAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapsAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapsAggregatedList(od as api.UrlMapsAggregatedList);
     });
   });
@@ -44149,7 +45584,9 @@
   unittest.group('obj-schema-UrlMapsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapsScopedListWarningData();
-      var od = api.UrlMapsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapsScopedListWarningData(od as api.UrlMapsScopedListWarningData);
     });
   });
@@ -44157,7 +45594,9 @@
   unittest.group('obj-schema-UrlMapsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapsScopedListWarning();
-      var od = api.UrlMapsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapsScopedListWarning(od as api.UrlMapsScopedListWarning);
     });
   });
@@ -44165,7 +45604,9 @@
   unittest.group('obj-schema-UrlMapsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapsScopedList();
-      var od = api.UrlMapsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapsScopedList(od as api.UrlMapsScopedList);
     });
   });
@@ -44173,7 +45614,9 @@
   unittest.group('obj-schema-UrlMapsValidateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapsValidateRequest();
-      var od = api.UrlMapsValidateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapsValidateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapsValidateRequest(od as api.UrlMapsValidateRequest);
     });
   });
@@ -44181,7 +45624,9 @@
   unittest.group('obj-schema-UrlMapsValidateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlMapsValidateResponse();
-      var od = api.UrlMapsValidateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlMapsValidateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlMapsValidateResponse(od as api.UrlMapsValidateResponse);
     });
   });
@@ -44189,7 +45634,9 @@
   unittest.group('obj-schema-UrlRewrite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlRewrite();
-      var od = api.UrlRewrite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UrlRewrite.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUrlRewrite(od as api.UrlRewrite);
     });
   });
@@ -44197,7 +45644,9 @@
   unittest.group('obj-schema-UsableSubnetwork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsableSubnetwork();
-      var od = api.UsableSubnetwork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsableSubnetwork.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsableSubnetwork(od as api.UsableSubnetwork);
     });
   });
@@ -44205,7 +45654,9 @@
   unittest.group('obj-schema-UsableSubnetworkSecondaryRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsableSubnetworkSecondaryRange();
-      var od = api.UsableSubnetworkSecondaryRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsableSubnetworkSecondaryRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsableSubnetworkSecondaryRange(
           od as api.UsableSubnetworkSecondaryRange);
     });
@@ -44214,8 +45665,9 @@
   unittest.group('obj-schema-UsableSubnetworksAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsableSubnetworksAggregatedListWarningData();
-      var od =
-          api.UsableSubnetworksAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsableSubnetworksAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsableSubnetworksAggregatedListWarningData(
           od as api.UsableSubnetworksAggregatedListWarningData);
     });
@@ -44224,7 +45676,9 @@
   unittest.group('obj-schema-UsableSubnetworksAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsableSubnetworksAggregatedListWarning();
-      var od = api.UsableSubnetworksAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsableSubnetworksAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsableSubnetworksAggregatedListWarning(
           od as api.UsableSubnetworksAggregatedListWarning);
     });
@@ -44233,7 +45687,9 @@
   unittest.group('obj-schema-UsableSubnetworksAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsableSubnetworksAggregatedList();
-      var od = api.UsableSubnetworksAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsableSubnetworksAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsableSubnetworksAggregatedList(
           od as api.UsableSubnetworksAggregatedList);
     });
@@ -44242,7 +45698,9 @@
   unittest.group('obj-schema-UsageExportLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageExportLocation();
-      var od = api.UsageExportLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsageExportLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsageExportLocation(od as api.UsageExportLocation);
     });
   });
@@ -44250,7 +45708,9 @@
   unittest.group('obj-schema-VmEndpointNatMappings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVmEndpointNatMappings();
-      var od = api.VmEndpointNatMappings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VmEndpointNatMappings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVmEndpointNatMappings(od as api.VmEndpointNatMappings);
     });
   });
@@ -44258,8 +45718,9 @@
   unittest.group('obj-schema-VmEndpointNatMappingsInterfaceNatMappings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVmEndpointNatMappingsInterfaceNatMappings();
-      var od =
-          api.VmEndpointNatMappingsInterfaceNatMappings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VmEndpointNatMappingsInterfaceNatMappings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVmEndpointNatMappingsInterfaceNatMappings(
           od as api.VmEndpointNatMappingsInterfaceNatMappings);
     });
@@ -44268,7 +45729,9 @@
   unittest.group('obj-schema-VmEndpointNatMappingsListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVmEndpointNatMappingsListWarningData();
-      var od = api.VmEndpointNatMappingsListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VmEndpointNatMappingsListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVmEndpointNatMappingsListWarningData(
           od as api.VmEndpointNatMappingsListWarningData);
     });
@@ -44277,7 +45740,9 @@
   unittest.group('obj-schema-VmEndpointNatMappingsListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVmEndpointNatMappingsListWarning();
-      var od = api.VmEndpointNatMappingsListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VmEndpointNatMappingsListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVmEndpointNatMappingsListWarning(
           od as api.VmEndpointNatMappingsListWarning);
     });
@@ -44286,7 +45751,9 @@
   unittest.group('obj-schema-VmEndpointNatMappingsList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVmEndpointNatMappingsList();
-      var od = api.VmEndpointNatMappingsList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VmEndpointNatMappingsList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVmEndpointNatMappingsList(od as api.VmEndpointNatMappingsList);
     });
   });
@@ -44294,7 +45761,9 @@
   unittest.group('obj-schema-VpnGateway', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGateway();
-      var od = api.VpnGateway.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.VpnGateway.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVpnGateway(od as api.VpnGateway);
     });
   });
@@ -44302,7 +45771,9 @@
   unittest.group('obj-schema-VpnGatewayAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayAggregatedListWarningData();
-      var od = api.VpnGatewayAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayAggregatedListWarningData(
           od as api.VpnGatewayAggregatedListWarningData);
     });
@@ -44311,7 +45782,9 @@
   unittest.group('obj-schema-VpnGatewayAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayAggregatedListWarning();
-      var od = api.VpnGatewayAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayAggregatedListWarning(
           od as api.VpnGatewayAggregatedListWarning);
     });
@@ -44320,7 +45793,9 @@
   unittest.group('obj-schema-VpnGatewayAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayAggregatedList();
-      var od = api.VpnGatewayAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayAggregatedList(od as api.VpnGatewayAggregatedList);
     });
   });
@@ -44328,7 +45803,9 @@
   unittest.group('obj-schema-VpnGatewayListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayListWarningData();
-      var od = api.VpnGatewayListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayListWarningData(od as api.VpnGatewayListWarningData);
     });
   });
@@ -44336,7 +45813,9 @@
   unittest.group('obj-schema-VpnGatewayListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayListWarning();
-      var od = api.VpnGatewayListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayListWarning(od as api.VpnGatewayListWarning);
     });
   });
@@ -44344,7 +45823,9 @@
   unittest.group('obj-schema-VpnGatewayList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayList();
-      var od = api.VpnGatewayList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayList(od as api.VpnGatewayList);
     });
   });
@@ -44352,7 +45833,9 @@
   unittest.group('obj-schema-VpnGatewayStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayStatus();
-      var od = api.VpnGatewayStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayStatus(od as api.VpnGatewayStatus);
     });
   });
@@ -44361,8 +45844,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayStatusHighAvailabilityRequirementState();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.VpnGatewayStatusHighAvailabilityRequirementState.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayStatusHighAvailabilityRequirementState(
           od as api.VpnGatewayStatusHighAvailabilityRequirementState);
     });
@@ -44371,7 +45855,9 @@
   unittest.group('obj-schema-VpnGatewayStatusTunnel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayStatusTunnel();
-      var od = api.VpnGatewayStatusTunnel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayStatusTunnel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayStatusTunnel(od as api.VpnGatewayStatusTunnel);
     });
   });
@@ -44379,7 +45865,9 @@
   unittest.group('obj-schema-VpnGatewayStatusVpnConnection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayStatusVpnConnection();
-      var od = api.VpnGatewayStatusVpnConnection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayStatusVpnConnection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayStatusVpnConnection(
           od as api.VpnGatewayStatusVpnConnection);
     });
@@ -44388,7 +45876,9 @@
   unittest.group('obj-schema-VpnGatewayVpnGatewayInterface', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayVpnGatewayInterface();
-      var od = api.VpnGatewayVpnGatewayInterface.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayVpnGatewayInterface.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayVpnGatewayInterface(
           od as api.VpnGatewayVpnGatewayInterface);
     });
@@ -44397,7 +45887,9 @@
   unittest.group('obj-schema-VpnGatewaysGetStatusResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewaysGetStatusResponse();
-      var od = api.VpnGatewaysGetStatusResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewaysGetStatusResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewaysGetStatusResponse(od as api.VpnGatewaysGetStatusResponse);
     });
   });
@@ -44405,7 +45897,9 @@
   unittest.group('obj-schema-VpnGatewaysScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewaysScopedListWarningData();
-      var od = api.VpnGatewaysScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewaysScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewaysScopedListWarningData(
           od as api.VpnGatewaysScopedListWarningData);
     });
@@ -44414,7 +45908,9 @@
   unittest.group('obj-schema-VpnGatewaysScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewaysScopedListWarning();
-      var od = api.VpnGatewaysScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewaysScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewaysScopedListWarning(od as api.VpnGatewaysScopedListWarning);
     });
   });
@@ -44422,7 +45918,9 @@
   unittest.group('obj-schema-VpnGatewaysScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewaysScopedList();
-      var od = api.VpnGatewaysScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewaysScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewaysScopedList(od as api.VpnGatewaysScopedList);
     });
   });
@@ -44430,7 +45928,9 @@
   unittest.group('obj-schema-VpnTunnel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnel();
-      var od = api.VpnTunnel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.VpnTunnel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnel(od as api.VpnTunnel);
     });
   });
@@ -44438,7 +45938,9 @@
   unittest.group('obj-schema-VpnTunnelAggregatedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnelAggregatedListWarningData();
-      var od = api.VpnTunnelAggregatedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnTunnelAggregatedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnelAggregatedListWarningData(
           od as api.VpnTunnelAggregatedListWarningData);
     });
@@ -44447,7 +45949,9 @@
   unittest.group('obj-schema-VpnTunnelAggregatedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnelAggregatedListWarning();
-      var od = api.VpnTunnelAggregatedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnTunnelAggregatedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnelAggregatedListWarning(
           od as api.VpnTunnelAggregatedListWarning);
     });
@@ -44456,7 +45960,9 @@
   unittest.group('obj-schema-VpnTunnelAggregatedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnelAggregatedList();
-      var od = api.VpnTunnelAggregatedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnTunnelAggregatedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnelAggregatedList(od as api.VpnTunnelAggregatedList);
     });
   });
@@ -44464,7 +45970,9 @@
   unittest.group('obj-schema-VpnTunnelListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnelListWarningData();
-      var od = api.VpnTunnelListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnTunnelListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnelListWarningData(od as api.VpnTunnelListWarningData);
     });
   });
@@ -44472,7 +45980,9 @@
   unittest.group('obj-schema-VpnTunnelListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnelListWarning();
-      var od = api.VpnTunnelListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnTunnelListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnelListWarning(od as api.VpnTunnelListWarning);
     });
   });
@@ -44480,7 +45990,9 @@
   unittest.group('obj-schema-VpnTunnelList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnelList();
-      var od = api.VpnTunnelList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnTunnelList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnelList(od as api.VpnTunnelList);
     });
   });
@@ -44488,7 +46000,9 @@
   unittest.group('obj-schema-VpnTunnelsScopedListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnelsScopedListWarningData();
-      var od = api.VpnTunnelsScopedListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnTunnelsScopedListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnelsScopedListWarningData(
           od as api.VpnTunnelsScopedListWarningData);
     });
@@ -44497,7 +46011,9 @@
   unittest.group('obj-schema-VpnTunnelsScopedListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnelsScopedListWarning();
-      var od = api.VpnTunnelsScopedListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnTunnelsScopedListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnelsScopedListWarning(od as api.VpnTunnelsScopedListWarning);
     });
   });
@@ -44505,7 +46021,9 @@
   unittest.group('obj-schema-VpnTunnelsScopedList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnelsScopedList();
-      var od = api.VpnTunnelsScopedList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnTunnelsScopedList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnelsScopedList(od as api.VpnTunnelsScopedList);
     });
   });
@@ -44513,7 +46031,9 @@
   unittest.group('obj-schema-WafExpressionSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWafExpressionSet();
-      var od = api.WafExpressionSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WafExpressionSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWafExpressionSet(od as api.WafExpressionSet);
     });
   });
@@ -44521,7 +46041,9 @@
   unittest.group('obj-schema-WafExpressionSetExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWafExpressionSetExpression();
-      var od = api.WafExpressionSetExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WafExpressionSetExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWafExpressionSetExpression(od as api.WafExpressionSetExpression);
     });
   });
@@ -44529,7 +46051,9 @@
   unittest.group('obj-schema-WeightedBackendService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWeightedBackendService();
-      var od = api.WeightedBackendService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WeightedBackendService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWeightedBackendService(od as api.WeightedBackendService);
     });
   });
@@ -44537,7 +46061,9 @@
   unittest.group('obj-schema-XpnHostListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildXpnHostListWarningData();
-      var od = api.XpnHostListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.XpnHostListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkXpnHostListWarningData(od as api.XpnHostListWarningData);
     });
   });
@@ -44545,7 +46071,9 @@
   unittest.group('obj-schema-XpnHostListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildXpnHostListWarning();
-      var od = api.XpnHostListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.XpnHostListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkXpnHostListWarning(od as api.XpnHostListWarning);
     });
   });
@@ -44553,7 +46081,9 @@
   unittest.group('obj-schema-XpnHostList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildXpnHostList();
-      var od = api.XpnHostList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.XpnHostList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkXpnHostList(od as api.XpnHostList);
     });
   });
@@ -44561,7 +46091,9 @@
   unittest.group('obj-schema-XpnResourceId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildXpnResourceId();
-      var od = api.XpnResourceId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.XpnResourceId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkXpnResourceId(od as api.XpnResourceId);
     });
   });
@@ -44569,7 +46101,8 @@
   unittest.group('obj-schema-Zone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZone();
-      var od = api.Zone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Zone.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkZone(od as api.Zone);
     });
   });
@@ -44577,7 +46110,9 @@
   unittest.group('obj-schema-ZoneListWarningData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZoneListWarningData();
-      var od = api.ZoneListWarningData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ZoneListWarningData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkZoneListWarningData(od as api.ZoneListWarningData);
     });
   });
@@ -44585,7 +46120,9 @@
   unittest.group('obj-schema-ZoneListWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZoneListWarning();
-      var od = api.ZoneListWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ZoneListWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkZoneListWarning(od as api.ZoneListWarning);
     });
   });
@@ -44593,7 +46130,9 @@
   unittest.group('obj-schema-ZoneList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZoneList();
-      var od = api.ZoneList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ZoneList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkZoneList(od as api.ZoneList);
     });
   });
@@ -44601,7 +46140,9 @@
   unittest.group('obj-schema-ZoneSetLabelsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZoneSetLabelsRequest();
-      var od = api.ZoneSetLabelsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ZoneSetLabelsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkZoneSetLabelsRequest(od as api.ZoneSetLabelsRequest);
     });
   });
@@ -44609,7 +46150,9 @@
   unittest.group('obj-schema-ZoneSetPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZoneSetPolicyRequest();
-      var od = api.ZoneSetPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ZoneSetPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkZoneSetPolicyRequest(od as api.ZoneSetPolicyRequest);
     });
   });
diff --git a/generated/googleapis/test/container/v1_test.dart b/generated/googleapis/test/container/v1_test.dart
index 7cc9354..e29465f 100644
--- a/generated/googleapis/test/container/v1_test.dart
+++ b/generated/googleapis/test/container/v1_test.dart
@@ -4163,7 +4163,9 @@
   unittest.group('obj-schema-AcceleratorConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorConfig();
-      var od = api.AcceleratorConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorConfig(od as api.AcceleratorConfig);
     });
   });
@@ -4171,7 +4173,9 @@
   unittest.group('obj-schema-AddonsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddonsConfig();
-      var od = api.AddonsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddonsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddonsConfig(od as api.AddonsConfig);
     });
   });
@@ -4179,7 +4183,9 @@
   unittest.group('obj-schema-AuthenticatorGroupsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthenticatorGroupsConfig();
-      var od = api.AuthenticatorGroupsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthenticatorGroupsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthenticatorGroupsConfig(od as api.AuthenticatorGroupsConfig);
     });
   });
@@ -4187,7 +4193,9 @@
   unittest.group('obj-schema-AutoUpgradeOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoUpgradeOptions();
-      var od = api.AutoUpgradeOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoUpgradeOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoUpgradeOptions(od as api.AutoUpgradeOptions);
     });
   });
@@ -4195,7 +4203,9 @@
   unittest.group('obj-schema-Autopilot', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutopilot();
-      var od = api.Autopilot.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Autopilot.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAutopilot(od as api.Autopilot);
     });
   });
@@ -4203,7 +4213,9 @@
   unittest.group('obj-schema-AutoprovisioningNodePoolDefaults', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoprovisioningNodePoolDefaults();
-      var od = api.AutoprovisioningNodePoolDefaults.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoprovisioningNodePoolDefaults.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoprovisioningNodePoolDefaults(
           od as api.AutoprovisioningNodePoolDefaults);
     });
@@ -4212,7 +4224,9 @@
   unittest.group('obj-schema-BigQueryDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigQueryDestination();
-      var od = api.BigQueryDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigQueryDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigQueryDestination(od as api.BigQueryDestination);
     });
   });
@@ -4220,7 +4234,9 @@
   unittest.group('obj-schema-BinaryAuthorization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinaryAuthorization();
-      var od = api.BinaryAuthorization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BinaryAuthorization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBinaryAuthorization(od as api.BinaryAuthorization);
     });
   });
@@ -4228,7 +4244,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -4236,7 +4254,9 @@
   unittest.group('obj-schema-CidrBlock', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCidrBlock();
-      var od = api.CidrBlock.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CidrBlock.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCidrBlock(od as api.CidrBlock);
     });
   });
@@ -4244,7 +4264,9 @@
   unittest.group('obj-schema-ClientCertificateConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientCertificateConfig();
-      var od = api.ClientCertificateConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClientCertificateConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClientCertificateConfig(od as api.ClientCertificateConfig);
     });
   });
@@ -4252,7 +4274,9 @@
   unittest.group('obj-schema-CloudRunConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudRunConfig();
-      var od = api.CloudRunConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudRunConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudRunConfig(od as api.CloudRunConfig);
     });
   });
@@ -4260,7 +4284,9 @@
   unittest.group('obj-schema-Cluster', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCluster();
-      var od = api.Cluster.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Cluster.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCluster(od as api.Cluster);
     });
   });
@@ -4268,7 +4294,9 @@
   unittest.group('obj-schema-ClusterAutoscaling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterAutoscaling();
-      var od = api.ClusterAutoscaling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterAutoscaling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterAutoscaling(od as api.ClusterAutoscaling);
     });
   });
@@ -4276,7 +4304,9 @@
   unittest.group('obj-schema-ClusterUpdate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterUpdate();
-      var od = api.ClusterUpdate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterUpdate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterUpdate(od as api.ClusterUpdate);
     });
   });
@@ -4284,7 +4314,9 @@
   unittest.group('obj-schema-CompleteIPRotationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompleteIPRotationRequest();
-      var od = api.CompleteIPRotationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompleteIPRotationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompleteIPRotationRequest(od as api.CompleteIPRotationRequest);
     });
   });
@@ -4292,7 +4324,9 @@
   unittest.group('obj-schema-ConfigConnectorConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigConnectorConfig();
-      var od = api.ConfigConnectorConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigConnectorConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigConnectorConfig(od as api.ConfigConnectorConfig);
     });
   });
@@ -4300,7 +4334,9 @@
   unittest.group('obj-schema-ConsumptionMeteringConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConsumptionMeteringConfig();
-      var od = api.ConsumptionMeteringConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConsumptionMeteringConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConsumptionMeteringConfig(od as api.ConsumptionMeteringConfig);
     });
   });
@@ -4308,7 +4344,9 @@
   unittest.group('obj-schema-CreateClusterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateClusterRequest();
-      var od = api.CreateClusterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateClusterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateClusterRequest(od as api.CreateClusterRequest);
     });
   });
@@ -4316,7 +4354,9 @@
   unittest.group('obj-schema-CreateNodePoolRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateNodePoolRequest();
-      var od = api.CreateNodePoolRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateNodePoolRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateNodePoolRequest(od as api.CreateNodePoolRequest);
     });
   });
@@ -4324,7 +4364,9 @@
   unittest.group('obj-schema-DailyMaintenanceWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDailyMaintenanceWindow();
-      var od = api.DailyMaintenanceWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DailyMaintenanceWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDailyMaintenanceWindow(od as api.DailyMaintenanceWindow);
     });
   });
@@ -4332,7 +4374,9 @@
   unittest.group('obj-schema-DatabaseEncryption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabaseEncryption();
-      var od = api.DatabaseEncryption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatabaseEncryption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatabaseEncryption(od as api.DatabaseEncryption);
     });
   });
@@ -4340,7 +4384,9 @@
   unittest.group('obj-schema-DefaultSnatStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDefaultSnatStatus();
-      var od = api.DefaultSnatStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DefaultSnatStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDefaultSnatStatus(od as api.DefaultSnatStatus);
     });
   });
@@ -4348,7 +4394,9 @@
   unittest.group('obj-schema-DnsCacheConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDnsCacheConfig();
-      var od = api.DnsCacheConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DnsCacheConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDnsCacheConfig(od as api.DnsCacheConfig);
     });
   });
@@ -4356,7 +4404,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -4364,7 +4413,9 @@
   unittest.group('obj-schema-GcePersistentDiskCsiDriverConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcePersistentDiskCsiDriverConfig();
-      var od = api.GcePersistentDiskCsiDriverConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GcePersistentDiskCsiDriverConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGcePersistentDiskCsiDriverConfig(
           od as api.GcePersistentDiskCsiDriverConfig);
     });
@@ -4373,7 +4424,9 @@
   unittest.group('obj-schema-GetJSONWebKeysResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetJSONWebKeysResponse();
-      var od = api.GetJSONWebKeysResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetJSONWebKeysResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetJSONWebKeysResponse(od as api.GetJSONWebKeysResponse);
     });
   });
@@ -4381,7 +4434,9 @@
   unittest.group('obj-schema-GetOpenIDConfigResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetOpenIDConfigResponse();
-      var od = api.GetOpenIDConfigResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetOpenIDConfigResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetOpenIDConfigResponse(od as api.GetOpenIDConfigResponse);
     });
   });
@@ -4389,7 +4444,9 @@
   unittest.group('obj-schema-HorizontalPodAutoscaling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHorizontalPodAutoscaling();
-      var od = api.HorizontalPodAutoscaling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HorizontalPodAutoscaling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHorizontalPodAutoscaling(od as api.HorizontalPodAutoscaling);
     });
   });
@@ -4397,7 +4454,9 @@
   unittest.group('obj-schema-HttpCacheControlResponseHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpCacheControlResponseHeader();
-      var od = api.HttpCacheControlResponseHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpCacheControlResponseHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpCacheControlResponseHeader(
           od as api.HttpCacheControlResponseHeader);
     });
@@ -4406,7 +4465,9 @@
   unittest.group('obj-schema-HttpLoadBalancing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpLoadBalancing();
-      var od = api.HttpLoadBalancing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpLoadBalancing.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpLoadBalancing(od as api.HttpLoadBalancing);
     });
   });
@@ -4414,7 +4475,9 @@
   unittest.group('obj-schema-IPAllocationPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIPAllocationPolicy();
-      var od = api.IPAllocationPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IPAllocationPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIPAllocationPolicy(od as api.IPAllocationPolicy);
     });
   });
@@ -4422,7 +4485,9 @@
   unittest.group('obj-schema-IntraNodeVisibilityConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntraNodeVisibilityConfig();
-      var od = api.IntraNodeVisibilityConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntraNodeVisibilityConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntraNodeVisibilityConfig(od as api.IntraNodeVisibilityConfig);
     });
   });
@@ -4430,7 +4495,8 @@
   unittest.group('obj-schema-Jwk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJwk();
-      var od = api.Jwk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Jwk.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJwk(od as api.Jwk);
     });
   });
@@ -4438,7 +4504,9 @@
   unittest.group('obj-schema-KubernetesDashboard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKubernetesDashboard();
-      var od = api.KubernetesDashboard.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KubernetesDashboard.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKubernetesDashboard(od as api.KubernetesDashboard);
     });
   });
@@ -4446,7 +4514,9 @@
   unittest.group('obj-schema-LegacyAbac', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLegacyAbac();
-      var od = api.LegacyAbac.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LegacyAbac.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLegacyAbac(od as api.LegacyAbac);
     });
   });
@@ -4454,7 +4524,9 @@
   unittest.group('obj-schema-LinuxNodeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinuxNodeConfig();
-      var od = api.LinuxNodeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LinuxNodeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLinuxNodeConfig(od as api.LinuxNodeConfig);
     });
   });
@@ -4462,7 +4534,9 @@
   unittest.group('obj-schema-ListClustersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListClustersResponse();
-      var od = api.ListClustersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListClustersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListClustersResponse(od as api.ListClustersResponse);
     });
   });
@@ -4470,7 +4544,9 @@
   unittest.group('obj-schema-ListNodePoolsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNodePoolsResponse();
-      var od = api.ListNodePoolsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNodePoolsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNodePoolsResponse(od as api.ListNodePoolsResponse);
     });
   });
@@ -4478,7 +4554,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -4486,7 +4564,9 @@
   unittest.group('obj-schema-ListUsableSubnetworksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListUsableSubnetworksResponse();
-      var od = api.ListUsableSubnetworksResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListUsableSubnetworksResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListUsableSubnetworksResponse(
           od as api.ListUsableSubnetworksResponse);
     });
@@ -4495,7 +4575,9 @@
   unittest.group('obj-schema-MaintenancePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenancePolicy();
-      var od = api.MaintenancePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenancePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenancePolicy(od as api.MaintenancePolicy);
     });
   });
@@ -4503,7 +4585,9 @@
   unittest.group('obj-schema-MaintenanceWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenanceWindow();
-      var od = api.MaintenanceWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenanceWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenanceWindow(od as api.MaintenanceWindow);
     });
   });
@@ -4511,7 +4595,9 @@
   unittest.group('obj-schema-MasterAuth', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMasterAuth();
-      var od = api.MasterAuth.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MasterAuth.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMasterAuth(od as api.MasterAuth);
     });
   });
@@ -4519,7 +4605,9 @@
   unittest.group('obj-schema-MasterAuthorizedNetworksConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMasterAuthorizedNetworksConfig();
-      var od = api.MasterAuthorizedNetworksConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MasterAuthorizedNetworksConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMasterAuthorizedNetworksConfig(
           od as api.MasterAuthorizedNetworksConfig);
     });
@@ -4528,7 +4616,9 @@
   unittest.group('obj-schema-MaxPodsConstraint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaxPodsConstraint();
-      var od = api.MaxPodsConstraint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaxPodsConstraint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaxPodsConstraint(od as api.MaxPodsConstraint);
     });
   });
@@ -4536,7 +4626,9 @@
   unittest.group('obj-schema-Metric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetric();
-      var od = api.Metric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metric.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetric(od as api.Metric);
     });
   });
@@ -4544,7 +4636,9 @@
   unittest.group('obj-schema-NetworkConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkConfig();
-      var od = api.NetworkConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkConfig(od as api.NetworkConfig);
     });
   });
@@ -4552,7 +4646,9 @@
   unittest.group('obj-schema-NetworkPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkPolicy();
-      var od = api.NetworkPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkPolicy(od as api.NetworkPolicy);
     });
   });
@@ -4560,7 +4656,9 @@
   unittest.group('obj-schema-NetworkPolicyConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkPolicyConfig();
-      var od = api.NetworkPolicyConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkPolicyConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkPolicyConfig(od as api.NetworkPolicyConfig);
     });
   });
@@ -4568,7 +4666,9 @@
   unittest.group('obj-schema-NodeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeConfig();
-      var od = api.NodeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NodeConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNodeConfig(od as api.NodeConfig);
     });
   });
@@ -4576,7 +4676,9 @@
   unittest.group('obj-schema-NodeKubeletConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeKubeletConfig();
-      var od = api.NodeKubeletConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeKubeletConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeKubeletConfig(od as api.NodeKubeletConfig);
     });
   });
@@ -4584,7 +4686,9 @@
   unittest.group('obj-schema-NodeManagement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeManagement();
-      var od = api.NodeManagement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeManagement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeManagement(od as api.NodeManagement);
     });
   });
@@ -4592,7 +4696,9 @@
   unittest.group('obj-schema-NodePool', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodePool();
-      var od = api.NodePool.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NodePool.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNodePool(od as api.NodePool);
     });
   });
@@ -4600,7 +4706,9 @@
   unittest.group('obj-schema-NodePoolAutoscaling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodePoolAutoscaling();
-      var od = api.NodePoolAutoscaling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodePoolAutoscaling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodePoolAutoscaling(od as api.NodePoolAutoscaling);
     });
   });
@@ -4608,7 +4716,9 @@
   unittest.group('obj-schema-NodeTaint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeTaint();
-      var od = api.NodeTaint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NodeTaint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNodeTaint(od as api.NodeTaint);
     });
   });
@@ -4616,7 +4726,9 @@
   unittest.group('obj-schema-NotificationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationConfig();
-      var od = api.NotificationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationConfig(od as api.NotificationConfig);
     });
   });
@@ -4624,7 +4736,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -4632,7 +4746,9 @@
   unittest.group('obj-schema-OperationProgress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationProgress();
-      var od = api.OperationProgress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationProgress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationProgress(od as api.OperationProgress);
     });
   });
@@ -4640,7 +4756,9 @@
   unittest.group('obj-schema-PrivateClusterConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrivateClusterConfig();
-      var od = api.PrivateClusterConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PrivateClusterConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPrivateClusterConfig(od as api.PrivateClusterConfig);
     });
   });
@@ -4648,7 +4766,9 @@
   unittest.group('obj-schema-PrivateClusterMasterGlobalAccessConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrivateClusterMasterGlobalAccessConfig();
-      var od = api.PrivateClusterMasterGlobalAccessConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PrivateClusterMasterGlobalAccessConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPrivateClusterMasterGlobalAccessConfig(
           od as api.PrivateClusterMasterGlobalAccessConfig);
     });
@@ -4657,7 +4777,9 @@
   unittest.group('obj-schema-PubSub', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubSub();
-      var od = api.PubSub.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PubSub.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPubSub(od as api.PubSub);
     });
   });
@@ -4665,7 +4787,9 @@
   unittest.group('obj-schema-RecurringTimeWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecurringTimeWindow();
-      var od = api.RecurringTimeWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RecurringTimeWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRecurringTimeWindow(od as api.RecurringTimeWindow);
     });
   });
@@ -4673,7 +4797,9 @@
   unittest.group('obj-schema-ReleaseChannel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReleaseChannel();
-      var od = api.ReleaseChannel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReleaseChannel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReleaseChannel(od as api.ReleaseChannel);
     });
   });
@@ -4681,7 +4807,9 @@
   unittest.group('obj-schema-ReleaseChannelConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReleaseChannelConfig();
-      var od = api.ReleaseChannelConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReleaseChannelConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReleaseChannelConfig(od as api.ReleaseChannelConfig);
     });
   });
@@ -4689,7 +4817,9 @@
   unittest.group('obj-schema-ReservationAffinity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationAffinity();
-      var od = api.ReservationAffinity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationAffinity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationAffinity(od as api.ReservationAffinity);
     });
   });
@@ -4697,7 +4827,9 @@
   unittest.group('obj-schema-ResourceLimit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceLimit();
-      var od = api.ResourceLimit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceLimit.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceLimit(od as api.ResourceLimit);
     });
   });
@@ -4705,7 +4837,9 @@
   unittest.group('obj-schema-ResourceUsageExportConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceUsageExportConfig();
-      var od = api.ResourceUsageExportConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceUsageExportConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceUsageExportConfig(od as api.ResourceUsageExportConfig);
     });
   });
@@ -4713,7 +4847,9 @@
   unittest.group('obj-schema-RollbackNodePoolUpgradeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRollbackNodePoolUpgradeRequest();
-      var od = api.RollbackNodePoolUpgradeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RollbackNodePoolUpgradeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRollbackNodePoolUpgradeRequest(
           od as api.RollbackNodePoolUpgradeRequest);
     });
@@ -4722,7 +4858,9 @@
   unittest.group('obj-schema-SandboxConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSandboxConfig();
-      var od = api.SandboxConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SandboxConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSandboxConfig(od as api.SandboxConfig);
     });
   });
@@ -4730,7 +4868,9 @@
   unittest.group('obj-schema-ServerConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServerConfig();
-      var od = api.ServerConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServerConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServerConfig(od as api.ServerConfig);
     });
   });
@@ -4738,7 +4878,9 @@
   unittest.group('obj-schema-SetAddonsConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetAddonsConfigRequest();
-      var od = api.SetAddonsConfigRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetAddonsConfigRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetAddonsConfigRequest(od as api.SetAddonsConfigRequest);
     });
   });
@@ -4746,7 +4888,9 @@
   unittest.group('obj-schema-SetLabelsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetLabelsRequest();
-      var od = api.SetLabelsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetLabelsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetLabelsRequest(od as api.SetLabelsRequest);
     });
   });
@@ -4754,7 +4898,9 @@
   unittest.group('obj-schema-SetLegacyAbacRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetLegacyAbacRequest();
-      var od = api.SetLegacyAbacRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetLegacyAbacRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetLegacyAbacRequest(od as api.SetLegacyAbacRequest);
     });
   });
@@ -4762,7 +4908,9 @@
   unittest.group('obj-schema-SetLocationsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetLocationsRequest();
-      var od = api.SetLocationsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetLocationsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetLocationsRequest(od as api.SetLocationsRequest);
     });
   });
@@ -4770,7 +4918,9 @@
   unittest.group('obj-schema-SetLoggingServiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetLoggingServiceRequest();
-      var od = api.SetLoggingServiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetLoggingServiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetLoggingServiceRequest(od as api.SetLoggingServiceRequest);
     });
   });
@@ -4778,7 +4928,9 @@
   unittest.group('obj-schema-SetMaintenancePolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetMaintenancePolicyRequest();
-      var od = api.SetMaintenancePolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetMaintenancePolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetMaintenancePolicyRequest(od as api.SetMaintenancePolicyRequest);
     });
   });
@@ -4786,7 +4938,9 @@
   unittest.group('obj-schema-SetMasterAuthRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetMasterAuthRequest();
-      var od = api.SetMasterAuthRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetMasterAuthRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetMasterAuthRequest(od as api.SetMasterAuthRequest);
     });
   });
@@ -4794,7 +4948,9 @@
   unittest.group('obj-schema-SetMonitoringServiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetMonitoringServiceRequest();
-      var od = api.SetMonitoringServiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetMonitoringServiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetMonitoringServiceRequest(od as api.SetMonitoringServiceRequest);
     });
   });
@@ -4802,7 +4958,9 @@
   unittest.group('obj-schema-SetNetworkPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetNetworkPolicyRequest();
-      var od = api.SetNetworkPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetNetworkPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetNetworkPolicyRequest(od as api.SetNetworkPolicyRequest);
     });
   });
@@ -4810,7 +4968,9 @@
   unittest.group('obj-schema-SetNodePoolAutoscalingRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetNodePoolAutoscalingRequest();
-      var od = api.SetNodePoolAutoscalingRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetNodePoolAutoscalingRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetNodePoolAutoscalingRequest(
           od as api.SetNodePoolAutoscalingRequest);
     });
@@ -4819,7 +4979,9 @@
   unittest.group('obj-schema-SetNodePoolManagementRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetNodePoolManagementRequest();
-      var od = api.SetNodePoolManagementRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetNodePoolManagementRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetNodePoolManagementRequest(od as api.SetNodePoolManagementRequest);
     });
   });
@@ -4827,7 +4989,9 @@
   unittest.group('obj-schema-SetNodePoolSizeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetNodePoolSizeRequest();
-      var od = api.SetNodePoolSizeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetNodePoolSizeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetNodePoolSizeRequest(od as api.SetNodePoolSizeRequest);
     });
   });
@@ -4835,7 +4999,9 @@
   unittest.group('obj-schema-ShieldedInstanceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShieldedInstanceConfig();
-      var od = api.ShieldedInstanceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShieldedInstanceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShieldedInstanceConfig(od as api.ShieldedInstanceConfig);
     });
   });
@@ -4843,7 +5009,9 @@
   unittest.group('obj-schema-ShieldedNodes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShieldedNodes();
-      var od = api.ShieldedNodes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShieldedNodes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShieldedNodes(od as api.ShieldedNodes);
     });
   });
@@ -4851,7 +5019,9 @@
   unittest.group('obj-schema-StartIPRotationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartIPRotationRequest();
-      var od = api.StartIPRotationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartIPRotationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartIPRotationRequest(od as api.StartIPRotationRequest);
     });
   });
@@ -4859,7 +5029,9 @@
   unittest.group('obj-schema-StatusCondition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatusCondition();
-      var od = api.StatusCondition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StatusCondition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStatusCondition(od as api.StatusCondition);
     });
   });
@@ -4867,7 +5039,9 @@
   unittest.group('obj-schema-TimeWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeWindow();
-      var od = api.TimeWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeWindow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeWindow(od as api.TimeWindow);
     });
   });
@@ -4875,7 +5049,9 @@
   unittest.group('obj-schema-UpdateClusterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateClusterRequest();
-      var od = api.UpdateClusterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateClusterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateClusterRequest(od as api.UpdateClusterRequest);
     });
   });
@@ -4883,7 +5059,9 @@
   unittest.group('obj-schema-UpdateMasterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateMasterRequest();
-      var od = api.UpdateMasterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateMasterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateMasterRequest(od as api.UpdateMasterRequest);
     });
   });
@@ -4891,7 +5069,9 @@
   unittest.group('obj-schema-UpdateNodePoolRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateNodePoolRequest();
-      var od = api.UpdateNodePoolRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateNodePoolRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateNodePoolRequest(od as api.UpdateNodePoolRequest);
     });
   });
@@ -4899,7 +5079,9 @@
   unittest.group('obj-schema-UpgradeEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpgradeEvent();
-      var od = api.UpgradeEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpgradeEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpgradeEvent(od as api.UpgradeEvent);
     });
   });
@@ -4907,7 +5089,9 @@
   unittest.group('obj-schema-UpgradeSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpgradeSettings();
-      var od = api.UpgradeSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpgradeSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpgradeSettings(od as api.UpgradeSettings);
     });
   });
@@ -4915,7 +5099,9 @@
   unittest.group('obj-schema-UsableSubnetwork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsableSubnetwork();
-      var od = api.UsableSubnetwork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsableSubnetwork.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsableSubnetwork(od as api.UsableSubnetwork);
     });
   });
@@ -4923,7 +5109,9 @@
   unittest.group('obj-schema-UsableSubnetworkSecondaryRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsableSubnetworkSecondaryRange();
-      var od = api.UsableSubnetworkSecondaryRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsableSubnetworkSecondaryRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsableSubnetworkSecondaryRange(
           od as api.UsableSubnetworkSecondaryRange);
     });
@@ -4932,7 +5120,9 @@
   unittest.group('obj-schema-VerticalPodAutoscaling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVerticalPodAutoscaling();
-      var od = api.VerticalPodAutoscaling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VerticalPodAutoscaling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVerticalPodAutoscaling(od as api.VerticalPodAutoscaling);
     });
   });
@@ -4940,7 +5130,9 @@
   unittest.group('obj-schema-WorkloadIdentityConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkloadIdentityConfig();
-      var od = api.WorkloadIdentityConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkloadIdentityConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkloadIdentityConfig(od as api.WorkloadIdentityConfig);
     });
   });
@@ -4948,7 +5140,9 @@
   unittest.group('obj-schema-WorkloadMetadataConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkloadMetadataConfig();
-      var od = api.WorkloadMetadataConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkloadMetadataConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkloadMetadataConfig(od as api.WorkloadMetadataConfig);
     });
   });
diff --git a/generated/googleapis/test/content/v2_1_test.dart b/generated/googleapis/test/content/v2_1_test.dart
index 0fa4527..69fee79 100644
--- a/generated/googleapis/test/content/v2_1_test.dart
+++ b/generated/googleapis/test/content/v2_1_test.dart
@@ -15569,7 +15569,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -15577,7 +15579,9 @@
   unittest.group('obj-schema-AccountAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountAddress();
-      var od = api.AccountAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountAddress(od as api.AccountAddress);
     });
   });
@@ -15585,7 +15589,9 @@
   unittest.group('obj-schema-AccountAdsLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountAdsLink();
-      var od = api.AccountAdsLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountAdsLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountAdsLink(od as api.AccountAdsLink);
     });
   });
@@ -15593,7 +15599,9 @@
   unittest.group('obj-schema-AccountBusinessInformation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountBusinessInformation();
-      var od = api.AccountBusinessInformation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountBusinessInformation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountBusinessInformation(od as api.AccountBusinessInformation);
     });
   });
@@ -15601,7 +15609,9 @@
   unittest.group('obj-schema-AccountCustomerService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountCustomerService();
-      var od = api.AccountCustomerService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountCustomerService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountCustomerService(od as api.AccountCustomerService);
     });
   });
@@ -15609,7 +15619,9 @@
   unittest.group('obj-schema-AccountGoogleMyBusinessLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountGoogleMyBusinessLink();
-      var od = api.AccountGoogleMyBusinessLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountGoogleMyBusinessLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountGoogleMyBusinessLink(od as api.AccountGoogleMyBusinessLink);
     });
   });
@@ -15617,7 +15629,9 @@
   unittest.group('obj-schema-AccountIdentifier', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountIdentifier();
-      var od = api.AccountIdentifier.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountIdentifier.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountIdentifier(od as api.AccountIdentifier);
     });
   });
@@ -15625,7 +15639,9 @@
   unittest.group('obj-schema-AccountLabel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountLabel();
-      var od = api.AccountLabel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountLabel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountLabel(od as api.AccountLabel);
     });
   });
@@ -15633,7 +15649,9 @@
   unittest.group('obj-schema-AccountReturnCarrier', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountReturnCarrier();
-      var od = api.AccountReturnCarrier.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountReturnCarrier.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountReturnCarrier(od as api.AccountReturnCarrier);
     });
   });
@@ -15641,7 +15659,9 @@
   unittest.group('obj-schema-AccountStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountStatus();
-      var od = api.AccountStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountStatus(od as api.AccountStatus);
     });
   });
@@ -15649,7 +15669,9 @@
   unittest.group('obj-schema-AccountStatusAccountLevelIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountStatusAccountLevelIssue();
-      var od = api.AccountStatusAccountLevelIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountStatusAccountLevelIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountStatusAccountLevelIssue(
           od as api.AccountStatusAccountLevelIssue);
     });
@@ -15658,7 +15680,9 @@
   unittest.group('obj-schema-AccountStatusItemLevelIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountStatusItemLevelIssue();
-      var od = api.AccountStatusItemLevelIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountStatusItemLevelIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountStatusItemLevelIssue(od as api.AccountStatusItemLevelIssue);
     });
   });
@@ -15666,7 +15690,9 @@
   unittest.group('obj-schema-AccountStatusProducts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountStatusProducts();
-      var od = api.AccountStatusProducts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountStatusProducts.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountStatusProducts(od as api.AccountStatusProducts);
     });
   });
@@ -15674,7 +15700,9 @@
   unittest.group('obj-schema-AccountStatusStatistics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountStatusStatistics();
-      var od = api.AccountStatusStatistics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountStatusStatistics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountStatusStatistics(od as api.AccountStatusStatistics);
     });
   });
@@ -15682,7 +15710,9 @@
   unittest.group('obj-schema-AccountTax', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountTax();
-      var od = api.AccountTax.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AccountTax.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccountTax(od as api.AccountTax);
     });
   });
@@ -15690,7 +15720,9 @@
   unittest.group('obj-schema-AccountTaxTaxRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountTaxTaxRule();
-      var od = api.AccountTaxTaxRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountTaxTaxRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountTaxTaxRule(od as api.AccountTaxTaxRule);
     });
   });
@@ -15698,7 +15730,9 @@
   unittest.group('obj-schema-AccountUser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountUser();
-      var od = api.AccountUser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountUser.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountUser(od as api.AccountUser);
     });
   });
@@ -15706,7 +15740,9 @@
   unittest.group('obj-schema-AccountYouTubeChannelLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountYouTubeChannelLink();
-      var od = api.AccountYouTubeChannelLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountYouTubeChannelLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountYouTubeChannelLink(od as api.AccountYouTubeChannelLink);
     });
   });
@@ -15714,7 +15750,9 @@
   unittest.group('obj-schema-AccountsAuthInfoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsAuthInfoResponse();
-      var od = api.AccountsAuthInfoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsAuthInfoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsAuthInfoResponse(od as api.AccountsAuthInfoResponse);
     });
   });
@@ -15722,7 +15760,9 @@
   unittest.group('obj-schema-AccountsClaimWebsiteResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsClaimWebsiteResponse();
-      var od = api.AccountsClaimWebsiteResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsClaimWebsiteResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsClaimWebsiteResponse(od as api.AccountsClaimWebsiteResponse);
     });
   });
@@ -15730,7 +15770,9 @@
   unittest.group('obj-schema-AccountsCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsCustomBatchRequest();
-      var od = api.AccountsCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsCustomBatchRequest(od as api.AccountsCustomBatchRequest);
     });
   });
@@ -15738,7 +15780,9 @@
   unittest.group('obj-schema-AccountsCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsCustomBatchRequestEntry();
-      var od = api.AccountsCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsCustomBatchRequestEntry(
           od as api.AccountsCustomBatchRequestEntry);
     });
@@ -15747,8 +15791,9 @@
   unittest.group('obj-schema-AccountsCustomBatchRequestEntryLinkRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsCustomBatchRequestEntryLinkRequest();
-      var od =
-          api.AccountsCustomBatchRequestEntryLinkRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsCustomBatchRequestEntryLinkRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsCustomBatchRequestEntryLinkRequest(
           od as api.AccountsCustomBatchRequestEntryLinkRequest);
     });
@@ -15757,7 +15802,9 @@
   unittest.group('obj-schema-AccountsCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsCustomBatchResponse();
-      var od = api.AccountsCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsCustomBatchResponse(od as api.AccountsCustomBatchResponse);
     });
   });
@@ -15765,7 +15812,9 @@
   unittest.group('obj-schema-AccountsCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsCustomBatchResponseEntry();
-      var od = api.AccountsCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsCustomBatchResponseEntry(
           od as api.AccountsCustomBatchResponseEntry);
     });
@@ -15774,7 +15823,9 @@
   unittest.group('obj-schema-AccountsLinkRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsLinkRequest();
-      var od = api.AccountsLinkRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsLinkRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsLinkRequest(od as api.AccountsLinkRequest);
     });
   });
@@ -15782,7 +15833,9 @@
   unittest.group('obj-schema-AccountsLinkResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsLinkResponse();
-      var od = api.AccountsLinkResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsLinkResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsLinkResponse(od as api.AccountsLinkResponse);
     });
   });
@@ -15790,7 +15843,9 @@
   unittest.group('obj-schema-AccountsListLinksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsListLinksResponse();
-      var od = api.AccountsListLinksResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsListLinksResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsListLinksResponse(od as api.AccountsListLinksResponse);
     });
   });
@@ -15798,7 +15853,9 @@
   unittest.group('obj-schema-AccountsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsListResponse();
-      var od = api.AccountsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsListResponse(od as api.AccountsListResponse);
     });
   });
@@ -15806,7 +15863,9 @@
   unittest.group('obj-schema-AccountsUpdateLabelsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsUpdateLabelsRequest();
-      var od = api.AccountsUpdateLabelsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsUpdateLabelsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsUpdateLabelsRequest(od as api.AccountsUpdateLabelsRequest);
     });
   });
@@ -15814,7 +15873,9 @@
   unittest.group('obj-schema-AccountsUpdateLabelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsUpdateLabelsResponse();
-      var od = api.AccountsUpdateLabelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsUpdateLabelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsUpdateLabelsResponse(od as api.AccountsUpdateLabelsResponse);
     });
   });
@@ -15822,7 +15883,9 @@
   unittest.group('obj-schema-AccountstatusesCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountstatusesCustomBatchRequest();
-      var od = api.AccountstatusesCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountstatusesCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountstatusesCustomBatchRequest(
           od as api.AccountstatusesCustomBatchRequest);
     });
@@ -15831,7 +15894,9 @@
   unittest.group('obj-schema-AccountstatusesCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountstatusesCustomBatchRequestEntry();
-      var od = api.AccountstatusesCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountstatusesCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountstatusesCustomBatchRequestEntry(
           od as api.AccountstatusesCustomBatchRequestEntry);
     });
@@ -15840,7 +15905,9 @@
   unittest.group('obj-schema-AccountstatusesCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountstatusesCustomBatchResponse();
-      var od = api.AccountstatusesCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountstatusesCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountstatusesCustomBatchResponse(
           od as api.AccountstatusesCustomBatchResponse);
     });
@@ -15849,7 +15916,9 @@
   unittest.group('obj-schema-AccountstatusesCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountstatusesCustomBatchResponseEntry();
-      var od = api.AccountstatusesCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountstatusesCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountstatusesCustomBatchResponseEntry(
           od as api.AccountstatusesCustomBatchResponseEntry);
     });
@@ -15858,7 +15927,9 @@
   unittest.group('obj-schema-AccountstatusesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountstatusesListResponse();
-      var od = api.AccountstatusesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountstatusesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountstatusesListResponse(od as api.AccountstatusesListResponse);
     });
   });
@@ -15866,7 +15937,9 @@
   unittest.group('obj-schema-AccounttaxCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccounttaxCustomBatchRequest();
-      var od = api.AccounttaxCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccounttaxCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccounttaxCustomBatchRequest(od as api.AccounttaxCustomBatchRequest);
     });
   });
@@ -15874,7 +15947,9 @@
   unittest.group('obj-schema-AccounttaxCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccounttaxCustomBatchRequestEntry();
-      var od = api.AccounttaxCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccounttaxCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccounttaxCustomBatchRequestEntry(
           od as api.AccounttaxCustomBatchRequestEntry);
     });
@@ -15883,7 +15958,9 @@
   unittest.group('obj-schema-AccounttaxCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccounttaxCustomBatchResponse();
-      var od = api.AccounttaxCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccounttaxCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccounttaxCustomBatchResponse(
           od as api.AccounttaxCustomBatchResponse);
     });
@@ -15892,7 +15969,9 @@
   unittest.group('obj-schema-AccounttaxCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccounttaxCustomBatchResponseEntry();
-      var od = api.AccounttaxCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccounttaxCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccounttaxCustomBatchResponseEntry(
           od as api.AccounttaxCustomBatchResponseEntry);
     });
@@ -15901,7 +15980,9 @@
   unittest.group('obj-schema-AccounttaxListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccounttaxListResponse();
-      var od = api.AccounttaxListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccounttaxListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccounttaxListResponse(od as api.AccounttaxListResponse);
     });
   });
@@ -15909,7 +15990,9 @@
   unittest.group('obj-schema-Amount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAmount();
-      var od = api.Amount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Amount.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAmount(od as api.Amount);
     });
   });
@@ -15917,7 +16000,9 @@
   unittest.group('obj-schema-BusinessDayConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBusinessDayConfig();
-      var od = api.BusinessDayConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BusinessDayConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBusinessDayConfig(od as api.BusinessDayConfig);
     });
   });
@@ -15925,7 +16010,9 @@
   unittest.group('obj-schema-BuyOnGoogleProgramStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuyOnGoogleProgramStatus();
-      var od = api.BuyOnGoogleProgramStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuyOnGoogleProgramStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuyOnGoogleProgramStatus(od as api.BuyOnGoogleProgramStatus);
     });
   });
@@ -15933,7 +16020,9 @@
   unittest.group('obj-schema-CarrierRate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCarrierRate();
-      var od = api.CarrierRate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CarrierRate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCarrierRate(od as api.CarrierRate);
     });
   });
@@ -15941,7 +16030,9 @@
   unittest.group('obj-schema-CarriersCarrier', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCarriersCarrier();
-      var od = api.CarriersCarrier.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CarriersCarrier.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCarriersCarrier(od as api.CarriersCarrier);
     });
   });
@@ -15949,7 +16040,9 @@
   unittest.group('obj-schema-Collection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCollection();
-      var od = api.Collection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Collection.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCollection(od as api.Collection);
     });
   });
@@ -15957,7 +16050,9 @@
   unittest.group('obj-schema-CollectionFeaturedProduct', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCollectionFeaturedProduct();
-      var od = api.CollectionFeaturedProduct.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CollectionFeaturedProduct.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCollectionFeaturedProduct(od as api.CollectionFeaturedProduct);
     });
   });
@@ -15965,7 +16060,9 @@
   unittest.group('obj-schema-CollectionStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCollectionStatus();
-      var od = api.CollectionStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CollectionStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCollectionStatus(od as api.CollectionStatus);
     });
   });
@@ -15973,7 +16070,9 @@
   unittest.group('obj-schema-CollectionStatusDestinationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCollectionStatusDestinationStatus();
-      var od = api.CollectionStatusDestinationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CollectionStatusDestinationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCollectionStatusDestinationStatus(
           od as api.CollectionStatusDestinationStatus);
     });
@@ -15982,7 +16081,9 @@
   unittest.group('obj-schema-CollectionStatusItemLevelIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCollectionStatusItemLevelIssue();
-      var od = api.CollectionStatusItemLevelIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CollectionStatusItemLevelIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCollectionStatusItemLevelIssue(
           od as api.CollectionStatusItemLevelIssue);
     });
@@ -15991,7 +16092,8 @@
   unittest.group('obj-schema-Css', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCss();
-      var od = api.Css.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Css.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCss(od as api.Css);
     });
   });
@@ -15999,7 +16101,9 @@
   unittest.group('obj-schema-CustomAttribute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomAttribute();
-      var od = api.CustomAttribute.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomAttribute.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomAttribute(od as api.CustomAttribute);
     });
   });
@@ -16007,7 +16111,9 @@
   unittest.group('obj-schema-CustomerReturnReason', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerReturnReason();
-      var od = api.CustomerReturnReason.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerReturnReason.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerReturnReason(od as api.CustomerReturnReason);
     });
   });
@@ -16015,7 +16121,9 @@
   unittest.group('obj-schema-CutoffTime', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCutoffTime();
-      var od = api.CutoffTime.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CutoffTime.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCutoffTime(od as api.CutoffTime);
     });
   });
@@ -16023,7 +16131,9 @@
   unittest.group('obj-schema-Datafeed', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeed();
-      var od = api.Datafeed.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Datafeed.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDatafeed(od as api.Datafeed);
     });
   });
@@ -16031,7 +16141,9 @@
   unittest.group('obj-schema-DatafeedFetchSchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedFetchSchedule();
-      var od = api.DatafeedFetchSchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedFetchSchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedFetchSchedule(od as api.DatafeedFetchSchedule);
     });
   });
@@ -16039,7 +16151,9 @@
   unittest.group('obj-schema-DatafeedFormat', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedFormat();
-      var od = api.DatafeedFormat.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedFormat.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedFormat(od as api.DatafeedFormat);
     });
   });
@@ -16047,7 +16161,9 @@
   unittest.group('obj-schema-DatafeedStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedStatus();
-      var od = api.DatafeedStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedStatus(od as api.DatafeedStatus);
     });
   });
@@ -16055,7 +16171,9 @@
   unittest.group('obj-schema-DatafeedStatusError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedStatusError();
-      var od = api.DatafeedStatusError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedStatusError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedStatusError(od as api.DatafeedStatusError);
     });
   });
@@ -16063,7 +16181,9 @@
   unittest.group('obj-schema-DatafeedStatusExample', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedStatusExample();
-      var od = api.DatafeedStatusExample.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedStatusExample.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedStatusExample(od as api.DatafeedStatusExample);
     });
   });
@@ -16071,7 +16191,9 @@
   unittest.group('obj-schema-DatafeedTarget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedTarget();
-      var od = api.DatafeedTarget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedTarget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedTarget(od as api.DatafeedTarget);
     });
   });
@@ -16079,7 +16201,9 @@
   unittest.group('obj-schema-DatafeedsCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedsCustomBatchRequest();
-      var od = api.DatafeedsCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedsCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedsCustomBatchRequest(od as api.DatafeedsCustomBatchRequest);
     });
   });
@@ -16087,7 +16211,9 @@
   unittest.group('obj-schema-DatafeedsCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedsCustomBatchRequestEntry();
-      var od = api.DatafeedsCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedsCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedsCustomBatchRequestEntry(
           od as api.DatafeedsCustomBatchRequestEntry);
     });
@@ -16096,7 +16222,9 @@
   unittest.group('obj-schema-DatafeedsCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedsCustomBatchResponse();
-      var od = api.DatafeedsCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedsCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedsCustomBatchResponse(od as api.DatafeedsCustomBatchResponse);
     });
   });
@@ -16104,7 +16232,9 @@
   unittest.group('obj-schema-DatafeedsCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedsCustomBatchResponseEntry();
-      var od = api.DatafeedsCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedsCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedsCustomBatchResponseEntry(
           od as api.DatafeedsCustomBatchResponseEntry);
     });
@@ -16113,7 +16243,9 @@
   unittest.group('obj-schema-DatafeedsFetchNowResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedsFetchNowResponse();
-      var od = api.DatafeedsFetchNowResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedsFetchNowResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedsFetchNowResponse(od as api.DatafeedsFetchNowResponse);
     });
   });
@@ -16121,7 +16253,9 @@
   unittest.group('obj-schema-DatafeedsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedsListResponse();
-      var od = api.DatafeedsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedsListResponse(od as api.DatafeedsListResponse);
     });
   });
@@ -16129,7 +16263,9 @@
   unittest.group('obj-schema-DatafeedstatusesCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedstatusesCustomBatchRequest();
-      var od = api.DatafeedstatusesCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedstatusesCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedstatusesCustomBatchRequest(
           od as api.DatafeedstatusesCustomBatchRequest);
     });
@@ -16138,7 +16274,9 @@
   unittest.group('obj-schema-DatafeedstatusesCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedstatusesCustomBatchRequestEntry();
-      var od = api.DatafeedstatusesCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedstatusesCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedstatusesCustomBatchRequestEntry(
           od as api.DatafeedstatusesCustomBatchRequestEntry);
     });
@@ -16147,7 +16285,9 @@
   unittest.group('obj-schema-DatafeedstatusesCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedstatusesCustomBatchResponse();
-      var od = api.DatafeedstatusesCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedstatusesCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedstatusesCustomBatchResponse(
           od as api.DatafeedstatusesCustomBatchResponse);
     });
@@ -16156,8 +16296,9 @@
   unittest.group('obj-schema-DatafeedstatusesCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedstatusesCustomBatchResponseEntry();
-      var od =
-          api.DatafeedstatusesCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedstatusesCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedstatusesCustomBatchResponseEntry(
           od as api.DatafeedstatusesCustomBatchResponseEntry);
     });
@@ -16166,7 +16307,9 @@
   unittest.group('obj-schema-DatafeedstatusesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatafeedstatusesListResponse();
-      var od = api.DatafeedstatusesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatafeedstatusesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatafeedstatusesListResponse(od as api.DatafeedstatusesListResponse);
     });
   });
@@ -16174,7 +16317,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -16182,7 +16326,9 @@
   unittest.group('obj-schema-DateTime', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateTime();
-      var od = api.DateTime.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DateTime.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDateTime(od as api.DateTime);
     });
   });
@@ -16190,7 +16336,9 @@
   unittest.group('obj-schema-DeliveryTime', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeliveryTime();
-      var od = api.DeliveryTime.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeliveryTime.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeliveryTime(od as api.DeliveryTime);
     });
   });
@@ -16198,7 +16346,8 @@
   unittest.group('obj-schema-Error', () {
     unittest.test('to-json--from-json', () async {
       var o = buildError();
-      var od = api.Error.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Error.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkError(od as api.Error);
     });
   });
@@ -16206,7 +16355,9 @@
   unittest.group('obj-schema-Errors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrors();
-      var od = api.Errors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Errors.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkErrors(od as api.Errors);
     });
   });
@@ -16214,7 +16365,9 @@
   unittest.group('obj-schema-GmbAccounts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGmbAccounts();
-      var od = api.GmbAccounts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GmbAccounts.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGmbAccounts(od as api.GmbAccounts);
     });
   });
@@ -16222,7 +16375,9 @@
   unittest.group('obj-schema-GmbAccountsGmbAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGmbAccountsGmbAccount();
-      var od = api.GmbAccountsGmbAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GmbAccountsGmbAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGmbAccountsGmbAccount(od as api.GmbAccountsGmbAccount);
     });
   });
@@ -16230,7 +16385,9 @@
   unittest.group('obj-schema-Headers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHeaders();
-      var od = api.Headers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Headers.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHeaders(od as api.Headers);
     });
   });
@@ -16238,7 +16395,9 @@
   unittest.group('obj-schema-HolidayCutoff', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHolidayCutoff();
-      var od = api.HolidayCutoff.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HolidayCutoff.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHolidayCutoff(od as api.HolidayCutoff);
     });
   });
@@ -16246,7 +16405,9 @@
   unittest.group('obj-schema-HolidaysHoliday', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHolidaysHoliday();
-      var od = api.HolidaysHoliday.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HolidaysHoliday.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHolidaysHoliday(od as api.HolidaysHoliday);
     });
   });
@@ -16254,7 +16415,9 @@
   unittest.group('obj-schema-InapplicabilityDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInapplicabilityDetails();
-      var od = api.InapplicabilityDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InapplicabilityDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInapplicabilityDetails(od as api.InapplicabilityDetails);
     });
   });
@@ -16262,7 +16425,9 @@
   unittest.group('obj-schema-Installment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstallment();
-      var od = api.Installment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Installment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstallment(od as api.Installment);
     });
   });
@@ -16270,7 +16435,9 @@
   unittest.group('obj-schema-InvoiceSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInvoiceSummary();
-      var od = api.InvoiceSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InvoiceSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInvoiceSummary(od as api.InvoiceSummary);
     });
   });
@@ -16278,7 +16445,9 @@
   unittest.group('obj-schema-InvoiceSummaryAdditionalChargeSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInvoiceSummaryAdditionalChargeSummary();
-      var od = api.InvoiceSummaryAdditionalChargeSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InvoiceSummaryAdditionalChargeSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInvoiceSummaryAdditionalChargeSummary(
           od as api.InvoiceSummaryAdditionalChargeSummary);
     });
@@ -16287,7 +16456,9 @@
   unittest.group('obj-schema-LabelIds', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabelIds();
-      var od = api.LabelIds.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LabelIds.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLabelIds(od as api.LabelIds);
     });
   });
@@ -16295,7 +16466,9 @@
   unittest.group('obj-schema-LiaAboutPageSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiaAboutPageSettings();
-      var od = api.LiaAboutPageSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiaAboutPageSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiaAboutPageSettings(od as api.LiaAboutPageSettings);
     });
   });
@@ -16303,7 +16476,9 @@
   unittest.group('obj-schema-LiaCountrySettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiaCountrySettings();
-      var od = api.LiaCountrySettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiaCountrySettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiaCountrySettings(od as api.LiaCountrySettings);
     });
   });
@@ -16311,7 +16486,9 @@
   unittest.group('obj-schema-LiaInventorySettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiaInventorySettings();
-      var od = api.LiaInventorySettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiaInventorySettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiaInventorySettings(od as api.LiaInventorySettings);
     });
   });
@@ -16319,7 +16496,9 @@
   unittest.group('obj-schema-LiaOnDisplayToOrderSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiaOnDisplayToOrderSettings();
-      var od = api.LiaOnDisplayToOrderSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiaOnDisplayToOrderSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiaOnDisplayToOrderSettings(od as api.LiaOnDisplayToOrderSettings);
     });
   });
@@ -16327,7 +16506,9 @@
   unittest.group('obj-schema-LiaPosDataProvider', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiaPosDataProvider();
-      var od = api.LiaPosDataProvider.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiaPosDataProvider.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiaPosDataProvider(od as api.LiaPosDataProvider);
     });
   });
@@ -16335,7 +16516,9 @@
   unittest.group('obj-schema-LiaSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiaSettings();
-      var od = api.LiaSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiaSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiaSettings(od as api.LiaSettings);
     });
   });
@@ -16343,7 +16526,9 @@
   unittest.group('obj-schema-LiasettingsCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsCustomBatchRequest();
-      var od = api.LiasettingsCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiasettingsCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsCustomBatchRequest(
           od as api.LiasettingsCustomBatchRequest);
     });
@@ -16352,7 +16537,9 @@
   unittest.group('obj-schema-LiasettingsCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsCustomBatchRequestEntry();
-      var od = api.LiasettingsCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiasettingsCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsCustomBatchRequestEntry(
           od as api.LiasettingsCustomBatchRequestEntry);
     });
@@ -16361,7 +16548,9 @@
   unittest.group('obj-schema-LiasettingsCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsCustomBatchResponse();
-      var od = api.LiasettingsCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiasettingsCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsCustomBatchResponse(
           od as api.LiasettingsCustomBatchResponse);
     });
@@ -16370,7 +16559,9 @@
   unittest.group('obj-schema-LiasettingsCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsCustomBatchResponseEntry();
-      var od = api.LiasettingsCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiasettingsCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsCustomBatchResponseEntry(
           od as api.LiasettingsCustomBatchResponseEntry);
     });
@@ -16379,8 +16570,9 @@
   unittest.group('obj-schema-LiasettingsGetAccessibleGmbAccountsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsGetAccessibleGmbAccountsResponse();
-      var od =
-          api.LiasettingsGetAccessibleGmbAccountsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiasettingsGetAccessibleGmbAccountsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsGetAccessibleGmbAccountsResponse(
           od as api.LiasettingsGetAccessibleGmbAccountsResponse);
     });
@@ -16389,7 +16581,9 @@
   unittest.group('obj-schema-LiasettingsListPosDataProvidersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsListPosDataProvidersResponse();
-      var od = api.LiasettingsListPosDataProvidersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiasettingsListPosDataProvidersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsListPosDataProvidersResponse(
           od as api.LiasettingsListPosDataProvidersResponse);
     });
@@ -16398,7 +16592,9 @@
   unittest.group('obj-schema-LiasettingsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsListResponse();
-      var od = api.LiasettingsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiasettingsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsListResponse(od as api.LiasettingsListResponse);
     });
   });
@@ -16406,7 +16602,9 @@
   unittest.group('obj-schema-LiasettingsRequestGmbAccessResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsRequestGmbAccessResponse();
-      var od = api.LiasettingsRequestGmbAccessResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiasettingsRequestGmbAccessResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsRequestGmbAccessResponse(
           od as api.LiasettingsRequestGmbAccessResponse);
     });
@@ -16416,8 +16614,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsRequestInventoryVerificationResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.LiasettingsRequestInventoryVerificationResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsRequestInventoryVerificationResponse(
           od as api.LiasettingsRequestInventoryVerificationResponse);
     });
@@ -16427,8 +16626,9 @@
       'obj-schema-LiasettingsSetInventoryVerificationContactResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsSetInventoryVerificationContactResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.LiasettingsSetInventoryVerificationContactResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsSetInventoryVerificationContactResponse(
           od as api.LiasettingsSetInventoryVerificationContactResponse);
     });
@@ -16437,7 +16637,9 @@
   unittest.group('obj-schema-LiasettingsSetPosDataProviderResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiasettingsSetPosDataProviderResponse();
-      var od = api.LiasettingsSetPosDataProviderResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiasettingsSetPosDataProviderResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiasettingsSetPosDataProviderResponse(
           od as api.LiasettingsSetPosDataProviderResponse);
     });
@@ -16446,7 +16648,9 @@
   unittest.group('obj-schema-LinkService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinkService();
-      var od = api.LinkService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LinkService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLinkService(od as api.LinkService);
     });
   });
@@ -16454,7 +16658,9 @@
   unittest.group('obj-schema-LinkedAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinkedAccount();
-      var od = api.LinkedAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LinkedAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLinkedAccount(od as api.LinkedAccount);
     });
   });
@@ -16462,7 +16668,9 @@
   unittest.group('obj-schema-ListAccountLabelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAccountLabelsResponse();
-      var od = api.ListAccountLabelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAccountLabelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAccountLabelsResponse(od as api.ListAccountLabelsResponse);
     });
   });
@@ -16470,7 +16678,9 @@
   unittest.group('obj-schema-ListAccountReturnCarrierResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAccountReturnCarrierResponse();
-      var od = api.ListAccountReturnCarrierResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAccountReturnCarrierResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAccountReturnCarrierResponse(
           od as api.ListAccountReturnCarrierResponse);
     });
@@ -16479,7 +16689,9 @@
   unittest.group('obj-schema-ListCollectionStatusesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCollectionStatusesResponse();
-      var od = api.ListCollectionStatusesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCollectionStatusesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCollectionStatusesResponse(
           od as api.ListCollectionStatusesResponse);
     });
@@ -16488,7 +16700,9 @@
   unittest.group('obj-schema-ListCollectionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCollectionsResponse();
-      var od = api.ListCollectionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCollectionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCollectionsResponse(od as api.ListCollectionsResponse);
     });
   });
@@ -16496,7 +16710,9 @@
   unittest.group('obj-schema-ListCssesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCssesResponse();
-      var od = api.ListCssesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCssesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCssesResponse(od as api.ListCssesResponse);
     });
   });
@@ -16504,7 +16720,9 @@
   unittest.group('obj-schema-ListRegionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRegionsResponse();
-      var od = api.ListRegionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRegionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRegionsResponse(od as api.ListRegionsResponse);
     });
   });
@@ -16512,7 +16730,9 @@
   unittest.group('obj-schema-ListRepricingProductReportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRepricingProductReportsResponse();
-      var od = api.ListRepricingProductReportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRepricingProductReportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRepricingProductReportsResponse(
           od as api.ListRepricingProductReportsResponse);
     });
@@ -16521,7 +16741,9 @@
   unittest.group('obj-schema-ListRepricingRuleReportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRepricingRuleReportsResponse();
-      var od = api.ListRepricingRuleReportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRepricingRuleReportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRepricingRuleReportsResponse(
           od as api.ListRepricingRuleReportsResponse);
     });
@@ -16530,7 +16752,9 @@
   unittest.group('obj-schema-ListRepricingRulesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRepricingRulesResponse();
-      var od = api.ListRepricingRulesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRepricingRulesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRepricingRulesResponse(od as api.ListRepricingRulesResponse);
     });
   });
@@ -16538,7 +16762,9 @@
   unittest.group('obj-schema-ListReturnPolicyOnlineResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListReturnPolicyOnlineResponse();
-      var od = api.ListReturnPolicyOnlineResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListReturnPolicyOnlineResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListReturnPolicyOnlineResponse(
           od as api.ListReturnPolicyOnlineResponse);
     });
@@ -16547,7 +16773,9 @@
   unittest.group('obj-schema-LocalInventory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalInventory();
-      var od = api.LocalInventory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalInventory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalInventory(od as api.LocalInventory);
     });
   });
@@ -16555,7 +16783,9 @@
   unittest.group('obj-schema-LocalinventoryCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalinventoryCustomBatchRequest();
-      var od = api.LocalinventoryCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalinventoryCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalinventoryCustomBatchRequest(
           od as api.LocalinventoryCustomBatchRequest);
     });
@@ -16564,7 +16794,9 @@
   unittest.group('obj-schema-LocalinventoryCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalinventoryCustomBatchRequestEntry();
-      var od = api.LocalinventoryCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalinventoryCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalinventoryCustomBatchRequestEntry(
           od as api.LocalinventoryCustomBatchRequestEntry);
     });
@@ -16573,7 +16805,9 @@
   unittest.group('obj-schema-LocalinventoryCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalinventoryCustomBatchResponse();
-      var od = api.LocalinventoryCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalinventoryCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalinventoryCustomBatchResponse(
           od as api.LocalinventoryCustomBatchResponse);
     });
@@ -16582,7 +16816,9 @@
   unittest.group('obj-schema-LocalinventoryCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalinventoryCustomBatchResponseEntry();
-      var od = api.LocalinventoryCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalinventoryCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalinventoryCustomBatchResponseEntry(
           od as api.LocalinventoryCustomBatchResponseEntry);
     });
@@ -16591,7 +16827,9 @@
   unittest.group('obj-schema-LocationIdSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationIdSet();
-      var od = api.LocationIdSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationIdSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationIdSet(od as api.LocationIdSet);
     });
   });
@@ -16599,7 +16837,9 @@
   unittest.group('obj-schema-LoyaltyPoints', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLoyaltyPoints();
-      var od = api.LoyaltyPoints.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LoyaltyPoints.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLoyaltyPoints(od as api.LoyaltyPoints);
     });
   });
@@ -16607,7 +16847,9 @@
   unittest.group('obj-schema-MerchantOrderReturn', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMerchantOrderReturn();
-      var od = api.MerchantOrderReturn.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MerchantOrderReturn.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMerchantOrderReturn(od as api.MerchantOrderReturn);
     });
   });
@@ -16615,7 +16857,9 @@
   unittest.group('obj-schema-MerchantOrderReturnItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMerchantOrderReturnItem();
-      var od = api.MerchantOrderReturnItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MerchantOrderReturnItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMerchantOrderReturnItem(od as api.MerchantOrderReturnItem);
     });
   });
@@ -16623,7 +16867,9 @@
   unittest.group('obj-schema-MerchantRejectionReason', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMerchantRejectionReason();
-      var od = api.MerchantRejectionReason.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MerchantRejectionReason.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMerchantRejectionReason(od as api.MerchantRejectionReason);
     });
   });
@@ -16631,7 +16877,9 @@
   unittest.group('obj-schema-Metrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetrics();
-      var od = api.Metrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metrics.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetrics(od as api.Metrics);
     });
   });
@@ -16639,7 +16887,9 @@
   unittest.group('obj-schema-MinimumOrderValueTable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMinimumOrderValueTable();
-      var od = api.MinimumOrderValueTable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MinimumOrderValueTable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMinimumOrderValueTable(od as api.MinimumOrderValueTable);
     });
   });
@@ -16647,8 +16897,9 @@
   unittest.group('obj-schema-MinimumOrderValueTableStoreCodeSetWithMov', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMinimumOrderValueTableStoreCodeSetWithMov();
-      var od =
-          api.MinimumOrderValueTableStoreCodeSetWithMov.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MinimumOrderValueTableStoreCodeSetWithMov.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMinimumOrderValueTableStoreCodeSetWithMov(
           od as api.MinimumOrderValueTableStoreCodeSetWithMov);
     });
@@ -16657,7 +16908,9 @@
   unittest.group('obj-schema-MonetaryAmount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonetaryAmount();
-      var od = api.MonetaryAmount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonetaryAmount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonetaryAmount(od as api.MonetaryAmount);
     });
   });
@@ -16665,7 +16918,9 @@
   unittest.group('obj-schema-OnboardBuyOnGoogleProgramRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOnboardBuyOnGoogleProgramRequest();
-      var od = api.OnboardBuyOnGoogleProgramRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OnboardBuyOnGoogleProgramRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOnboardBuyOnGoogleProgramRequest(
           od as api.OnboardBuyOnGoogleProgramRequest);
     });
@@ -16674,7 +16929,8 @@
   unittest.group('obj-schema-Order', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrder();
-      var od = api.Order.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Order.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrder(od as api.Order);
     });
   });
@@ -16682,7 +16938,9 @@
   unittest.group('obj-schema-OrderAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderAddress();
-      var od = api.OrderAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderAddress(od as api.OrderAddress);
     });
   });
@@ -16690,7 +16948,9 @@
   unittest.group('obj-schema-OrderCancellation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderCancellation();
-      var od = api.OrderCancellation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderCancellation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderCancellation(od as api.OrderCancellation);
     });
   });
@@ -16698,7 +16958,9 @@
   unittest.group('obj-schema-OrderCustomer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderCustomer();
-      var od = api.OrderCustomer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderCustomer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderCustomer(od as api.OrderCustomer);
     });
   });
@@ -16706,7 +16968,9 @@
   unittest.group('obj-schema-OrderCustomerLoyaltyInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderCustomerLoyaltyInfo();
-      var od = api.OrderCustomerLoyaltyInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderCustomerLoyaltyInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderCustomerLoyaltyInfo(od as api.OrderCustomerLoyaltyInfo);
     });
   });
@@ -16714,7 +16978,9 @@
   unittest.group('obj-schema-OrderCustomerMarketingRightsInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderCustomerMarketingRightsInfo();
-      var od = api.OrderCustomerMarketingRightsInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderCustomerMarketingRightsInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderCustomerMarketingRightsInfo(
           od as api.OrderCustomerMarketingRightsInfo);
     });
@@ -16723,7 +16989,9 @@
   unittest.group('obj-schema-OrderDeliveryDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderDeliveryDetails();
-      var od = api.OrderDeliveryDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderDeliveryDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderDeliveryDetails(od as api.OrderDeliveryDetails);
     });
   });
@@ -16731,7 +16999,9 @@
   unittest.group('obj-schema-OrderLineItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderLineItem();
-      var od = api.OrderLineItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderLineItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderLineItem(od as api.OrderLineItem);
     });
   });
@@ -16739,7 +17009,9 @@
   unittest.group('obj-schema-OrderLineItemAdjustment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderLineItemAdjustment();
-      var od = api.OrderLineItemAdjustment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderLineItemAdjustment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderLineItemAdjustment(od as api.OrderLineItemAdjustment);
     });
   });
@@ -16747,7 +17019,9 @@
   unittest.group('obj-schema-OrderLineItemProduct', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderLineItemProduct();
-      var od = api.OrderLineItemProduct.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderLineItemProduct.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderLineItemProduct(od as api.OrderLineItemProduct);
     });
   });
@@ -16755,7 +17029,9 @@
   unittest.group('obj-schema-OrderLineItemProductFee', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderLineItemProductFee();
-      var od = api.OrderLineItemProductFee.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderLineItemProductFee.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderLineItemProductFee(od as api.OrderLineItemProductFee);
     });
   });
@@ -16763,7 +17039,9 @@
   unittest.group('obj-schema-OrderLineItemProductVariantAttribute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderLineItemProductVariantAttribute();
-      var od = api.OrderLineItemProductVariantAttribute.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderLineItemProductVariantAttribute.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderLineItemProductVariantAttribute(
           od as api.OrderLineItemProductVariantAttribute);
     });
@@ -16772,7 +17050,9 @@
   unittest.group('obj-schema-OrderLineItemReturnInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderLineItemReturnInfo();
-      var od = api.OrderLineItemReturnInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderLineItemReturnInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderLineItemReturnInfo(od as api.OrderLineItemReturnInfo);
     });
   });
@@ -16780,7 +17060,9 @@
   unittest.group('obj-schema-OrderLineItemShippingDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderLineItemShippingDetails();
-      var od = api.OrderLineItemShippingDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderLineItemShippingDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderLineItemShippingDetails(od as api.OrderLineItemShippingDetails);
     });
   });
@@ -16788,7 +17070,9 @@
   unittest.group('obj-schema-OrderLineItemShippingDetailsMethod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderLineItemShippingDetailsMethod();
-      var od = api.OrderLineItemShippingDetailsMethod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderLineItemShippingDetailsMethod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderLineItemShippingDetailsMethod(
           od as api.OrderLineItemShippingDetailsMethod);
     });
@@ -16797,7 +17081,9 @@
   unittest.group('obj-schema-OrderMerchantProvidedAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderMerchantProvidedAnnotation();
-      var od = api.OrderMerchantProvidedAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderMerchantProvidedAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderMerchantProvidedAnnotation(
           od as api.OrderMerchantProvidedAnnotation);
     });
@@ -16806,7 +17092,9 @@
   unittest.group('obj-schema-OrderOrderAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderOrderAnnotation();
-      var od = api.OrderOrderAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderOrderAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderOrderAnnotation(od as api.OrderOrderAnnotation);
     });
   });
@@ -16814,7 +17102,9 @@
   unittest.group('obj-schema-OrderPickupDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderPickupDetails();
-      var od = api.OrderPickupDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderPickupDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderPickupDetails(od as api.OrderPickupDetails);
     });
   });
@@ -16822,7 +17112,9 @@
   unittest.group('obj-schema-OrderPickupDetailsCollector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderPickupDetailsCollector();
-      var od = api.OrderPickupDetailsCollector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderPickupDetailsCollector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderPickupDetailsCollector(od as api.OrderPickupDetailsCollector);
     });
   });
@@ -16830,7 +17122,9 @@
   unittest.group('obj-schema-OrderPromotion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderPromotion();
-      var od = api.OrderPromotion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderPromotion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderPromotion(od as api.OrderPromotion);
     });
   });
@@ -16838,7 +17132,9 @@
   unittest.group('obj-schema-OrderPromotionItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderPromotionItem();
-      var od = api.OrderPromotionItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderPromotionItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderPromotionItem(od as api.OrderPromotionItem);
     });
   });
@@ -16846,7 +17142,9 @@
   unittest.group('obj-schema-OrderRefund', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderRefund();
-      var od = api.OrderRefund.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderRefund.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderRefund(od as api.OrderRefund);
     });
   });
@@ -16854,7 +17152,9 @@
   unittest.group('obj-schema-OrderReportDisbursement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderReportDisbursement();
-      var od = api.OrderReportDisbursement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderReportDisbursement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderReportDisbursement(od as api.OrderReportDisbursement);
     });
   });
@@ -16862,7 +17162,9 @@
   unittest.group('obj-schema-OrderReportTransaction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderReportTransaction();
-      var od = api.OrderReportTransaction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderReportTransaction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderReportTransaction(od as api.OrderReportTransaction);
     });
   });
@@ -16870,7 +17172,9 @@
   unittest.group('obj-schema-OrderReturn', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderReturn();
-      var od = api.OrderReturn.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderReturn.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderReturn(od as api.OrderReturn);
     });
   });
@@ -16878,7 +17182,9 @@
   unittest.group('obj-schema-OrderShipment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderShipment();
-      var od = api.OrderShipment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderShipment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderShipment(od as api.OrderShipment);
     });
   });
@@ -16886,7 +17192,9 @@
   unittest.group('obj-schema-OrderShipmentLineItemShipment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderShipmentLineItemShipment();
-      var od = api.OrderShipmentLineItemShipment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderShipmentLineItemShipment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderShipmentLineItemShipment(
           od as api.OrderShipmentLineItemShipment);
     });
@@ -16895,7 +17203,9 @@
   unittest.group('obj-schema-OrderShipmentScheduledDeliveryDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderShipmentScheduledDeliveryDetails();
-      var od = api.OrderShipmentScheduledDeliveryDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderShipmentScheduledDeliveryDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderShipmentScheduledDeliveryDetails(
           od as api.OrderShipmentScheduledDeliveryDetails);
     });
@@ -16904,7 +17214,9 @@
   unittest.group('obj-schema-OrderTrackingSignal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderTrackingSignal();
-      var od = api.OrderTrackingSignal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderTrackingSignal.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderTrackingSignal(od as api.OrderTrackingSignal);
     });
   });
@@ -16912,7 +17224,9 @@
   unittest.group('obj-schema-OrderTrackingSignalLineItemDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderTrackingSignalLineItemDetails();
-      var od = api.OrderTrackingSignalLineItemDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderTrackingSignalLineItemDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderTrackingSignalLineItemDetails(
           od as api.OrderTrackingSignalLineItemDetails);
     });
@@ -16921,8 +17235,9 @@
   unittest.group('obj-schema-OrderTrackingSignalShipmentLineItemMapping', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderTrackingSignalShipmentLineItemMapping();
-      var od =
-          api.OrderTrackingSignalShipmentLineItemMapping.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderTrackingSignalShipmentLineItemMapping.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderTrackingSignalShipmentLineItemMapping(
           od as api.OrderTrackingSignalShipmentLineItemMapping);
     });
@@ -16931,7 +17246,9 @@
   unittest.group('obj-schema-OrderTrackingSignalShippingInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderTrackingSignalShippingInfo();
-      var od = api.OrderTrackingSignalShippingInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderTrackingSignalShippingInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderTrackingSignalShippingInfo(
           od as api.OrderTrackingSignalShippingInfo);
     });
@@ -16940,7 +17257,9 @@
   unittest.group('obj-schema-OrderinvoicesCreateChargeInvoiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderinvoicesCreateChargeInvoiceRequest();
-      var od = api.OrderinvoicesCreateChargeInvoiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderinvoicesCreateChargeInvoiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderinvoicesCreateChargeInvoiceRequest(
           od as api.OrderinvoicesCreateChargeInvoiceRequest);
     });
@@ -16949,8 +17268,9 @@
   unittest.group('obj-schema-OrderinvoicesCreateChargeInvoiceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderinvoicesCreateChargeInvoiceResponse();
-      var od =
-          api.OrderinvoicesCreateChargeInvoiceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderinvoicesCreateChargeInvoiceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderinvoicesCreateChargeInvoiceResponse(
           od as api.OrderinvoicesCreateChargeInvoiceResponse);
     });
@@ -16959,7 +17279,9 @@
   unittest.group('obj-schema-OrderinvoicesCreateRefundInvoiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderinvoicesCreateRefundInvoiceRequest();
-      var od = api.OrderinvoicesCreateRefundInvoiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderinvoicesCreateRefundInvoiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderinvoicesCreateRefundInvoiceRequest(
           od as api.OrderinvoicesCreateRefundInvoiceRequest);
     });
@@ -16968,8 +17290,9 @@
   unittest.group('obj-schema-OrderinvoicesCreateRefundInvoiceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderinvoicesCreateRefundInvoiceResponse();
-      var od =
-          api.OrderinvoicesCreateRefundInvoiceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderinvoicesCreateRefundInvoiceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderinvoicesCreateRefundInvoiceResponse(
           od as api.OrderinvoicesCreateRefundInvoiceResponse);
     });
@@ -16981,9 +17304,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildOrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceRefundOption();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceRefundOption
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceRefundOption(
           od as api
               .OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceRefundOption);
@@ -16996,9 +17320,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildOrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceReturnOption();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceReturnOption
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceReturnOption(
           od as api
               .OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceReturnOption);
@@ -17008,7 +17333,9 @@
   unittest.group('obj-schema-OrderreportsListDisbursementsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreportsListDisbursementsResponse();
-      var od = api.OrderreportsListDisbursementsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreportsListDisbursementsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreportsListDisbursementsResponse(
           od as api.OrderreportsListDisbursementsResponse);
     });
@@ -17017,7 +17344,9 @@
   unittest.group('obj-schema-OrderreportsListTransactionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreportsListTransactionsResponse();
-      var od = api.OrderreportsListTransactionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreportsListTransactionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreportsListTransactionsResponse(
           od as api.OrderreportsListTransactionsResponse);
     });
@@ -17026,7 +17355,9 @@
   unittest.group('obj-schema-OrderreturnsAcknowledgeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsAcknowledgeRequest();
-      var od = api.OrderreturnsAcknowledgeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsAcknowledgeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsAcknowledgeRequest(
           od as api.OrderreturnsAcknowledgeRequest);
     });
@@ -17035,7 +17366,9 @@
   unittest.group('obj-schema-OrderreturnsAcknowledgeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsAcknowledgeResponse();
-      var od = api.OrderreturnsAcknowledgeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsAcknowledgeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsAcknowledgeResponse(
           od as api.OrderreturnsAcknowledgeResponse);
     });
@@ -17044,7 +17377,9 @@
   unittest.group('obj-schema-OrderreturnsCreateOrderReturnRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsCreateOrderReturnRequest();
-      var od = api.OrderreturnsCreateOrderReturnRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsCreateOrderReturnRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsCreateOrderReturnRequest(
           od as api.OrderreturnsCreateOrderReturnRequest);
     });
@@ -17053,7 +17388,9 @@
   unittest.group('obj-schema-OrderreturnsCreateOrderReturnResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsCreateOrderReturnResponse();
-      var od = api.OrderreturnsCreateOrderReturnResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsCreateOrderReturnResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsCreateOrderReturnResponse(
           od as api.OrderreturnsCreateOrderReturnResponse);
     });
@@ -17062,7 +17399,9 @@
   unittest.group('obj-schema-OrderreturnsLineItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsLineItem();
-      var od = api.OrderreturnsLineItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsLineItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsLineItem(od as api.OrderreturnsLineItem);
     });
   });
@@ -17070,7 +17409,9 @@
   unittest.group('obj-schema-OrderreturnsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsListResponse();
-      var od = api.OrderreturnsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsListResponse(od as api.OrderreturnsListResponse);
     });
   });
@@ -17078,7 +17419,9 @@
   unittest.group('obj-schema-OrderreturnsPartialRefund', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsPartialRefund();
-      var od = api.OrderreturnsPartialRefund.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsPartialRefund.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsPartialRefund(od as api.OrderreturnsPartialRefund);
     });
   });
@@ -17086,7 +17429,9 @@
   unittest.group('obj-schema-OrderreturnsProcessRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsProcessRequest();
-      var od = api.OrderreturnsProcessRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsProcessRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsProcessRequest(od as api.OrderreturnsProcessRequest);
     });
   });
@@ -17094,7 +17439,9 @@
   unittest.group('obj-schema-OrderreturnsProcessResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsProcessResponse();
-      var od = api.OrderreturnsProcessResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsProcessResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsProcessResponse(od as api.OrderreturnsProcessResponse);
     });
   });
@@ -17102,7 +17449,9 @@
   unittest.group('obj-schema-OrderreturnsRefundOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsRefundOperation();
-      var od = api.OrderreturnsRefundOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsRefundOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsRefundOperation(od as api.OrderreturnsRefundOperation);
     });
   });
@@ -17110,7 +17459,9 @@
   unittest.group('obj-schema-OrderreturnsRejectOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsRejectOperation();
-      var od = api.OrderreturnsRejectOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsRejectOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsRejectOperation(od as api.OrderreturnsRejectOperation);
     });
   });
@@ -17118,7 +17469,9 @@
   unittest.group('obj-schema-OrderreturnsReturnItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderreturnsReturnItem();
-      var od = api.OrderreturnsReturnItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderreturnsReturnItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderreturnsReturnItem(od as api.OrderreturnsReturnItem);
     });
   });
@@ -17126,7 +17479,9 @@
   unittest.group('obj-schema-OrdersAcknowledgeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersAcknowledgeRequest();
-      var od = api.OrdersAcknowledgeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersAcknowledgeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersAcknowledgeRequest(od as api.OrdersAcknowledgeRequest);
     });
   });
@@ -17134,7 +17489,9 @@
   unittest.group('obj-schema-OrdersAcknowledgeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersAcknowledgeResponse();
-      var od = api.OrdersAcknowledgeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersAcknowledgeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersAcknowledgeResponse(od as api.OrdersAcknowledgeResponse);
     });
   });
@@ -17142,7 +17499,9 @@
   unittest.group('obj-schema-OrdersAdvanceTestOrderResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersAdvanceTestOrderResponse();
-      var od = api.OrdersAdvanceTestOrderResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersAdvanceTestOrderResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersAdvanceTestOrderResponse(
           od as api.OrdersAdvanceTestOrderResponse);
     });
@@ -17151,7 +17510,9 @@
   unittest.group('obj-schema-OrdersCancelLineItemRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCancelLineItemRequest();
-      var od = api.OrdersCancelLineItemRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCancelLineItemRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCancelLineItemRequest(od as api.OrdersCancelLineItemRequest);
     });
   });
@@ -17159,7 +17520,9 @@
   unittest.group('obj-schema-OrdersCancelLineItemResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCancelLineItemResponse();
-      var od = api.OrdersCancelLineItemResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCancelLineItemResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCancelLineItemResponse(od as api.OrdersCancelLineItemResponse);
     });
   });
@@ -17167,7 +17530,9 @@
   unittest.group('obj-schema-OrdersCancelRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCancelRequest();
-      var od = api.OrdersCancelRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCancelRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCancelRequest(od as api.OrdersCancelRequest);
     });
   });
@@ -17175,7 +17540,9 @@
   unittest.group('obj-schema-OrdersCancelResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCancelResponse();
-      var od = api.OrdersCancelResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCancelResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCancelResponse(od as api.OrdersCancelResponse);
     });
   });
@@ -17183,7 +17550,9 @@
   unittest.group('obj-schema-OrdersCancelTestOrderByCustomerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCancelTestOrderByCustomerRequest();
-      var od = api.OrdersCancelTestOrderByCustomerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCancelTestOrderByCustomerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCancelTestOrderByCustomerRequest(
           od as api.OrdersCancelTestOrderByCustomerRequest);
     });
@@ -17192,7 +17561,9 @@
   unittest.group('obj-schema-OrdersCancelTestOrderByCustomerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCancelTestOrderByCustomerResponse();
-      var od = api.OrdersCancelTestOrderByCustomerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCancelTestOrderByCustomerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCancelTestOrderByCustomerResponse(
           od as api.OrdersCancelTestOrderByCustomerResponse);
     });
@@ -17201,7 +17572,9 @@
   unittest.group('obj-schema-OrdersCreateTestOrderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCreateTestOrderRequest();
-      var od = api.OrdersCreateTestOrderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCreateTestOrderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCreateTestOrderRequest(od as api.OrdersCreateTestOrderRequest);
     });
   });
@@ -17209,7 +17582,9 @@
   unittest.group('obj-schema-OrdersCreateTestOrderResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCreateTestOrderResponse();
-      var od = api.OrdersCreateTestOrderResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCreateTestOrderResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCreateTestOrderResponse(
           od as api.OrdersCreateTestOrderResponse);
     });
@@ -17218,7 +17593,9 @@
   unittest.group('obj-schema-OrdersCreateTestReturnRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCreateTestReturnRequest();
-      var od = api.OrdersCreateTestReturnRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCreateTestReturnRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCreateTestReturnRequest(
           od as api.OrdersCreateTestReturnRequest);
     });
@@ -17227,7 +17604,9 @@
   unittest.group('obj-schema-OrdersCreateTestReturnResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCreateTestReturnResponse();
-      var od = api.OrdersCreateTestReturnResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCreateTestReturnResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCreateTestReturnResponse(
           od as api.OrdersCreateTestReturnResponse);
     });
@@ -17237,9 +17616,10 @@
       'obj-schema-OrdersCustomBatchRequestEntryCreateTestReturnReturnItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCustomBatchRequestEntryCreateTestReturnReturnItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.OrdersCustomBatchRequestEntryCreateTestReturnReturnItem.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCustomBatchRequestEntryCreateTestReturnReturnItem(
           od as api.OrdersCustomBatchRequestEntryCreateTestReturnReturnItem);
     });
@@ -17248,8 +17628,9 @@
   unittest.group('obj-schema-OrdersCustomBatchRequestEntryRefundItemItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCustomBatchRequestEntryRefundItemItem();
-      var od =
-          api.OrdersCustomBatchRequestEntryRefundItemItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersCustomBatchRequestEntryRefundItemItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCustomBatchRequestEntryRefundItemItem(
           od as api.OrdersCustomBatchRequestEntryRefundItemItem);
     });
@@ -17259,8 +17640,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCustomBatchRequestEntryRefundItemShipping();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.OrdersCustomBatchRequestEntryRefundItemShipping.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCustomBatchRequestEntryRefundItemShipping(
           od as api.OrdersCustomBatchRequestEntryRefundItemShipping);
     });
@@ -17270,9 +17652,10 @@
       'obj-schema-OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(
           od as api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo);
     });
@@ -17284,9 +17667,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildOrdersCustomBatchRequestEntryUpdateShipmentScheduledDeliveryDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.OrdersCustomBatchRequestEntryUpdateShipmentScheduledDeliveryDetails
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrdersCustomBatchRequestEntryUpdateShipmentScheduledDeliveryDetails(
           od as api
               .OrdersCustomBatchRequestEntryUpdateShipmentScheduledDeliveryDetails);
@@ -17296,7 +17680,9 @@
   unittest.group('obj-schema-OrdersGetByMerchantOrderIdResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersGetByMerchantOrderIdResponse();
-      var od = api.OrdersGetByMerchantOrderIdResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersGetByMerchantOrderIdResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersGetByMerchantOrderIdResponse(
           od as api.OrdersGetByMerchantOrderIdResponse);
     });
@@ -17305,7 +17691,9 @@
   unittest.group('obj-schema-OrdersGetTestOrderTemplateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersGetTestOrderTemplateResponse();
-      var od = api.OrdersGetTestOrderTemplateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersGetTestOrderTemplateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersGetTestOrderTemplateResponse(
           od as api.OrdersGetTestOrderTemplateResponse);
     });
@@ -17314,7 +17702,9 @@
   unittest.group('obj-schema-OrdersInStoreRefundLineItemRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersInStoreRefundLineItemRequest();
-      var od = api.OrdersInStoreRefundLineItemRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersInStoreRefundLineItemRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersInStoreRefundLineItemRequest(
           od as api.OrdersInStoreRefundLineItemRequest);
     });
@@ -17323,7 +17713,9 @@
   unittest.group('obj-schema-OrdersInStoreRefundLineItemResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersInStoreRefundLineItemResponse();
-      var od = api.OrdersInStoreRefundLineItemResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersInStoreRefundLineItemResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersInStoreRefundLineItemResponse(
           od as api.OrdersInStoreRefundLineItemResponse);
     });
@@ -17332,7 +17724,9 @@
   unittest.group('obj-schema-OrdersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersListResponse();
-      var od = api.OrdersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersListResponse(od as api.OrdersListResponse);
     });
   });
@@ -17340,7 +17734,9 @@
   unittest.group('obj-schema-OrdersRefundItemRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersRefundItemRequest();
-      var od = api.OrdersRefundItemRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersRefundItemRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersRefundItemRequest(od as api.OrdersRefundItemRequest);
     });
   });
@@ -17348,7 +17744,9 @@
   unittest.group('obj-schema-OrdersRefundItemResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersRefundItemResponse();
-      var od = api.OrdersRefundItemResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersRefundItemResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersRefundItemResponse(od as api.OrdersRefundItemResponse);
     });
   });
@@ -17356,7 +17754,9 @@
   unittest.group('obj-schema-OrdersRefundOrderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersRefundOrderRequest();
-      var od = api.OrdersRefundOrderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersRefundOrderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersRefundOrderRequest(od as api.OrdersRefundOrderRequest);
     });
   });
@@ -17364,7 +17764,9 @@
   unittest.group('obj-schema-OrdersRefundOrderResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersRefundOrderResponse();
-      var od = api.OrdersRefundOrderResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersRefundOrderResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersRefundOrderResponse(od as api.OrdersRefundOrderResponse);
     });
   });
@@ -17372,7 +17774,9 @@
   unittest.group('obj-schema-OrdersRejectReturnLineItemRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersRejectReturnLineItemRequest();
-      var od = api.OrdersRejectReturnLineItemRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersRejectReturnLineItemRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersRejectReturnLineItemRequest(
           od as api.OrdersRejectReturnLineItemRequest);
     });
@@ -17381,7 +17785,9 @@
   unittest.group('obj-schema-OrdersRejectReturnLineItemResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersRejectReturnLineItemResponse();
-      var od = api.OrdersRejectReturnLineItemResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersRejectReturnLineItemResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersRejectReturnLineItemResponse(
           od as api.OrdersRejectReturnLineItemResponse);
     });
@@ -17390,7 +17796,9 @@
   unittest.group('obj-schema-OrdersReturnRefundLineItemRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersReturnRefundLineItemRequest();
-      var od = api.OrdersReturnRefundLineItemRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersReturnRefundLineItemRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersReturnRefundLineItemRequest(
           od as api.OrdersReturnRefundLineItemRequest);
     });
@@ -17399,7 +17807,9 @@
   unittest.group('obj-schema-OrdersReturnRefundLineItemResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersReturnRefundLineItemResponse();
-      var od = api.OrdersReturnRefundLineItemResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersReturnRefundLineItemResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersReturnRefundLineItemResponse(
           od as api.OrdersReturnRefundLineItemResponse);
     });
@@ -17408,7 +17818,9 @@
   unittest.group('obj-schema-OrdersSetLineItemMetadataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersSetLineItemMetadataRequest();
-      var od = api.OrdersSetLineItemMetadataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersSetLineItemMetadataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersSetLineItemMetadataRequest(
           od as api.OrdersSetLineItemMetadataRequest);
     });
@@ -17417,7 +17829,9 @@
   unittest.group('obj-schema-OrdersSetLineItemMetadataResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersSetLineItemMetadataResponse();
-      var od = api.OrdersSetLineItemMetadataResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersSetLineItemMetadataResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersSetLineItemMetadataResponse(
           od as api.OrdersSetLineItemMetadataResponse);
     });
@@ -17426,7 +17840,9 @@
   unittest.group('obj-schema-OrdersShipLineItemsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersShipLineItemsRequest();
-      var od = api.OrdersShipLineItemsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersShipLineItemsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersShipLineItemsRequest(od as api.OrdersShipLineItemsRequest);
     });
   });
@@ -17434,7 +17850,9 @@
   unittest.group('obj-schema-OrdersShipLineItemsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersShipLineItemsResponse();
-      var od = api.OrdersShipLineItemsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersShipLineItemsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersShipLineItemsResponse(od as api.OrdersShipLineItemsResponse);
     });
   });
@@ -17442,8 +17860,9 @@
   unittest.group('obj-schema-OrdersUpdateLineItemShippingDetailsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersUpdateLineItemShippingDetailsRequest();
-      var od =
-          api.OrdersUpdateLineItemShippingDetailsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersUpdateLineItemShippingDetailsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersUpdateLineItemShippingDetailsRequest(
           od as api.OrdersUpdateLineItemShippingDetailsRequest);
     });
@@ -17452,8 +17871,9 @@
   unittest.group('obj-schema-OrdersUpdateLineItemShippingDetailsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersUpdateLineItemShippingDetailsResponse();
-      var od =
-          api.OrdersUpdateLineItemShippingDetailsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersUpdateLineItemShippingDetailsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersUpdateLineItemShippingDetailsResponse(
           od as api.OrdersUpdateLineItemShippingDetailsResponse);
     });
@@ -17462,7 +17882,9 @@
   unittest.group('obj-schema-OrdersUpdateMerchantOrderIdRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersUpdateMerchantOrderIdRequest();
-      var od = api.OrdersUpdateMerchantOrderIdRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersUpdateMerchantOrderIdRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersUpdateMerchantOrderIdRequest(
           od as api.OrdersUpdateMerchantOrderIdRequest);
     });
@@ -17471,7 +17893,9 @@
   unittest.group('obj-schema-OrdersUpdateMerchantOrderIdResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersUpdateMerchantOrderIdResponse();
-      var od = api.OrdersUpdateMerchantOrderIdResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersUpdateMerchantOrderIdResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersUpdateMerchantOrderIdResponse(
           od as api.OrdersUpdateMerchantOrderIdResponse);
     });
@@ -17480,7 +17904,9 @@
   unittest.group('obj-schema-OrdersUpdateShipmentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersUpdateShipmentRequest();
-      var od = api.OrdersUpdateShipmentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersUpdateShipmentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersUpdateShipmentRequest(od as api.OrdersUpdateShipmentRequest);
     });
   });
@@ -17488,7 +17914,9 @@
   unittest.group('obj-schema-OrdersUpdateShipmentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersUpdateShipmentResponse();
-      var od = api.OrdersUpdateShipmentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersUpdateShipmentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersUpdateShipmentResponse(od as api.OrdersUpdateShipmentResponse);
     });
   });
@@ -17496,7 +17924,9 @@
   unittest.group('obj-schema-PickupCarrierService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPickupCarrierService();
-      var od = api.PickupCarrierService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PickupCarrierService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPickupCarrierService(od as api.PickupCarrierService);
     });
   });
@@ -17504,7 +17934,9 @@
   unittest.group('obj-schema-PickupServicesPickupService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPickupServicesPickupService();
-      var od = api.PickupServicesPickupService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PickupServicesPickupService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPickupServicesPickupService(od as api.PickupServicesPickupService);
     });
   });
@@ -17512,7 +17944,9 @@
   unittest.group('obj-schema-PosCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosCustomBatchRequest();
-      var od = api.PosCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosCustomBatchRequest(od as api.PosCustomBatchRequest);
     });
   });
@@ -17520,7 +17954,9 @@
   unittest.group('obj-schema-PosCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosCustomBatchRequestEntry();
-      var od = api.PosCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosCustomBatchRequestEntry(od as api.PosCustomBatchRequestEntry);
     });
   });
@@ -17528,7 +17964,9 @@
   unittest.group('obj-schema-PosCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosCustomBatchResponse();
-      var od = api.PosCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosCustomBatchResponse(od as api.PosCustomBatchResponse);
     });
   });
@@ -17536,7 +17974,9 @@
   unittest.group('obj-schema-PosCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosCustomBatchResponseEntry();
-      var od = api.PosCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosCustomBatchResponseEntry(od as api.PosCustomBatchResponseEntry);
     });
   });
@@ -17544,7 +17984,9 @@
   unittest.group('obj-schema-PosDataProviders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosDataProviders();
-      var od = api.PosDataProviders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosDataProviders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosDataProviders(od as api.PosDataProviders);
     });
   });
@@ -17552,7 +17994,9 @@
   unittest.group('obj-schema-PosDataProvidersPosDataProvider', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosDataProvidersPosDataProvider();
-      var od = api.PosDataProvidersPosDataProvider.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosDataProvidersPosDataProvider.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosDataProvidersPosDataProvider(
           od as api.PosDataProvidersPosDataProvider);
     });
@@ -17561,7 +18005,9 @@
   unittest.group('obj-schema-PosInventory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosInventory();
-      var od = api.PosInventory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosInventory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosInventory(od as api.PosInventory);
     });
   });
@@ -17569,7 +18015,9 @@
   unittest.group('obj-schema-PosInventoryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosInventoryRequest();
-      var od = api.PosInventoryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosInventoryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosInventoryRequest(od as api.PosInventoryRequest);
     });
   });
@@ -17577,7 +18025,9 @@
   unittest.group('obj-schema-PosInventoryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosInventoryResponse();
-      var od = api.PosInventoryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosInventoryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosInventoryResponse(od as api.PosInventoryResponse);
     });
   });
@@ -17585,7 +18035,9 @@
   unittest.group('obj-schema-PosListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosListResponse();
-      var od = api.PosListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosListResponse(od as api.PosListResponse);
     });
   });
@@ -17593,7 +18045,9 @@
   unittest.group('obj-schema-PosSale', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosSale();
-      var od = api.PosSale.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PosSale.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPosSale(od as api.PosSale);
     });
   });
@@ -17601,7 +18055,9 @@
   unittest.group('obj-schema-PosSaleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosSaleRequest();
-      var od = api.PosSaleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosSaleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosSaleRequest(od as api.PosSaleRequest);
     });
   });
@@ -17609,7 +18065,9 @@
   unittest.group('obj-schema-PosSaleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosSaleResponse();
-      var od = api.PosSaleResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosSaleResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosSaleResponse(od as api.PosSaleResponse);
     });
   });
@@ -17617,7 +18075,9 @@
   unittest.group('obj-schema-PosStore', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosStore();
-      var od = api.PosStore.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PosStore.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPosStore(od as api.PosStore);
     });
   });
@@ -17625,7 +18085,9 @@
   unittest.group('obj-schema-PostalCodeGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostalCodeGroup();
-      var od = api.PostalCodeGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostalCodeGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostalCodeGroup(od as api.PostalCodeGroup);
     });
   });
@@ -17633,7 +18095,9 @@
   unittest.group('obj-schema-PostalCodeRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostalCodeRange();
-      var od = api.PostalCodeRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostalCodeRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostalCodeRange(od as api.PostalCodeRange);
     });
   });
@@ -17641,7 +18105,8 @@
   unittest.group('obj-schema-Price', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrice();
-      var od = api.Price.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Price.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPrice(od as api.Price);
     });
   });
@@ -17649,7 +18114,9 @@
   unittest.group('obj-schema-PriceAmount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPriceAmount();
-      var od = api.PriceAmount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PriceAmount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPriceAmount(od as api.PriceAmount);
     });
   });
@@ -17657,7 +18124,9 @@
   unittest.group('obj-schema-Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProduct();
-      var od = api.Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Product.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProduct(od as api.Product);
     });
   });
@@ -17665,7 +18134,9 @@
   unittest.group('obj-schema-ProductAmount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductAmount();
-      var od = api.ProductAmount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductAmount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductAmount(od as api.ProductAmount);
     });
   });
@@ -17673,7 +18144,9 @@
   unittest.group('obj-schema-ProductProductDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductProductDetail();
-      var od = api.ProductProductDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductProductDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductProductDetail(od as api.ProductProductDetail);
     });
   });
@@ -17681,7 +18154,9 @@
   unittest.group('obj-schema-ProductShipping', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductShipping();
-      var od = api.ProductShipping.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductShipping.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductShipping(od as api.ProductShipping);
     });
   });
@@ -17689,7 +18164,9 @@
   unittest.group('obj-schema-ProductShippingDimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductShippingDimension();
-      var od = api.ProductShippingDimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductShippingDimension.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductShippingDimension(od as api.ProductShippingDimension);
     });
   });
@@ -17697,7 +18174,9 @@
   unittest.group('obj-schema-ProductShippingWeight', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductShippingWeight();
-      var od = api.ProductShippingWeight.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductShippingWeight.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductShippingWeight(od as api.ProductShippingWeight);
     });
   });
@@ -17705,7 +18184,9 @@
   unittest.group('obj-schema-ProductStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductStatus();
-      var od = api.ProductStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductStatus(od as api.ProductStatus);
     });
   });
@@ -17713,7 +18194,9 @@
   unittest.group('obj-schema-ProductStatusDestinationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductStatusDestinationStatus();
-      var od = api.ProductStatusDestinationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductStatusDestinationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductStatusDestinationStatus(
           od as api.ProductStatusDestinationStatus);
     });
@@ -17722,7 +18205,9 @@
   unittest.group('obj-schema-ProductStatusItemLevelIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductStatusItemLevelIssue();
-      var od = api.ProductStatusItemLevelIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductStatusItemLevelIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductStatusItemLevelIssue(od as api.ProductStatusItemLevelIssue);
     });
   });
@@ -17730,7 +18215,9 @@
   unittest.group('obj-schema-ProductSubscriptionCost', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductSubscriptionCost();
-      var od = api.ProductSubscriptionCost.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductSubscriptionCost.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductSubscriptionCost(od as api.ProductSubscriptionCost);
     });
   });
@@ -17738,7 +18225,9 @@
   unittest.group('obj-schema-ProductTax', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductTax();
-      var od = api.ProductTax.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ProductTax.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProductTax(od as api.ProductTax);
     });
   });
@@ -17746,7 +18235,9 @@
   unittest.group('obj-schema-ProductUnitPricingBaseMeasure', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductUnitPricingBaseMeasure();
-      var od = api.ProductUnitPricingBaseMeasure.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductUnitPricingBaseMeasure.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductUnitPricingBaseMeasure(
           od as api.ProductUnitPricingBaseMeasure);
     });
@@ -17755,7 +18246,9 @@
   unittest.group('obj-schema-ProductUnitPricingMeasure', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductUnitPricingMeasure();
-      var od = api.ProductUnitPricingMeasure.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductUnitPricingMeasure.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductUnitPricingMeasure(od as api.ProductUnitPricingMeasure);
     });
   });
@@ -17763,7 +18256,9 @@
   unittest.group('obj-schema-ProductsCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductsCustomBatchRequest();
-      var od = api.ProductsCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductsCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductsCustomBatchRequest(od as api.ProductsCustomBatchRequest);
     });
   });
@@ -17771,7 +18266,9 @@
   unittest.group('obj-schema-ProductsCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductsCustomBatchRequestEntry();
-      var od = api.ProductsCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductsCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductsCustomBatchRequestEntry(
           od as api.ProductsCustomBatchRequestEntry);
     });
@@ -17780,7 +18277,9 @@
   unittest.group('obj-schema-ProductsCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductsCustomBatchResponse();
-      var od = api.ProductsCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductsCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductsCustomBatchResponse(od as api.ProductsCustomBatchResponse);
     });
   });
@@ -17788,7 +18287,9 @@
   unittest.group('obj-schema-ProductsCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductsCustomBatchResponseEntry();
-      var od = api.ProductsCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductsCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductsCustomBatchResponseEntry(
           od as api.ProductsCustomBatchResponseEntry);
     });
@@ -17797,7 +18298,9 @@
   unittest.group('obj-schema-ProductsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductsListResponse();
-      var od = api.ProductsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductsListResponse(od as api.ProductsListResponse);
     });
   });
@@ -17805,7 +18308,9 @@
   unittest.group('obj-schema-ProductstatusesCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductstatusesCustomBatchRequest();
-      var od = api.ProductstatusesCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductstatusesCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductstatusesCustomBatchRequest(
           od as api.ProductstatusesCustomBatchRequest);
     });
@@ -17814,7 +18319,9 @@
   unittest.group('obj-schema-ProductstatusesCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductstatusesCustomBatchRequestEntry();
-      var od = api.ProductstatusesCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductstatusesCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductstatusesCustomBatchRequestEntry(
           od as api.ProductstatusesCustomBatchRequestEntry);
     });
@@ -17823,7 +18330,9 @@
   unittest.group('obj-schema-ProductstatusesCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductstatusesCustomBatchResponse();
-      var od = api.ProductstatusesCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductstatusesCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductstatusesCustomBatchResponse(
           od as api.ProductstatusesCustomBatchResponse);
     });
@@ -17832,7 +18341,9 @@
   unittest.group('obj-schema-ProductstatusesCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductstatusesCustomBatchResponseEntry();
-      var od = api.ProductstatusesCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductstatusesCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductstatusesCustomBatchResponseEntry(
           od as api.ProductstatusesCustomBatchResponseEntry);
     });
@@ -17841,7 +18352,9 @@
   unittest.group('obj-schema-ProductstatusesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductstatusesListResponse();
-      var od = api.ProductstatusesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductstatusesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductstatusesListResponse(od as api.ProductstatusesListResponse);
     });
   });
@@ -17849,7 +18362,9 @@
   unittest.group('obj-schema-PubsubNotificationSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubsubNotificationSettings();
-      var od = api.PubsubNotificationSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PubsubNotificationSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPubsubNotificationSettings(od as api.PubsubNotificationSettings);
     });
   });
@@ -17857,7 +18372,9 @@
   unittest.group('obj-schema-RateGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRateGroup();
-      var od = api.RateGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RateGroup.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRateGroup(od as api.RateGroup);
     });
   });
@@ -17865,7 +18382,9 @@
   unittest.group('obj-schema-RefundReason', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRefundReason();
-      var od = api.RefundReason.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RefundReason.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRefundReason(od as api.RefundReason);
     });
   });
@@ -17873,7 +18392,9 @@
   unittest.group('obj-schema-Region', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegion();
-      var od = api.Region.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Region.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRegion(od as api.Region);
     });
   });
@@ -17881,7 +18402,9 @@
   unittest.group('obj-schema-RegionGeoTargetArea', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionGeoTargetArea();
-      var od = api.RegionGeoTargetArea.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionGeoTargetArea.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionGeoTargetArea(od as api.RegionGeoTargetArea);
     });
   });
@@ -17889,7 +18412,9 @@
   unittest.group('obj-schema-RegionPostalCodeArea', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionPostalCodeArea();
-      var od = api.RegionPostalCodeArea.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionPostalCodeArea.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionPostalCodeArea(od as api.RegionPostalCodeArea);
     });
   });
@@ -17897,7 +18422,9 @@
   unittest.group('obj-schema-RegionPostalCodeAreaPostalCodeRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionPostalCodeAreaPostalCodeRange();
-      var od = api.RegionPostalCodeAreaPostalCodeRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionPostalCodeAreaPostalCodeRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionPostalCodeAreaPostalCodeRange(
           od as api.RegionPostalCodeAreaPostalCodeRange);
     });
@@ -17906,7 +18433,9 @@
   unittest.group('obj-schema-RegionalInventory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionalInventory();
-      var od = api.RegionalInventory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionalInventory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionalInventory(od as api.RegionalInventory);
     });
   });
@@ -17914,7 +18443,9 @@
   unittest.group('obj-schema-RegionalinventoryCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionalinventoryCustomBatchRequest();
-      var od = api.RegionalinventoryCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionalinventoryCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionalinventoryCustomBatchRequest(
           od as api.RegionalinventoryCustomBatchRequest);
     });
@@ -17923,8 +18454,9 @@
   unittest.group('obj-schema-RegionalinventoryCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionalinventoryCustomBatchRequestEntry();
-      var od =
-          api.RegionalinventoryCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionalinventoryCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionalinventoryCustomBatchRequestEntry(
           od as api.RegionalinventoryCustomBatchRequestEntry);
     });
@@ -17933,7 +18465,9 @@
   unittest.group('obj-schema-RegionalinventoryCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionalinventoryCustomBatchResponse();
-      var od = api.RegionalinventoryCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionalinventoryCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionalinventoryCustomBatchResponse(
           od as api.RegionalinventoryCustomBatchResponse);
     });
@@ -17942,8 +18476,9 @@
   unittest.group('obj-schema-RegionalinventoryCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionalinventoryCustomBatchResponseEntry();
-      var od =
-          api.RegionalinventoryCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionalinventoryCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionalinventoryCustomBatchResponseEntry(
           od as api.RegionalinventoryCustomBatchResponseEntry);
     });
@@ -17952,7 +18487,9 @@
   unittest.group('obj-schema-ReportRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRow();
-      var od = api.ReportRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReportRow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReportRow(od as api.ReportRow);
     });
   });
@@ -17960,7 +18497,9 @@
   unittest.group('obj-schema-RepricingProductReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingProductReport();
-      var od = api.RepricingProductReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingProductReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingProductReport(od as api.RepricingProductReport);
     });
   });
@@ -17969,8 +18508,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingProductReportBuyboxWinningProductStats();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RepricingProductReportBuyboxWinningProductStats.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingProductReportBuyboxWinningProductStats(
           od as api.RepricingProductReportBuyboxWinningProductStats);
     });
@@ -17979,7 +18519,9 @@
   unittest.group('obj-schema-RepricingRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRule();
-      var od = api.RepricingRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRule(od as api.RepricingRule);
     });
   });
@@ -17987,7 +18529,9 @@
   unittest.group('obj-schema-RepricingRuleCostOfGoodsSaleRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRuleCostOfGoodsSaleRule();
-      var od = api.RepricingRuleCostOfGoodsSaleRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingRuleCostOfGoodsSaleRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRuleCostOfGoodsSaleRule(
           od as api.RepricingRuleCostOfGoodsSaleRule);
     });
@@ -17996,7 +18540,9 @@
   unittest.group('obj-schema-RepricingRuleEffectiveTime', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRuleEffectiveTime();
-      var od = api.RepricingRuleEffectiveTime.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingRuleEffectiveTime.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRuleEffectiveTime(od as api.RepricingRuleEffectiveTime);
     });
   });
@@ -18004,8 +18550,9 @@
   unittest.group('obj-schema-RepricingRuleEffectiveTimeFixedTimePeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRuleEffectiveTimeFixedTimePeriod();
-      var od =
-          api.RepricingRuleEffectiveTimeFixedTimePeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingRuleEffectiveTimeFixedTimePeriod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRuleEffectiveTimeFixedTimePeriod(
           od as api.RepricingRuleEffectiveTimeFixedTimePeriod);
     });
@@ -18014,7 +18561,9 @@
   unittest.group('obj-schema-RepricingRuleEligibleOfferMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRuleEligibleOfferMatcher();
-      var od = api.RepricingRuleEligibleOfferMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingRuleEligibleOfferMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRuleEligibleOfferMatcher(
           od as api.RepricingRuleEligibleOfferMatcher);
     });
@@ -18024,8 +18573,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRuleEligibleOfferMatcherStringMatcher();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RepricingRuleEligibleOfferMatcherStringMatcher.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRuleEligibleOfferMatcherStringMatcher(
           od as api.RepricingRuleEligibleOfferMatcherStringMatcher);
     });
@@ -18034,7 +18584,9 @@
   unittest.group('obj-schema-RepricingRuleReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRuleReport();
-      var od = api.RepricingRuleReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingRuleReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRuleReport(od as api.RepricingRuleReport);
     });
   });
@@ -18042,8 +18594,9 @@
   unittest.group('obj-schema-RepricingRuleReportBuyboxWinningRuleStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRuleReportBuyboxWinningRuleStats();
-      var od =
-          api.RepricingRuleReportBuyboxWinningRuleStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingRuleReportBuyboxWinningRuleStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRuleReportBuyboxWinningRuleStats(
           od as api.RepricingRuleReportBuyboxWinningRuleStats);
     });
@@ -18052,7 +18605,9 @@
   unittest.group('obj-schema-RepricingRuleRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRuleRestriction();
-      var od = api.RepricingRuleRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingRuleRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRuleRestriction(od as api.RepricingRuleRestriction);
     });
   });
@@ -18060,7 +18615,9 @@
   unittest.group('obj-schema-RepricingRuleRestrictionBoundary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRuleRestrictionBoundary();
-      var od = api.RepricingRuleRestrictionBoundary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingRuleRestrictionBoundary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRuleRestrictionBoundary(
           od as api.RepricingRuleRestrictionBoundary);
     });
@@ -18069,7 +18626,9 @@
   unittest.group('obj-schema-RepricingRuleStatsBasedRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepricingRuleStatsBasedRule();
-      var od = api.RepricingRuleStatsBasedRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepricingRuleStatsBasedRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepricingRuleStatsBasedRule(od as api.RepricingRuleStatsBasedRule);
     });
   });
@@ -18077,7 +18636,9 @@
   unittest.group('obj-schema-ReturnAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnAddress();
-      var od = api.ReturnAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnAddress(od as api.ReturnAddress);
     });
   });
@@ -18085,7 +18646,9 @@
   unittest.group('obj-schema-ReturnAddressAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnAddressAddress();
-      var od = api.ReturnAddressAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnAddressAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnAddressAddress(od as api.ReturnAddressAddress);
     });
   });
@@ -18093,7 +18656,9 @@
   unittest.group('obj-schema-ReturnPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnPolicy();
-      var od = api.ReturnPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnPolicy(od as api.ReturnPolicy);
     });
   });
@@ -18101,7 +18666,9 @@
   unittest.group('obj-schema-ReturnPolicyOnline', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnPolicyOnline();
-      var od = api.ReturnPolicyOnline.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnPolicyOnline.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnPolicyOnline(od as api.ReturnPolicyOnline);
     });
   });
@@ -18109,7 +18676,9 @@
   unittest.group('obj-schema-ReturnPolicyOnlinePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnPolicyOnlinePolicy();
-      var od = api.ReturnPolicyOnlinePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnPolicyOnlinePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnPolicyOnlinePolicy(od as api.ReturnPolicyOnlinePolicy);
     });
   });
@@ -18117,7 +18686,9 @@
   unittest.group('obj-schema-ReturnPolicyOnlineRestockingFee', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnPolicyOnlineRestockingFee();
-      var od = api.ReturnPolicyOnlineRestockingFee.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnPolicyOnlineRestockingFee.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnPolicyOnlineRestockingFee(
           od as api.ReturnPolicyOnlineRestockingFee);
     });
@@ -18126,8 +18697,9 @@
   unittest.group('obj-schema-ReturnPolicyOnlineReturnReasonCategoryInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnPolicyOnlineReturnReasonCategoryInfo();
-      var od =
-          api.ReturnPolicyOnlineReturnReasonCategoryInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnPolicyOnlineReturnReasonCategoryInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnPolicyOnlineReturnReasonCategoryInfo(
           od as api.ReturnPolicyOnlineReturnReasonCategoryInfo);
     });
@@ -18136,7 +18708,9 @@
   unittest.group('obj-schema-ReturnPolicyOnlineReturnShippingFee', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnPolicyOnlineReturnShippingFee();
-      var od = api.ReturnPolicyOnlineReturnShippingFee.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnPolicyOnlineReturnShippingFee.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnPolicyOnlineReturnShippingFee(
           od as api.ReturnPolicyOnlineReturnShippingFee);
     });
@@ -18145,7 +18719,9 @@
   unittest.group('obj-schema-ReturnPolicyPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnPolicyPolicy();
-      var od = api.ReturnPolicyPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnPolicyPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnPolicyPolicy(od as api.ReturnPolicyPolicy);
     });
   });
@@ -18153,7 +18729,9 @@
   unittest.group('obj-schema-ReturnPolicySeasonalOverride', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnPolicySeasonalOverride();
-      var od = api.ReturnPolicySeasonalOverride.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnPolicySeasonalOverride.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnPolicySeasonalOverride(od as api.ReturnPolicySeasonalOverride);
     });
   });
@@ -18161,7 +18739,9 @@
   unittest.group('obj-schema-ReturnPricingInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnPricingInfo();
-      var od = api.ReturnPricingInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnPricingInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnPricingInfo(od as api.ReturnPricingInfo);
     });
   });
@@ -18169,7 +18749,9 @@
   unittest.group('obj-schema-ReturnShipment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnShipment();
-      var od = api.ReturnShipment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnShipment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnShipment(od as api.ReturnShipment);
     });
   });
@@ -18177,7 +18759,9 @@
   unittest.group('obj-schema-ReturnaddressCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnaddressCustomBatchRequest();
-      var od = api.ReturnaddressCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnaddressCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnaddressCustomBatchRequest(
           od as api.ReturnaddressCustomBatchRequest);
     });
@@ -18186,7 +18770,9 @@
   unittest.group('obj-schema-ReturnaddressCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnaddressCustomBatchRequestEntry();
-      var od = api.ReturnaddressCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnaddressCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnaddressCustomBatchRequestEntry(
           od as api.ReturnaddressCustomBatchRequestEntry);
     });
@@ -18195,7 +18781,9 @@
   unittest.group('obj-schema-ReturnaddressCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnaddressCustomBatchResponse();
-      var od = api.ReturnaddressCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnaddressCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnaddressCustomBatchResponse(
           od as api.ReturnaddressCustomBatchResponse);
     });
@@ -18204,7 +18792,9 @@
   unittest.group('obj-schema-ReturnaddressCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnaddressCustomBatchResponseEntry();
-      var od = api.ReturnaddressCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnaddressCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnaddressCustomBatchResponseEntry(
           od as api.ReturnaddressCustomBatchResponseEntry);
     });
@@ -18213,7 +18803,9 @@
   unittest.group('obj-schema-ReturnaddressListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnaddressListResponse();
-      var od = api.ReturnaddressListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnaddressListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnaddressListResponse(od as api.ReturnaddressListResponse);
     });
   });
@@ -18221,7 +18813,9 @@
   unittest.group('obj-schema-ReturnpolicyCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnpolicyCustomBatchRequest();
-      var od = api.ReturnpolicyCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnpolicyCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnpolicyCustomBatchRequest(
           od as api.ReturnpolicyCustomBatchRequest);
     });
@@ -18230,7 +18824,9 @@
   unittest.group('obj-schema-ReturnpolicyCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnpolicyCustomBatchRequestEntry();
-      var od = api.ReturnpolicyCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnpolicyCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnpolicyCustomBatchRequestEntry(
           od as api.ReturnpolicyCustomBatchRequestEntry);
     });
@@ -18239,7 +18835,9 @@
   unittest.group('obj-schema-ReturnpolicyCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnpolicyCustomBatchResponse();
-      var od = api.ReturnpolicyCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnpolicyCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnpolicyCustomBatchResponse(
           od as api.ReturnpolicyCustomBatchResponse);
     });
@@ -18248,7 +18846,9 @@
   unittest.group('obj-schema-ReturnpolicyCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnpolicyCustomBatchResponseEntry();
-      var od = api.ReturnpolicyCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnpolicyCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnpolicyCustomBatchResponseEntry(
           od as api.ReturnpolicyCustomBatchResponseEntry);
     });
@@ -18257,7 +18857,9 @@
   unittest.group('obj-schema-ReturnpolicyListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReturnpolicyListResponse();
-      var od = api.ReturnpolicyListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReturnpolicyListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReturnpolicyListResponse(od as api.ReturnpolicyListResponse);
     });
   });
@@ -18265,7 +18867,8 @@
   unittest.group('obj-schema-Row', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRow();
-      var od = api.Row.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Row.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRow(od as api.Row);
     });
   });
@@ -18273,7 +18876,9 @@
   unittest.group('obj-schema-SearchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchRequest();
-      var od = api.SearchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchRequest(od as api.SearchRequest);
     });
   });
@@ -18281,7 +18886,9 @@
   unittest.group('obj-schema-SearchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchResponse();
-      var od = api.SearchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchResponse(od as api.SearchResponse);
     });
   });
@@ -18289,7 +18896,9 @@
   unittest.group('obj-schema-Segments', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegments();
-      var od = api.Segments.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Segments.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSegments(od as api.Segments);
     });
   });
@@ -18297,7 +18906,9 @@
   unittest.group('obj-schema-Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildService();
-      var od = api.Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Service.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkService(od as api.Service);
     });
   });
@@ -18305,7 +18916,9 @@
   unittest.group('obj-schema-SettlementReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettlementReport();
-      var od = api.SettlementReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SettlementReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSettlementReport(od as api.SettlementReport);
     });
   });
@@ -18313,7 +18926,9 @@
   unittest.group('obj-schema-SettlementTransaction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettlementTransaction();
-      var od = api.SettlementTransaction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SettlementTransaction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSettlementTransaction(od as api.SettlementTransaction);
     });
   });
@@ -18321,7 +18936,9 @@
   unittest.group('obj-schema-SettlementTransactionAmount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettlementTransactionAmount();
-      var od = api.SettlementTransactionAmount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SettlementTransactionAmount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSettlementTransactionAmount(od as api.SettlementTransactionAmount);
     });
   });
@@ -18329,7 +18946,9 @@
   unittest.group('obj-schema-SettlementTransactionAmountCommission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettlementTransactionAmountCommission();
-      var od = api.SettlementTransactionAmountCommission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SettlementTransactionAmountCommission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSettlementTransactionAmountCommission(
           od as api.SettlementTransactionAmountCommission);
     });
@@ -18338,7 +18957,9 @@
   unittest.group('obj-schema-SettlementTransactionIdentifiers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettlementTransactionIdentifiers();
-      var od = api.SettlementTransactionIdentifiers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SettlementTransactionIdentifiers.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSettlementTransactionIdentifiers(
           od as api.SettlementTransactionIdentifiers);
     });
@@ -18347,7 +18968,9 @@
   unittest.group('obj-schema-SettlementTransactionTransaction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettlementTransactionTransaction();
-      var od = api.SettlementTransactionTransaction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SettlementTransactionTransaction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSettlementTransactionTransaction(
           od as api.SettlementTransactionTransaction);
     });
@@ -18356,7 +18979,9 @@
   unittest.group('obj-schema-SettlementreportsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettlementreportsListResponse();
-      var od = api.SettlementreportsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SettlementreportsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSettlementreportsListResponse(
           od as api.SettlementreportsListResponse);
     });
@@ -18365,7 +18990,9 @@
   unittest.group('obj-schema-SettlementtransactionsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettlementtransactionsListResponse();
-      var od = api.SettlementtransactionsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SettlementtransactionsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSettlementtransactionsListResponse(
           od as api.SettlementtransactionsListResponse);
     });
@@ -18374,7 +19001,9 @@
   unittest.group('obj-schema-ShipmentInvoice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShipmentInvoice();
-      var od = api.ShipmentInvoice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShipmentInvoice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShipmentInvoice(od as api.ShipmentInvoice);
     });
   });
@@ -18382,7 +19011,9 @@
   unittest.group('obj-schema-ShipmentInvoiceLineItemInvoice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShipmentInvoiceLineItemInvoice();
-      var od = api.ShipmentInvoiceLineItemInvoice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShipmentInvoiceLineItemInvoice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShipmentInvoiceLineItemInvoice(
           od as api.ShipmentInvoiceLineItemInvoice);
     });
@@ -18391,7 +19022,9 @@
   unittest.group('obj-schema-ShipmentTrackingInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShipmentTrackingInfo();
-      var od = api.ShipmentTrackingInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShipmentTrackingInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShipmentTrackingInfo(od as api.ShipmentTrackingInfo);
     });
   });
@@ -18399,7 +19032,9 @@
   unittest.group('obj-schema-ShippingSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShippingSettings();
-      var od = api.ShippingSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShippingSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShippingSettings(od as api.ShippingSettings);
     });
   });
@@ -18407,7 +19042,9 @@
   unittest.group('obj-schema-ShippingsettingsCustomBatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShippingsettingsCustomBatchRequest();
-      var od = api.ShippingsettingsCustomBatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShippingsettingsCustomBatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShippingsettingsCustomBatchRequest(
           od as api.ShippingsettingsCustomBatchRequest);
     });
@@ -18416,7 +19053,9 @@
   unittest.group('obj-schema-ShippingsettingsCustomBatchRequestEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShippingsettingsCustomBatchRequestEntry();
-      var od = api.ShippingsettingsCustomBatchRequestEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShippingsettingsCustomBatchRequestEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShippingsettingsCustomBatchRequestEntry(
           od as api.ShippingsettingsCustomBatchRequestEntry);
     });
@@ -18425,7 +19064,9 @@
   unittest.group('obj-schema-ShippingsettingsCustomBatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShippingsettingsCustomBatchResponse();
-      var od = api.ShippingsettingsCustomBatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShippingsettingsCustomBatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShippingsettingsCustomBatchResponse(
           od as api.ShippingsettingsCustomBatchResponse);
     });
@@ -18434,8 +19075,9 @@
   unittest.group('obj-schema-ShippingsettingsCustomBatchResponseEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShippingsettingsCustomBatchResponseEntry();
-      var od =
-          api.ShippingsettingsCustomBatchResponseEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShippingsettingsCustomBatchResponseEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShippingsettingsCustomBatchResponseEntry(
           od as api.ShippingsettingsCustomBatchResponseEntry);
     });
@@ -18444,8 +19086,9 @@
   unittest.group('obj-schema-ShippingsettingsGetSupportedCarriersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShippingsettingsGetSupportedCarriersResponse();
-      var od =
-          api.ShippingsettingsGetSupportedCarriersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShippingsettingsGetSupportedCarriersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShippingsettingsGetSupportedCarriersResponse(
           od as api.ShippingsettingsGetSupportedCarriersResponse);
     });
@@ -18454,8 +19097,9 @@
   unittest.group('obj-schema-ShippingsettingsGetSupportedHolidaysResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShippingsettingsGetSupportedHolidaysResponse();
-      var od =
-          api.ShippingsettingsGetSupportedHolidaysResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShippingsettingsGetSupportedHolidaysResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShippingsettingsGetSupportedHolidaysResponse(
           od as api.ShippingsettingsGetSupportedHolidaysResponse);
     });
@@ -18465,8 +19109,9 @@
       'obj-schema-ShippingsettingsGetSupportedPickupServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShippingsettingsGetSupportedPickupServicesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ShippingsettingsGetSupportedPickupServicesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkShippingsettingsGetSupportedPickupServicesResponse(
           od as api.ShippingsettingsGetSupportedPickupServicesResponse);
     });
@@ -18475,7 +19120,9 @@
   unittest.group('obj-schema-ShippingsettingsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShippingsettingsListResponse();
-      var od = api.ShippingsettingsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShippingsettingsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShippingsettingsListResponse(od as api.ShippingsettingsListResponse);
     });
   });
@@ -18483,7 +19130,8 @@
   unittest.group('obj-schema-Table', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTable();
-      var od = api.Table.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Table.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTable(od as api.Table);
     });
   });
@@ -18491,7 +19139,9 @@
   unittest.group('obj-schema-TestOrder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestOrder();
-      var od = api.TestOrder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestOrder.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestOrder(od as api.TestOrder);
     });
   });
@@ -18499,7 +19149,9 @@
   unittest.group('obj-schema-TestOrderAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestOrderAddress();
-      var od = api.TestOrderAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestOrderAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestOrderAddress(od as api.TestOrderAddress);
     });
   });
@@ -18507,7 +19159,9 @@
   unittest.group('obj-schema-TestOrderDeliveryDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestOrderDeliveryDetails();
-      var od = api.TestOrderDeliveryDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestOrderDeliveryDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestOrderDeliveryDetails(od as api.TestOrderDeliveryDetails);
     });
   });
@@ -18515,7 +19169,9 @@
   unittest.group('obj-schema-TestOrderLineItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestOrderLineItem();
-      var od = api.TestOrderLineItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestOrderLineItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestOrderLineItem(od as api.TestOrderLineItem);
     });
   });
@@ -18523,7 +19179,9 @@
   unittest.group('obj-schema-TestOrderLineItemProduct', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestOrderLineItemProduct();
-      var od = api.TestOrderLineItemProduct.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestOrderLineItemProduct.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestOrderLineItemProduct(od as api.TestOrderLineItemProduct);
     });
   });
@@ -18531,7 +19189,9 @@
   unittest.group('obj-schema-TestOrderPickupDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestOrderPickupDetails();
-      var od = api.TestOrderPickupDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestOrderPickupDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestOrderPickupDetails(od as api.TestOrderPickupDetails);
     });
   });
@@ -18539,7 +19199,9 @@
   unittest.group('obj-schema-TestOrderPickupDetailsPickupPerson', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestOrderPickupDetailsPickupPerson();
-      var od = api.TestOrderPickupDetailsPickupPerson.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestOrderPickupDetailsPickupPerson.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestOrderPickupDetailsPickupPerson(
           od as api.TestOrderPickupDetailsPickupPerson);
     });
@@ -18548,7 +19210,9 @@
   unittest.group('obj-schema-TimeZone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeZone();
-      var od = api.TimeZone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeZone.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeZone(od as api.TimeZone);
     });
   });
@@ -18556,7 +19220,9 @@
   unittest.group('obj-schema-TransitTable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransitTable();
-      var od = api.TransitTable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransitTable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransitTable(od as api.TransitTable);
     });
   });
@@ -18564,7 +19230,9 @@
   unittest.group('obj-schema-TransitTableTransitTimeRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransitTableTransitTimeRow();
-      var od = api.TransitTableTransitTimeRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransitTableTransitTimeRow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransitTableTransitTimeRow(od as api.TransitTableTransitTimeRow);
     });
   });
@@ -18572,8 +19240,9 @@
   unittest.group('obj-schema-TransitTableTransitTimeRowTransitTimeValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransitTableTransitTimeRowTransitTimeValue();
-      var od =
-          api.TransitTableTransitTimeRowTransitTimeValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransitTableTransitTimeRowTransitTimeValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransitTableTransitTimeRowTransitTimeValue(
           od as api.TransitTableTransitTimeRowTransitTimeValue);
     });
@@ -18582,7 +19251,9 @@
   unittest.group('obj-schema-UnitInvoice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnitInvoice();
-      var od = api.UnitInvoice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnitInvoice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnitInvoice(od as api.UnitInvoice);
     });
   });
@@ -18590,7 +19261,9 @@
   unittest.group('obj-schema-UnitInvoiceAdditionalCharge', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnitInvoiceAdditionalCharge();
-      var od = api.UnitInvoiceAdditionalCharge.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnitInvoiceAdditionalCharge.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnitInvoiceAdditionalCharge(od as api.UnitInvoiceAdditionalCharge);
     });
   });
@@ -18598,7 +19271,9 @@
   unittest.group('obj-schema-UnitInvoiceTaxLine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnitInvoiceTaxLine();
-      var od = api.UnitInvoiceTaxLine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnitInvoiceTaxLine.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnitInvoiceTaxLine(od as api.UnitInvoiceTaxLine);
     });
   });
@@ -18606,7 +19281,8 @@
   unittest.group('obj-schema-Value', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValue();
-      var od = api.Value.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Value.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkValue(od as api.Value);
     });
   });
@@ -18614,7 +19290,9 @@
   unittest.group('obj-schema-Weight', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWeight();
-      var od = api.Weight.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Weight.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWeight(od as api.Weight);
     });
   });
diff --git a/generated/googleapis/test/customsearch/v1_test.dart b/generated/googleapis/test/customsearch/v1_test.dart
index 2c89752..ffaf5c9 100644
--- a/generated/googleapis/test/customsearch/v1_test.dart
+++ b/generated/googleapis/test/customsearch/v1_test.dart
@@ -1235,7 +1235,9 @@
   unittest.group('obj-schema-PromotionBodyLines', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPromotionBodyLines();
-      var od = api.PromotionBodyLines.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PromotionBodyLines.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPromotionBodyLines(od as api.PromotionBodyLines);
     });
   });
@@ -1243,7 +1245,9 @@
   unittest.group('obj-schema-PromotionImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPromotionImage();
-      var od = api.PromotionImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PromotionImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPromotionImage(od as api.PromotionImage);
     });
   });
@@ -1251,7 +1255,9 @@
   unittest.group('obj-schema-Promotion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPromotion();
-      var od = api.Promotion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Promotion.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPromotion(od as api.Promotion);
     });
   });
@@ -1259,7 +1265,9 @@
   unittest.group('obj-schema-ResultImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultImage();
-      var od = api.ResultImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultImage(od as api.ResultImage);
     });
   });
@@ -1267,7 +1275,9 @@
   unittest.group('obj-schema-ResultLabels', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultLabels();
-      var od = api.ResultLabels.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultLabels.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultLabels(od as api.ResultLabels);
     });
   });
@@ -1275,7 +1285,9 @@
   unittest.group('obj-schema-Result', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResult();
-      var od = api.Result.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Result.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResult(od as api.Result);
     });
   });
@@ -1283,7 +1295,9 @@
   unittest.group('obj-schema-SearchQueriesNextPage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchQueriesNextPage();
-      var od = api.SearchQueriesNextPage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchQueriesNextPage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchQueriesNextPage(od as api.SearchQueriesNextPage);
     });
   });
@@ -1291,7 +1305,9 @@
   unittest.group('obj-schema-SearchQueriesPreviousPage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchQueriesPreviousPage();
-      var od = api.SearchQueriesPreviousPage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchQueriesPreviousPage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchQueriesPreviousPage(od as api.SearchQueriesPreviousPage);
     });
   });
@@ -1299,7 +1315,9 @@
   unittest.group('obj-schema-SearchQueriesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchQueriesRequest();
-      var od = api.SearchQueriesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchQueriesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchQueriesRequest(od as api.SearchQueriesRequest);
     });
   });
@@ -1307,7 +1325,9 @@
   unittest.group('obj-schema-SearchQueries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchQueries();
-      var od = api.SearchQueries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchQueries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchQueries(od as api.SearchQueries);
     });
   });
@@ -1315,7 +1335,9 @@
   unittest.group('obj-schema-SearchSearchInformation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchSearchInformation();
-      var od = api.SearchSearchInformation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchSearchInformation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchSearchInformation(od as api.SearchSearchInformation);
     });
   });
@@ -1323,7 +1345,9 @@
   unittest.group('obj-schema-SearchSpelling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchSpelling();
-      var od = api.SearchSpelling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchSpelling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchSpelling(od as api.SearchSpelling);
     });
   });
@@ -1331,7 +1355,9 @@
   unittest.group('obj-schema-SearchUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchUrl();
-      var od = api.SearchUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SearchUrl.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSearchUrl(od as api.SearchUrl);
     });
   });
@@ -1339,7 +1365,9 @@
   unittest.group('obj-schema-Search', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearch();
-      var od = api.Search.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Search.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSearch(od as api.Search);
     });
   });
diff --git a/generated/googleapis/test/datafusion/v1_test.dart b/generated/googleapis/test/datafusion/v1_test.dart
index 9733ad2..cc83d12 100644
--- a/generated/googleapis/test/datafusion/v1_test.dart
+++ b/generated/googleapis/test/datafusion/v1_test.dart
@@ -1230,7 +1230,9 @@
   unittest.group('obj-schema-Accelerator', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccelerator();
-      var od = api.Accelerator.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Accelerator.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccelerator(od as api.Accelerator);
     });
   });
@@ -1238,7 +1240,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1246,7 +1250,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1254,7 +1260,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1262,7 +1270,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -1270,7 +1280,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1278,7 +1289,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1286,7 +1298,9 @@
   unittest.group('obj-schema-Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstance();
-      var od = api.Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Instance.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstance(od as api.Instance);
     });
   });
@@ -1294,7 +1308,9 @@
   unittest.group('obj-schema-ListAvailableVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAvailableVersionsResponse();
-      var od = api.ListAvailableVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAvailableVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAvailableVersionsResponse(
           od as api.ListAvailableVersionsResponse);
     });
@@ -1303,7 +1319,9 @@
   unittest.group('obj-schema-ListInstancesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInstancesResponse();
-      var od = api.ListInstancesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInstancesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
@@ -1311,7 +1329,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1319,7 +1339,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1327,7 +1349,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1335,7 +1359,9 @@
   unittest.group('obj-schema-NetworkConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkConfig();
-      var od = api.NetworkConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkConfig(od as api.NetworkConfig);
     });
   });
@@ -1343,7 +1369,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1351,7 +1379,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -1359,7 +1389,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1367,7 +1399,9 @@
   unittest.group('obj-schema-RestartInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestartInstanceRequest();
-      var od = api.RestartInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestartInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestartInstanceRequest(od as api.RestartInstanceRequest);
     });
   });
@@ -1375,7 +1409,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1383,7 +1419,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1391,7 +1429,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1399,7 +1439,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -1407,7 +1449,9 @@
   unittest.group('obj-schema-Version', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVersion();
-      var od = api.Version.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Version.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVersion(od as api.Version);
     });
   });
diff --git a/generated/googleapis/test/dataproc/v1_test.dart b/generated/googleapis/test/dataproc/v1_test.dart
index 0203592..bca4ae6 100644
--- a/generated/googleapis/test/dataproc/v1_test.dart
+++ b/generated/googleapis/test/dataproc/v1_test.dart
@@ -4100,7 +4100,9 @@
   unittest.group('obj-schema-AcceleratorConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorConfig();
-      var od = api.AcceleratorConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorConfig(od as api.AcceleratorConfig);
     });
   });
@@ -4108,7 +4110,9 @@
   unittest.group('obj-schema-AutoscalingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalingConfig();
-      var od = api.AutoscalingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalingConfig(od as api.AutoscalingConfig);
     });
   });
@@ -4116,7 +4120,9 @@
   unittest.group('obj-schema-AutoscalingPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalingPolicy();
-      var od = api.AutoscalingPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalingPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalingPolicy(od as api.AutoscalingPolicy);
     });
   });
@@ -4124,7 +4130,9 @@
   unittest.group('obj-schema-BasicAutoscalingAlgorithm', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicAutoscalingAlgorithm();
-      var od = api.BasicAutoscalingAlgorithm.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicAutoscalingAlgorithm.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicAutoscalingAlgorithm(od as api.BasicAutoscalingAlgorithm);
     });
   });
@@ -4132,7 +4140,9 @@
   unittest.group('obj-schema-BasicYarnAutoscalingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicYarnAutoscalingConfig();
-      var od = api.BasicYarnAutoscalingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicYarnAutoscalingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicYarnAutoscalingConfig(od as api.BasicYarnAutoscalingConfig);
     });
   });
@@ -4140,7 +4150,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -4148,7 +4160,9 @@
   unittest.group('obj-schema-CancelJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelJobRequest();
-      var od = api.CancelJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelJobRequest(od as api.CancelJobRequest);
     });
   });
@@ -4156,7 +4170,9 @@
   unittest.group('obj-schema-Cluster', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCluster();
-      var od = api.Cluster.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Cluster.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCluster(od as api.Cluster);
     });
   });
@@ -4164,7 +4180,9 @@
   unittest.group('obj-schema-ClusterConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterConfig();
-      var od = api.ClusterConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterConfig(od as api.ClusterConfig);
     });
   });
@@ -4172,7 +4190,9 @@
   unittest.group('obj-schema-ClusterMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterMetrics();
-      var od = api.ClusterMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterMetrics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterMetrics(od as api.ClusterMetrics);
     });
   });
@@ -4180,7 +4200,9 @@
   unittest.group('obj-schema-ClusterOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterOperation();
-      var od = api.ClusterOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterOperation(od as api.ClusterOperation);
     });
   });
@@ -4188,7 +4210,9 @@
   unittest.group('obj-schema-ClusterOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterOperationMetadata();
-      var od = api.ClusterOperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterOperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterOperationMetadata(od as api.ClusterOperationMetadata);
     });
   });
@@ -4196,7 +4220,9 @@
   unittest.group('obj-schema-ClusterOperationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterOperationStatus();
-      var od = api.ClusterOperationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterOperationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterOperationStatus(od as api.ClusterOperationStatus);
     });
   });
@@ -4204,7 +4230,9 @@
   unittest.group('obj-schema-ClusterSelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterSelector();
-      var od = api.ClusterSelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterSelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterSelector(od as api.ClusterSelector);
     });
   });
@@ -4212,7 +4240,9 @@
   unittest.group('obj-schema-ClusterStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterStatus();
-      var od = api.ClusterStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterStatus(od as api.ClusterStatus);
     });
   });
@@ -4220,7 +4250,9 @@
   unittest.group('obj-schema-DiagnoseClusterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiagnoseClusterRequest();
-      var od = api.DiagnoseClusterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiagnoseClusterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiagnoseClusterRequest(od as api.DiagnoseClusterRequest);
     });
   });
@@ -4228,7 +4260,9 @@
   unittest.group('obj-schema-DiagnoseClusterResults', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiagnoseClusterResults();
-      var od = api.DiagnoseClusterResults.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiagnoseClusterResults.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiagnoseClusterResults(od as api.DiagnoseClusterResults);
     });
   });
@@ -4236,7 +4270,9 @@
   unittest.group('obj-schema-DiskConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskConfig();
-      var od = api.DiskConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DiskConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDiskConfig(od as api.DiskConfig);
     });
   });
@@ -4244,7 +4280,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -4252,7 +4289,9 @@
   unittest.group('obj-schema-EncryptionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncryptionConfig();
-      var od = api.EncryptionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EncryptionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEncryptionConfig(od as api.EncryptionConfig);
     });
   });
@@ -4260,7 +4299,9 @@
   unittest.group('obj-schema-EndpointConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndpointConfig();
-      var od = api.EndpointConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EndpointConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEndpointConfig(od as api.EndpointConfig);
     });
   });
@@ -4268,7 +4309,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -4276,7 +4318,9 @@
   unittest.group('obj-schema-GceClusterConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGceClusterConfig();
-      var od = api.GceClusterConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GceClusterConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGceClusterConfig(od as api.GceClusterConfig);
     });
   });
@@ -4284,7 +4328,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -4292,7 +4338,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -4300,7 +4348,9 @@
   unittest.group('obj-schema-HadoopJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHadoopJob();
-      var od = api.HadoopJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HadoopJob.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHadoopJob(od as api.HadoopJob);
     });
   });
@@ -4308,7 +4358,9 @@
   unittest.group('obj-schema-HiveJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHiveJob();
-      var od = api.HiveJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HiveJob.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHiveJob(od as api.HiveJob);
     });
   });
@@ -4316,7 +4368,9 @@
   unittest.group('obj-schema-InjectCredentialsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInjectCredentialsRequest();
-      var od = api.InjectCredentialsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InjectCredentialsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInjectCredentialsRequest(od as api.InjectCredentialsRequest);
     });
   });
@@ -4324,7 +4378,9 @@
   unittest.group('obj-schema-InstanceGroupAutoscalingPolicyConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupAutoscalingPolicyConfig();
-      var od = api.InstanceGroupAutoscalingPolicyConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupAutoscalingPolicyConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupAutoscalingPolicyConfig(
           od as api.InstanceGroupAutoscalingPolicyConfig);
     });
@@ -4333,7 +4389,9 @@
   unittest.group('obj-schema-InstanceGroupConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceGroupConfig();
-      var od = api.InstanceGroupConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceGroupConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceGroupConfig(od as api.InstanceGroupConfig);
     });
   });
@@ -4341,7 +4399,9 @@
   unittest.group('obj-schema-InstanceReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceReference();
-      var od = api.InstanceReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceReference(od as api.InstanceReference);
     });
   });
@@ -4349,7 +4409,9 @@
   unittest.group('obj-schema-InstantiateWorkflowTemplateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstantiateWorkflowTemplateRequest();
-      var od = api.InstantiateWorkflowTemplateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstantiateWorkflowTemplateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstantiateWorkflowTemplateRequest(
           od as api.InstantiateWorkflowTemplateRequest);
     });
@@ -4358,7 +4420,8 @@
   unittest.group('obj-schema-Job', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJob();
-      var od = api.Job.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Job.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJob(od as api.Job);
     });
   });
@@ -4366,7 +4429,9 @@
   unittest.group('obj-schema-JobMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobMetadata();
-      var od = api.JobMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobMetadata(od as api.JobMetadata);
     });
   });
@@ -4374,7 +4439,9 @@
   unittest.group('obj-schema-JobPlacement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobPlacement();
-      var od = api.JobPlacement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobPlacement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobPlacement(od as api.JobPlacement);
     });
   });
@@ -4382,7 +4449,9 @@
   unittest.group('obj-schema-JobReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobReference();
-      var od = api.JobReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobReference(od as api.JobReference);
     });
   });
@@ -4390,7 +4459,9 @@
   unittest.group('obj-schema-JobScheduling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobScheduling();
-      var od = api.JobScheduling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobScheduling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobScheduling(od as api.JobScheduling);
     });
   });
@@ -4398,7 +4469,9 @@
   unittest.group('obj-schema-JobStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobStatus();
-      var od = api.JobStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobStatus.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobStatus(od as api.JobStatus);
     });
   });
@@ -4406,7 +4479,9 @@
   unittest.group('obj-schema-KerberosConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKerberosConfig();
-      var od = api.KerberosConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KerberosConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKerberosConfig(od as api.KerberosConfig);
     });
   });
@@ -4414,7 +4489,9 @@
   unittest.group('obj-schema-LifecycleConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLifecycleConfig();
-      var od = api.LifecycleConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LifecycleConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLifecycleConfig(od as api.LifecycleConfig);
     });
   });
@@ -4422,7 +4499,9 @@
   unittest.group('obj-schema-ListAutoscalingPoliciesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAutoscalingPoliciesResponse();
-      var od = api.ListAutoscalingPoliciesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAutoscalingPoliciesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAutoscalingPoliciesResponse(
           od as api.ListAutoscalingPoliciesResponse);
     });
@@ -4431,7 +4510,9 @@
   unittest.group('obj-schema-ListClustersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListClustersResponse();
-      var od = api.ListClustersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListClustersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListClustersResponse(od as api.ListClustersResponse);
     });
   });
@@ -4439,7 +4520,9 @@
   unittest.group('obj-schema-ListJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListJobsResponse();
-      var od = api.ListJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
@@ -4447,7 +4530,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -4455,7 +4540,9 @@
   unittest.group('obj-schema-ListWorkflowTemplatesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListWorkflowTemplatesResponse();
-      var od = api.ListWorkflowTemplatesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListWorkflowTemplatesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListWorkflowTemplatesResponse(
           od as api.ListWorkflowTemplatesResponse);
     });
@@ -4464,7 +4551,9 @@
   unittest.group('obj-schema-LoggingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLoggingConfig();
-      var od = api.LoggingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LoggingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLoggingConfig(od as api.LoggingConfig);
     });
   });
@@ -4472,7 +4561,9 @@
   unittest.group('obj-schema-ManagedCluster', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedCluster();
-      var od = api.ManagedCluster.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedCluster.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedCluster(od as api.ManagedCluster);
     });
   });
@@ -4480,7 +4571,9 @@
   unittest.group('obj-schema-ManagedGroupConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedGroupConfig();
-      var od = api.ManagedGroupConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedGroupConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedGroupConfig(od as api.ManagedGroupConfig);
     });
   });
@@ -4488,7 +4581,9 @@
   unittest.group('obj-schema-MetastoreConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetastoreConfig();
-      var od = api.MetastoreConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetastoreConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetastoreConfig(od as api.MetastoreConfig);
     });
   });
@@ -4496,7 +4591,9 @@
   unittest.group('obj-schema-NodeGroupAffinity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeGroupAffinity();
-      var od = api.NodeGroupAffinity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeGroupAffinity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeGroupAffinity(od as api.NodeGroupAffinity);
     });
   });
@@ -4504,7 +4601,9 @@
   unittest.group('obj-schema-NodeInitializationAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeInitializationAction();
-      var od = api.NodeInitializationAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeInitializationAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeInitializationAction(od as api.NodeInitializationAction);
     });
   });
@@ -4512,7 +4611,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -4520,7 +4621,9 @@
   unittest.group('obj-schema-OrderedJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderedJob();
-      var od = api.OrderedJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OrderedJob.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrderedJob(od as api.OrderedJob);
     });
   });
@@ -4528,7 +4631,9 @@
   unittest.group('obj-schema-ParameterValidation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParameterValidation();
-      var od = api.ParameterValidation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParameterValidation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParameterValidation(od as api.ParameterValidation);
     });
   });
@@ -4536,7 +4641,9 @@
   unittest.group('obj-schema-PigJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPigJob();
-      var od = api.PigJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PigJob.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPigJob(od as api.PigJob);
     });
   });
@@ -4544,7 +4651,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -4552,7 +4661,9 @@
   unittest.group('obj-schema-PrestoJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrestoJob();
-      var od = api.PrestoJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PrestoJob.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPrestoJob(od as api.PrestoJob);
     });
   });
@@ -4560,7 +4671,9 @@
   unittest.group('obj-schema-PySparkJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPySparkJob();
-      var od = api.PySparkJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PySparkJob.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPySparkJob(od as api.PySparkJob);
     });
   });
@@ -4568,7 +4681,9 @@
   unittest.group('obj-schema-QueryList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryList();
-      var od = api.QueryList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.QueryList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQueryList(od as api.QueryList);
     });
   });
@@ -4576,7 +4691,9 @@
   unittest.group('obj-schema-RegexValidation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegexValidation();
-      var od = api.RegexValidation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegexValidation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegexValidation(od as api.RegexValidation);
     });
   });
@@ -4584,7 +4701,9 @@
   unittest.group('obj-schema-ReservationAffinity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReservationAffinity();
-      var od = api.ReservationAffinity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReservationAffinity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReservationAffinity(od as api.ReservationAffinity);
     });
   });
@@ -4592,7 +4711,9 @@
   unittest.group('obj-schema-SecurityConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityConfig();
-      var od = api.SecurityConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityConfig(od as api.SecurityConfig);
     });
   });
@@ -4600,7 +4721,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -4608,7 +4731,9 @@
   unittest.group('obj-schema-ShieldedInstanceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShieldedInstanceConfig();
-      var od = api.ShieldedInstanceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShieldedInstanceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShieldedInstanceConfig(od as api.ShieldedInstanceConfig);
     });
   });
@@ -4616,7 +4741,9 @@
   unittest.group('obj-schema-SoftwareConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSoftwareConfig();
-      var od = api.SoftwareConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SoftwareConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSoftwareConfig(od as api.SoftwareConfig);
     });
   });
@@ -4624,7 +4751,9 @@
   unittest.group('obj-schema-SparkJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSparkJob();
-      var od = api.SparkJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SparkJob.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSparkJob(od as api.SparkJob);
     });
   });
@@ -4632,7 +4761,9 @@
   unittest.group('obj-schema-SparkRJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSparkRJob();
-      var od = api.SparkRJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SparkRJob.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSparkRJob(od as api.SparkRJob);
     });
   });
@@ -4640,7 +4771,9 @@
   unittest.group('obj-schema-SparkSqlJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSparkSqlJob();
-      var od = api.SparkSqlJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SparkSqlJob.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSparkSqlJob(od as api.SparkSqlJob);
     });
   });
@@ -4648,7 +4781,9 @@
   unittest.group('obj-schema-StartClusterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartClusterRequest();
-      var od = api.StartClusterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartClusterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartClusterRequest(od as api.StartClusterRequest);
     });
   });
@@ -4656,7 +4791,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4664,7 +4801,9 @@
   unittest.group('obj-schema-StopClusterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStopClusterRequest();
-      var od = api.StopClusterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StopClusterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStopClusterRequest(od as api.StopClusterRequest);
     });
   });
@@ -4672,7 +4811,9 @@
   unittest.group('obj-schema-SubmitJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubmitJobRequest();
-      var od = api.SubmitJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubmitJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubmitJobRequest(od as api.SubmitJobRequest);
     });
   });
@@ -4680,7 +4821,9 @@
   unittest.group('obj-schema-TemplateParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTemplateParameter();
-      var od = api.TemplateParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TemplateParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTemplateParameter(od as api.TemplateParameter);
     });
   });
@@ -4688,7 +4831,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -4696,7 +4841,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -4704,7 +4851,9 @@
   unittest.group('obj-schema-ValueValidation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValueValidation();
-      var od = api.ValueValidation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValueValidation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValueValidation(od as api.ValueValidation);
     });
   });
@@ -4712,7 +4861,9 @@
   unittest.group('obj-schema-WorkflowGraph', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkflowGraph();
-      var od = api.WorkflowGraph.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkflowGraph.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkflowGraph(od as api.WorkflowGraph);
     });
   });
@@ -4720,7 +4871,9 @@
   unittest.group('obj-schema-WorkflowMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkflowMetadata();
-      var od = api.WorkflowMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkflowMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkflowMetadata(od as api.WorkflowMetadata);
     });
   });
@@ -4728,7 +4881,9 @@
   unittest.group('obj-schema-WorkflowNode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkflowNode();
-      var od = api.WorkflowNode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkflowNode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkflowNode(od as api.WorkflowNode);
     });
   });
@@ -4736,7 +4891,9 @@
   unittest.group('obj-schema-WorkflowTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkflowTemplate();
-      var od = api.WorkflowTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkflowTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkflowTemplate(od as api.WorkflowTemplate);
     });
   });
@@ -4744,7 +4901,9 @@
   unittest.group('obj-schema-WorkflowTemplatePlacement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkflowTemplatePlacement();
-      var od = api.WorkflowTemplatePlacement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkflowTemplatePlacement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkflowTemplatePlacement(od as api.WorkflowTemplatePlacement);
     });
   });
@@ -4752,7 +4911,9 @@
   unittest.group('obj-schema-YarnApplication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildYarnApplication();
-      var od = api.YarnApplication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.YarnApplication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkYarnApplication(od as api.YarnApplication);
     });
   });
diff --git a/generated/googleapis/test/datastore/v1_test.dart b/generated/googleapis/test/datastore/v1_test.dart
index a9be6f3..43461de 100644
--- a/generated/googleapis/test/datastore/v1_test.dart
+++ b/generated/googleapis/test/datastore/v1_test.dart
@@ -2286,7 +2286,9 @@
   unittest.group('obj-schema-AllocateIdsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAllocateIdsRequest();
-      var od = api.AllocateIdsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AllocateIdsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAllocateIdsRequest(od as api.AllocateIdsRequest);
     });
   });
@@ -2294,7 +2296,9 @@
   unittest.group('obj-schema-AllocateIdsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAllocateIdsResponse();
-      var od = api.AllocateIdsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AllocateIdsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAllocateIdsResponse(od as api.AllocateIdsResponse);
     });
   });
@@ -2302,7 +2306,9 @@
   unittest.group('obj-schema-ArrayValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArrayValue();
-      var od = api.ArrayValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ArrayValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkArrayValue(od as api.ArrayValue);
     });
   });
@@ -2310,7 +2316,9 @@
   unittest.group('obj-schema-BeginTransactionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBeginTransactionRequest();
-      var od = api.BeginTransactionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BeginTransactionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBeginTransactionRequest(od as api.BeginTransactionRequest);
     });
   });
@@ -2318,7 +2326,9 @@
   unittest.group('obj-schema-BeginTransactionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBeginTransactionResponse();
-      var od = api.BeginTransactionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BeginTransactionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBeginTransactionResponse(od as api.BeginTransactionResponse);
     });
   });
@@ -2326,7 +2336,9 @@
   unittest.group('obj-schema-CommitRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitRequest();
-      var od = api.CommitRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitRequest(od as api.CommitRequest);
     });
   });
@@ -2334,7 +2346,9 @@
   unittest.group('obj-schema-CommitResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitResponse();
-      var od = api.CommitResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitResponse(od as api.CommitResponse);
     });
   });
@@ -2342,7 +2356,9 @@
   unittest.group('obj-schema-CompositeFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompositeFilter();
-      var od = api.CompositeFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompositeFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompositeFilter(od as api.CompositeFilter);
     });
   });
@@ -2350,7 +2366,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2358,7 +2375,9 @@
   unittest.group('obj-schema-Entity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntity();
-      var od = api.Entity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Entity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEntity(od as api.Entity);
     });
   });
@@ -2366,7 +2385,9 @@
   unittest.group('obj-schema-EntityResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityResult();
-      var od = api.EntityResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntityResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntityResult(od as api.EntityResult);
     });
   });
@@ -2374,7 +2395,9 @@
   unittest.group('obj-schema-Filter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilter();
-      var od = api.Filter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Filter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilter(od as api.Filter);
     });
   });
@@ -2382,7 +2405,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1CommonMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1CommonMetadata();
-      var od = api.GoogleDatastoreAdminV1CommonMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1CommonMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1CommonMetadata(
           od as api.GoogleDatastoreAdminV1CommonMetadata);
     });
@@ -2391,7 +2416,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1EntityFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1EntityFilter();
-      var od = api.GoogleDatastoreAdminV1EntityFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1EntityFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1EntityFilter(
           od as api.GoogleDatastoreAdminV1EntityFilter);
     });
@@ -2400,8 +2427,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1ExportEntitiesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1ExportEntitiesMetadata();
-      var od =
-          api.GoogleDatastoreAdminV1ExportEntitiesMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1ExportEntitiesMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1ExportEntitiesMetadata(
           od as api.GoogleDatastoreAdminV1ExportEntitiesMetadata);
     });
@@ -2410,8 +2438,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1ExportEntitiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1ExportEntitiesRequest();
-      var od =
-          api.GoogleDatastoreAdminV1ExportEntitiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1ExportEntitiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1ExportEntitiesRequest(
           od as api.GoogleDatastoreAdminV1ExportEntitiesRequest);
     });
@@ -2420,8 +2449,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1ExportEntitiesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1ExportEntitiesResponse();
-      var od =
-          api.GoogleDatastoreAdminV1ExportEntitiesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1ExportEntitiesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1ExportEntitiesResponse(
           od as api.GoogleDatastoreAdminV1ExportEntitiesResponse);
     });
@@ -2430,8 +2460,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1ImportEntitiesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1ImportEntitiesMetadata();
-      var od =
-          api.GoogleDatastoreAdminV1ImportEntitiesMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1ImportEntitiesMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1ImportEntitiesMetadata(
           od as api.GoogleDatastoreAdminV1ImportEntitiesMetadata);
     });
@@ -2440,8 +2471,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1ImportEntitiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1ImportEntitiesRequest();
-      var od =
-          api.GoogleDatastoreAdminV1ImportEntitiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1ImportEntitiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1ImportEntitiesRequest(
           od as api.GoogleDatastoreAdminV1ImportEntitiesRequest);
     });
@@ -2450,7 +2482,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1Index', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1Index();
-      var od = api.GoogleDatastoreAdminV1Index.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1Index.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1Index(od as api.GoogleDatastoreAdminV1Index);
     });
   });
@@ -2458,8 +2492,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1IndexOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1IndexOperationMetadata();
-      var od =
-          api.GoogleDatastoreAdminV1IndexOperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1IndexOperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1IndexOperationMetadata(
           od as api.GoogleDatastoreAdminV1IndexOperationMetadata);
     });
@@ -2468,7 +2503,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1IndexedProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1IndexedProperty();
-      var od = api.GoogleDatastoreAdminV1IndexedProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1IndexedProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1IndexedProperty(
           od as api.GoogleDatastoreAdminV1IndexedProperty);
     });
@@ -2477,8 +2514,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1ListIndexesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1ListIndexesResponse();
-      var od =
-          api.GoogleDatastoreAdminV1ListIndexesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1ListIndexesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1ListIndexesResponse(
           od as api.GoogleDatastoreAdminV1ListIndexesResponse);
     });
@@ -2487,7 +2525,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1Progress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1Progress();
-      var od = api.GoogleDatastoreAdminV1Progress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1Progress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1Progress(
           od as api.GoogleDatastoreAdminV1Progress);
     });
@@ -2496,8 +2536,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1beta1CommonMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1beta1CommonMetadata();
-      var od =
-          api.GoogleDatastoreAdminV1beta1CommonMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1beta1CommonMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1beta1CommonMetadata(
           od as api.GoogleDatastoreAdminV1beta1CommonMetadata);
     });
@@ -2506,7 +2547,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1beta1EntityFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1beta1EntityFilter();
-      var od = api.GoogleDatastoreAdminV1beta1EntityFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1beta1EntityFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1beta1EntityFilter(
           od as api.GoogleDatastoreAdminV1beta1EntityFilter);
     });
@@ -2516,8 +2559,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1beta1ExportEntitiesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDatastoreAdminV1beta1ExportEntitiesMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1beta1ExportEntitiesMetadata(
           od as api.GoogleDatastoreAdminV1beta1ExportEntitiesMetadata);
     });
@@ -2527,8 +2571,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1beta1ExportEntitiesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDatastoreAdminV1beta1ExportEntitiesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1beta1ExportEntitiesResponse(
           od as api.GoogleDatastoreAdminV1beta1ExportEntitiesResponse);
     });
@@ -2538,8 +2583,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1beta1ImportEntitiesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDatastoreAdminV1beta1ImportEntitiesMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1beta1ImportEntitiesMetadata(
           od as api.GoogleDatastoreAdminV1beta1ImportEntitiesMetadata);
     });
@@ -2548,7 +2594,9 @@
   unittest.group('obj-schema-GoogleDatastoreAdminV1beta1Progress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDatastoreAdminV1beta1Progress();
-      var od = api.GoogleDatastoreAdminV1beta1Progress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDatastoreAdminV1beta1Progress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDatastoreAdminV1beta1Progress(
           od as api.GoogleDatastoreAdminV1beta1Progress);
     });
@@ -2557,7 +2605,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -2566,7 +2616,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -2574,7 +2626,9 @@
   unittest.group('obj-schema-GqlQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGqlQuery();
-      var od = api.GqlQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GqlQuery.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGqlQuery(od as api.GqlQuery);
     });
   });
@@ -2582,7 +2636,9 @@
   unittest.group('obj-schema-GqlQueryParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGqlQueryParameter();
-      var od = api.GqlQueryParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GqlQueryParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGqlQueryParameter(od as api.GqlQueryParameter);
     });
   });
@@ -2590,7 +2646,8 @@
   unittest.group('obj-schema-Key', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKey();
-      var od = api.Key.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Key.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKey(od as api.Key);
     });
   });
@@ -2598,7 +2655,9 @@
   unittest.group('obj-schema-KindExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKindExpression();
-      var od = api.KindExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KindExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKindExpression(od as api.KindExpression);
     });
   });
@@ -2606,7 +2665,9 @@
   unittest.group('obj-schema-LatLng', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLatLng();
-      var od = api.LatLng.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LatLng.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLatLng(od as api.LatLng);
     });
   });
@@ -2614,7 +2675,9 @@
   unittest.group('obj-schema-LookupRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLookupRequest();
-      var od = api.LookupRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LookupRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLookupRequest(od as api.LookupRequest);
     });
   });
@@ -2622,7 +2685,9 @@
   unittest.group('obj-schema-LookupResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLookupResponse();
-      var od = api.LookupResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LookupResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLookupResponse(od as api.LookupResponse);
     });
   });
@@ -2630,7 +2695,9 @@
   unittest.group('obj-schema-Mutation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMutation();
-      var od = api.Mutation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Mutation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMutation(od as api.Mutation);
     });
   });
@@ -2638,7 +2705,9 @@
   unittest.group('obj-schema-MutationResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMutationResult();
-      var od = api.MutationResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MutationResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMutationResult(od as api.MutationResult);
     });
   });
@@ -2646,7 +2715,9 @@
   unittest.group('obj-schema-PartitionId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionId();
-      var od = api.PartitionId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionId(od as api.PartitionId);
     });
   });
@@ -2654,7 +2725,9 @@
   unittest.group('obj-schema-PathElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathElement();
-      var od = api.PathElement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PathElement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPathElement(od as api.PathElement);
     });
   });
@@ -2662,7 +2735,9 @@
   unittest.group('obj-schema-Projection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjection();
-      var od = api.Projection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Projection.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProjection(od as api.Projection);
     });
   });
@@ -2670,7 +2745,9 @@
   unittest.group('obj-schema-PropertyFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPropertyFilter();
-      var od = api.PropertyFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PropertyFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPropertyFilter(od as api.PropertyFilter);
     });
   });
@@ -2678,7 +2755,9 @@
   unittest.group('obj-schema-PropertyOrder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPropertyOrder();
-      var od = api.PropertyOrder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PropertyOrder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPropertyOrder(od as api.PropertyOrder);
     });
   });
@@ -2686,7 +2765,9 @@
   unittest.group('obj-schema-PropertyReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPropertyReference();
-      var od = api.PropertyReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PropertyReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPropertyReference(od as api.PropertyReference);
     });
   });
@@ -2694,7 +2775,8 @@
   unittest.group('obj-schema-Query', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuery();
-      var od = api.Query.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Query.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuery(od as api.Query);
     });
   });
@@ -2702,7 +2784,9 @@
   unittest.group('obj-schema-QueryResultBatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryResultBatch();
-      var od = api.QueryResultBatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryResultBatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryResultBatch(od as api.QueryResultBatch);
     });
   });
@@ -2710,7 +2794,9 @@
   unittest.group('obj-schema-ReadOnly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadOnly();
-      var od = api.ReadOnly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReadOnly.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReadOnly(od as api.ReadOnly);
     });
   });
@@ -2718,7 +2804,9 @@
   unittest.group('obj-schema-ReadOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadOptions();
-      var od = api.ReadOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReadOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReadOptions(od as api.ReadOptions);
     });
   });
@@ -2726,7 +2814,9 @@
   unittest.group('obj-schema-ReadWrite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadWrite();
-      var od = api.ReadWrite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReadWrite.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReadWrite(od as api.ReadWrite);
     });
   });
@@ -2734,7 +2824,9 @@
   unittest.group('obj-schema-ReserveIdsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReserveIdsRequest();
-      var od = api.ReserveIdsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReserveIdsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReserveIdsRequest(od as api.ReserveIdsRequest);
     });
   });
@@ -2742,7 +2834,9 @@
   unittest.group('obj-schema-ReserveIdsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReserveIdsResponse();
-      var od = api.ReserveIdsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReserveIdsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReserveIdsResponse(od as api.ReserveIdsResponse);
     });
   });
@@ -2750,7 +2844,9 @@
   unittest.group('obj-schema-RollbackRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRollbackRequest();
-      var od = api.RollbackRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RollbackRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRollbackRequest(od as api.RollbackRequest);
     });
   });
@@ -2758,7 +2854,9 @@
   unittest.group('obj-schema-RollbackResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRollbackResponse();
-      var od = api.RollbackResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RollbackResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRollbackResponse(od as api.RollbackResponse);
     });
   });
@@ -2766,7 +2864,9 @@
   unittest.group('obj-schema-RunQueryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunQueryRequest();
-      var od = api.RunQueryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunQueryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunQueryRequest(od as api.RunQueryRequest);
     });
   });
@@ -2774,7 +2874,9 @@
   unittest.group('obj-schema-RunQueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunQueryResponse();
-      var od = api.RunQueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunQueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunQueryResponse(od as api.RunQueryResponse);
     });
   });
@@ -2782,7 +2884,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2790,7 +2894,9 @@
   unittest.group('obj-schema-TransactionOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransactionOptions();
-      var od = api.TransactionOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransactionOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransactionOptions(od as api.TransactionOptions);
     });
   });
@@ -2798,7 +2904,8 @@
   unittest.group('obj-schema-Value', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValue();
-      var od = api.Value.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Value.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkValue(od as api.Value);
     });
   });
diff --git a/generated/googleapis/test/deploymentmanager/v2_test.dart b/generated/googleapis/test/deploymentmanager/v2_test.dart
index db0e70c..13d5a39 100644
--- a/generated/googleapis/test/deploymentmanager/v2_test.dart
+++ b/generated/googleapis/test/deploymentmanager/v2_test.dart
@@ -1608,7 +1608,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1616,7 +1618,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1624,7 +1628,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1632,7 +1638,9 @@
   unittest.group('obj-schema-ConfigFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigFile();
-      var od = api.ConfigFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ConfigFile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkConfigFile(od as api.ConfigFile);
     });
   });
@@ -1640,7 +1648,9 @@
   unittest.group('obj-schema-Deployment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployment();
-      var od = api.Deployment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Deployment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeployment(od as api.Deployment);
     });
   });
@@ -1648,7 +1658,9 @@
   unittest.group('obj-schema-DeploymentLabelEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeploymentLabelEntry();
-      var od = api.DeploymentLabelEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeploymentLabelEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeploymentLabelEntry(od as api.DeploymentLabelEntry);
     });
   });
@@ -1656,7 +1668,9 @@
   unittest.group('obj-schema-DeploymentUpdate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeploymentUpdate();
-      var od = api.DeploymentUpdate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeploymentUpdate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeploymentUpdate(od as api.DeploymentUpdate);
     });
   });
@@ -1664,7 +1678,9 @@
   unittest.group('obj-schema-DeploymentUpdateLabelEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeploymentUpdateLabelEntry();
-      var od = api.DeploymentUpdateLabelEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeploymentUpdateLabelEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeploymentUpdateLabelEntry(od as api.DeploymentUpdateLabelEntry);
     });
   });
@@ -1672,7 +1688,9 @@
   unittest.group('obj-schema-DeploymentsCancelPreviewRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeploymentsCancelPreviewRequest();
-      var od = api.DeploymentsCancelPreviewRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeploymentsCancelPreviewRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeploymentsCancelPreviewRequest(
           od as api.DeploymentsCancelPreviewRequest);
     });
@@ -1681,7 +1699,9 @@
   unittest.group('obj-schema-DeploymentsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeploymentsListResponse();
-      var od = api.DeploymentsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeploymentsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeploymentsListResponse(od as api.DeploymentsListResponse);
     });
   });
@@ -1689,7 +1709,9 @@
   unittest.group('obj-schema-DeploymentsStopRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeploymentsStopRequest();
-      var od = api.DeploymentsStopRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeploymentsStopRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeploymentsStopRequest(od as api.DeploymentsStopRequest);
     });
   });
@@ -1697,7 +1719,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1705,7 +1728,9 @@
   unittest.group('obj-schema-GlobalSetPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlobalSetPolicyRequest();
-      var od = api.GlobalSetPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GlobalSetPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGlobalSetPolicyRequest(od as api.GlobalSetPolicyRequest);
     });
   });
@@ -1713,7 +1738,9 @@
   unittest.group('obj-schema-ImportFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportFile();
-      var od = api.ImportFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ImportFile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImportFile(od as api.ImportFile);
     });
   });
@@ -1721,7 +1748,9 @@
   unittest.group('obj-schema-Manifest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManifest();
-      var od = api.Manifest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Manifest.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkManifest(od as api.Manifest);
     });
   });
@@ -1729,7 +1758,9 @@
   unittest.group('obj-schema-ManifestsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManifestsListResponse();
-      var od = api.ManifestsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManifestsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManifestsListResponse(od as api.ManifestsListResponse);
     });
   });
@@ -1737,7 +1768,9 @@
   unittest.group('obj-schema-OperationErrorErrors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationErrorErrors();
-      var od = api.OperationErrorErrors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationErrorErrors.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationErrorErrors(od as api.OperationErrorErrors);
     });
   });
@@ -1745,7 +1778,9 @@
   unittest.group('obj-schema-OperationError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationError();
-      var od = api.OperationError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationError(od as api.OperationError);
     });
   });
@@ -1753,7 +1788,9 @@
   unittest.group('obj-schema-OperationWarningsData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationWarningsData();
-      var od = api.OperationWarningsData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationWarningsData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationWarningsData(od as api.OperationWarningsData);
     });
   });
@@ -1761,7 +1798,9 @@
   unittest.group('obj-schema-OperationWarnings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationWarnings();
-      var od = api.OperationWarnings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationWarnings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationWarnings(od as api.OperationWarnings);
     });
   });
@@ -1769,7 +1808,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1777,7 +1818,9 @@
   unittest.group('obj-schema-OperationsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationsListResponse();
-      var od = api.OperationsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationsListResponse(od as api.OperationsListResponse);
     });
   });
@@ -1785,7 +1828,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1793,7 +1838,9 @@
   unittest.group('obj-schema-ResourceWarningsData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceWarningsData();
-      var od = api.ResourceWarningsData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceWarningsData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceWarningsData(od as api.ResourceWarningsData);
     });
   });
@@ -1801,7 +1848,9 @@
   unittest.group('obj-schema-ResourceWarnings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceWarnings();
-      var od = api.ResourceWarnings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceWarnings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceWarnings(od as api.ResourceWarnings);
     });
   });
@@ -1809,7 +1858,9 @@
   unittest.group('obj-schema-Resource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResource();
-      var od = api.Resource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Resource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResource(od as api.Resource);
     });
   });
@@ -1817,7 +1868,9 @@
   unittest.group('obj-schema-ResourceAccessControl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceAccessControl();
-      var od = api.ResourceAccessControl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceAccessControl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceAccessControl(od as api.ResourceAccessControl);
     });
   });
@@ -1825,7 +1878,9 @@
   unittest.group('obj-schema-ResourceUpdateErrorErrors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceUpdateErrorErrors();
-      var od = api.ResourceUpdateErrorErrors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceUpdateErrorErrors.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceUpdateErrorErrors(od as api.ResourceUpdateErrorErrors);
     });
   });
@@ -1833,7 +1888,9 @@
   unittest.group('obj-schema-ResourceUpdateError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceUpdateError();
-      var od = api.ResourceUpdateError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceUpdateError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceUpdateError(od as api.ResourceUpdateError);
     });
   });
@@ -1841,7 +1898,9 @@
   unittest.group('obj-schema-ResourceUpdateWarningsData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceUpdateWarningsData();
-      var od = api.ResourceUpdateWarningsData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceUpdateWarningsData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceUpdateWarningsData(od as api.ResourceUpdateWarningsData);
     });
   });
@@ -1849,7 +1908,9 @@
   unittest.group('obj-schema-ResourceUpdateWarnings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceUpdateWarnings();
-      var od = api.ResourceUpdateWarnings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceUpdateWarnings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceUpdateWarnings(od as api.ResourceUpdateWarnings);
     });
   });
@@ -1857,7 +1918,9 @@
   unittest.group('obj-schema-ResourceUpdate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceUpdate();
-      var od = api.ResourceUpdate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceUpdate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceUpdate(od as api.ResourceUpdate);
     });
   });
@@ -1865,7 +1928,9 @@
   unittest.group('obj-schema-ResourcesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourcesListResponse();
-      var od = api.ResourcesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourcesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourcesListResponse(od as api.ResourcesListResponse);
     });
   });
@@ -1873,7 +1938,9 @@
   unittest.group('obj-schema-TargetConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetConfiguration();
-      var od = api.TargetConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetConfiguration(od as api.TargetConfiguration);
     });
   });
@@ -1881,7 +1948,9 @@
   unittest.group('obj-schema-TestPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestPermissionsRequest();
-      var od = api.TestPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestPermissionsRequest(od as api.TestPermissionsRequest);
     });
   });
@@ -1889,7 +1958,9 @@
   unittest.group('obj-schema-TestPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestPermissionsResponse();
-      var od = api.TestPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestPermissionsResponse(od as api.TestPermissionsResponse);
     });
   });
@@ -1897,7 +1968,8 @@
   unittest.group('obj-schema-Type', () {
     unittest.test('to-json--from-json', () async {
       var o = buildType();
-      var od = api.Type.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Type.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkType(od as api.Type);
     });
   });
@@ -1905,7 +1977,9 @@
   unittest.group('obj-schema-TypesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTypesListResponse();
-      var od = api.TypesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TypesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTypesListResponse(od as api.TypesListResponse);
     });
   });
diff --git a/generated/googleapis/test/dfareporting/v3_4_test.dart b/generated/googleapis/test/dfareporting/v3_4_test.dart
index 1425f39..a07913f 100644
--- a/generated/googleapis/test/dfareporting/v3_4_test.dart
+++ b/generated/googleapis/test/dfareporting/v3_4_test.dart
@@ -14777,7 +14777,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -14785,7 +14787,9 @@
   unittest.group('obj-schema-AccountActiveAdSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountActiveAdSummary();
-      var od = api.AccountActiveAdSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountActiveAdSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountActiveAdSummary(od as api.AccountActiveAdSummary);
     });
   });
@@ -14793,7 +14797,9 @@
   unittest.group('obj-schema-AccountPermission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountPermission();
-      var od = api.AccountPermission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountPermission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountPermission(od as api.AccountPermission);
     });
   });
@@ -14801,7 +14807,9 @@
   unittest.group('obj-schema-AccountPermissionGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountPermissionGroup();
-      var od = api.AccountPermissionGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountPermissionGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountPermissionGroup(od as api.AccountPermissionGroup);
     });
   });
@@ -14809,7 +14817,9 @@
   unittest.group('obj-schema-AccountPermissionGroupsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountPermissionGroupsListResponse();
-      var od = api.AccountPermissionGroupsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountPermissionGroupsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountPermissionGroupsListResponse(
           od as api.AccountPermissionGroupsListResponse);
     });
@@ -14818,7 +14828,9 @@
   unittest.group('obj-schema-AccountPermissionsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountPermissionsListResponse();
-      var od = api.AccountPermissionsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountPermissionsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountPermissionsListResponse(
           od as api.AccountPermissionsListResponse);
     });
@@ -14827,7 +14839,9 @@
   unittest.group('obj-schema-AccountUserProfile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountUserProfile();
-      var od = api.AccountUserProfile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountUserProfile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountUserProfile(od as api.AccountUserProfile);
     });
   });
@@ -14835,7 +14849,9 @@
   unittest.group('obj-schema-AccountUserProfilesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountUserProfilesListResponse();
-      var od = api.AccountUserProfilesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountUserProfilesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountUserProfilesListResponse(
           od as api.AccountUserProfilesListResponse);
     });
@@ -14844,7 +14860,9 @@
   unittest.group('obj-schema-AccountsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountsListResponse();
-      var od = api.AccountsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountsListResponse(od as api.AccountsListResponse);
     });
   });
@@ -14852,7 +14870,9 @@
   unittest.group('obj-schema-Activities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivities();
-      var od = api.Activities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Activities.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkActivities(od as api.Activities);
     });
   });
@@ -14860,7 +14880,8 @@
   unittest.group('obj-schema-Ad', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAd();
-      var od = api.Ad.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Ad.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAd(od as api.Ad);
     });
   });
@@ -14868,7 +14889,9 @@
   unittest.group('obj-schema-AdBlockingConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdBlockingConfiguration();
-      var od = api.AdBlockingConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdBlockingConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdBlockingConfiguration(od as api.AdBlockingConfiguration);
     });
   });
@@ -14876,7 +14899,9 @@
   unittest.group('obj-schema-AdSlot', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdSlot();
-      var od = api.AdSlot.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdSlot.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdSlot(od as api.AdSlot);
     });
   });
@@ -14884,7 +14909,9 @@
   unittest.group('obj-schema-AdsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdsListResponse();
-      var od = api.AdsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdsListResponse(od as api.AdsListResponse);
     });
   });
@@ -14892,7 +14919,9 @@
   unittest.group('obj-schema-Advertiser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiser();
-      var od = api.Advertiser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Advertiser.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiser(od as api.Advertiser);
     });
   });
@@ -14900,7 +14929,9 @@
   unittest.group('obj-schema-AdvertiserGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiserGroup();
-      var od = api.AdvertiserGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertiserGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiserGroup(od as api.AdvertiserGroup);
     });
   });
@@ -14908,7 +14939,9 @@
   unittest.group('obj-schema-AdvertiserGroupsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiserGroupsListResponse();
-      var od = api.AdvertiserGroupsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertiserGroupsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiserGroupsListResponse(od as api.AdvertiserGroupsListResponse);
     });
   });
@@ -14916,7 +14949,9 @@
   unittest.group('obj-schema-AdvertiserLandingPagesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiserLandingPagesListResponse();
-      var od = api.AdvertiserLandingPagesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertiserLandingPagesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiserLandingPagesListResponse(
           od as api.AdvertiserLandingPagesListResponse);
     });
@@ -14925,7 +14960,9 @@
   unittest.group('obj-schema-AdvertisersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertisersListResponse();
-      var od = api.AdvertisersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertisersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertisersListResponse(od as api.AdvertisersListResponse);
     });
   });
@@ -14933,7 +14970,9 @@
   unittest.group('obj-schema-AudienceSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAudienceSegment();
-      var od = api.AudienceSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AudienceSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAudienceSegment(od as api.AudienceSegment);
     });
   });
@@ -14941,7 +14980,9 @@
   unittest.group('obj-schema-AudienceSegmentGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAudienceSegmentGroup();
-      var od = api.AudienceSegmentGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AudienceSegmentGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAudienceSegmentGroup(od as api.AudienceSegmentGroup);
     });
   });
@@ -14949,7 +14990,9 @@
   unittest.group('obj-schema-Browser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBrowser();
-      var od = api.Browser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Browser.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBrowser(od as api.Browser);
     });
   });
@@ -14957,7 +15000,9 @@
   unittest.group('obj-schema-BrowsersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBrowsersListResponse();
-      var od = api.BrowsersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BrowsersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBrowsersListResponse(od as api.BrowsersListResponse);
     });
   });
@@ -14965,7 +15010,9 @@
   unittest.group('obj-schema-Campaign', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCampaign();
-      var od = api.Campaign.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Campaign.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCampaign(od as api.Campaign);
     });
   });
@@ -14973,7 +15020,9 @@
   unittest.group('obj-schema-CampaignCreativeAssociation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCampaignCreativeAssociation();
-      var od = api.CampaignCreativeAssociation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CampaignCreativeAssociation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCampaignCreativeAssociation(od as api.CampaignCreativeAssociation);
     });
   });
@@ -14981,8 +15030,9 @@
   unittest.group('obj-schema-CampaignCreativeAssociationsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCampaignCreativeAssociationsListResponse();
-      var od =
-          api.CampaignCreativeAssociationsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CampaignCreativeAssociationsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCampaignCreativeAssociationsListResponse(
           od as api.CampaignCreativeAssociationsListResponse);
     });
@@ -14991,7 +15041,9 @@
   unittest.group('obj-schema-CampaignManagerIds', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCampaignManagerIds();
-      var od = api.CampaignManagerIds.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CampaignManagerIds.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCampaignManagerIds(od as api.CampaignManagerIds);
     });
   });
@@ -14999,7 +15051,9 @@
   unittest.group('obj-schema-CampaignsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCampaignsListResponse();
-      var od = api.CampaignsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CampaignsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCampaignsListResponse(od as api.CampaignsListResponse);
     });
   });
@@ -15007,7 +15061,9 @@
   unittest.group('obj-schema-ChangeLog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChangeLog();
-      var od = api.ChangeLog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ChangeLog.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChangeLog(od as api.ChangeLog);
     });
   });
@@ -15015,7 +15071,9 @@
   unittest.group('obj-schema-ChangeLogsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChangeLogsListResponse();
-      var od = api.ChangeLogsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChangeLogsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChangeLogsListResponse(od as api.ChangeLogsListResponse);
     });
   });
@@ -15023,7 +15081,9 @@
   unittest.group('obj-schema-ChannelGrouping', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelGrouping();
-      var od = api.ChannelGrouping.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelGrouping.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelGrouping(od as api.ChannelGrouping);
     });
   });
@@ -15031,7 +15091,9 @@
   unittest.group('obj-schema-ChannelGroupingRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelGroupingRule();
-      var od = api.ChannelGroupingRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelGroupingRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelGroupingRule(od as api.ChannelGroupingRule);
     });
   });
@@ -15039,7 +15101,9 @@
   unittest.group('obj-schema-CitiesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCitiesListResponse();
-      var od = api.CitiesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CitiesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCitiesListResponse(od as api.CitiesListResponse);
     });
   });
@@ -15047,7 +15111,8 @@
   unittest.group('obj-schema-City', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCity();
-      var od = api.City.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.City.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCity(od as api.City);
     });
   });
@@ -15055,7 +15120,9 @@
   unittest.group('obj-schema-ClickTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClickTag();
-      var od = api.ClickTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ClickTag.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkClickTag(od as api.ClickTag);
     });
   });
@@ -15063,7 +15130,9 @@
   unittest.group('obj-schema-ClickThroughUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClickThroughUrl();
-      var od = api.ClickThroughUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClickThroughUrl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClickThroughUrl(od as api.ClickThroughUrl);
     });
   });
@@ -15071,7 +15140,9 @@
   unittest.group('obj-schema-ClickThroughUrlSuffixProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClickThroughUrlSuffixProperties();
-      var od = api.ClickThroughUrlSuffixProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClickThroughUrlSuffixProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClickThroughUrlSuffixProperties(
           od as api.ClickThroughUrlSuffixProperties);
     });
@@ -15080,7 +15151,9 @@
   unittest.group('obj-schema-CompanionClickThroughOverride', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompanionClickThroughOverride();
-      var od = api.CompanionClickThroughOverride.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompanionClickThroughOverride.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompanionClickThroughOverride(
           od as api.CompanionClickThroughOverride);
     });
@@ -15089,7 +15162,9 @@
   unittest.group('obj-schema-CompanionSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompanionSetting();
-      var od = api.CompanionSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompanionSetting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompanionSetting(od as api.CompanionSetting);
     });
   });
@@ -15097,7 +15172,9 @@
   unittest.group('obj-schema-CompatibleFields', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompatibleFields();
-      var od = api.CompatibleFields.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompatibleFields.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompatibleFields(od as api.CompatibleFields);
     });
   });
@@ -15105,7 +15182,9 @@
   unittest.group('obj-schema-ConnectionType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConnectionType();
-      var od = api.ConnectionType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConnectionType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConnectionType(od as api.ConnectionType);
     });
   });
@@ -15113,7 +15192,9 @@
   unittest.group('obj-schema-ConnectionTypesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConnectionTypesListResponse();
-      var od = api.ConnectionTypesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConnectionTypesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConnectionTypesListResponse(od as api.ConnectionTypesListResponse);
     });
   });
@@ -15121,7 +15202,9 @@
   unittest.group('obj-schema-ContentCategoriesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContentCategoriesListResponse();
-      var od = api.ContentCategoriesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContentCategoriesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContentCategoriesListResponse(
           od as api.ContentCategoriesListResponse);
     });
@@ -15130,7 +15213,9 @@
   unittest.group('obj-schema-ContentCategory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContentCategory();
-      var od = api.ContentCategory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContentCategory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContentCategory(od as api.ContentCategory);
     });
   });
@@ -15138,7 +15223,9 @@
   unittest.group('obj-schema-Conversion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConversion();
-      var od = api.Conversion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Conversion.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkConversion(od as api.Conversion);
     });
   });
@@ -15146,7 +15233,9 @@
   unittest.group('obj-schema-ConversionError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConversionError();
-      var od = api.ConversionError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConversionError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConversionError(od as api.ConversionError);
     });
   });
@@ -15154,7 +15243,9 @@
   unittest.group('obj-schema-ConversionStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConversionStatus();
-      var od = api.ConversionStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConversionStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConversionStatus(od as api.ConversionStatus);
     });
   });
@@ -15162,7 +15253,9 @@
   unittest.group('obj-schema-ConversionsBatchInsertRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConversionsBatchInsertRequest();
-      var od = api.ConversionsBatchInsertRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConversionsBatchInsertRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConversionsBatchInsertRequest(
           od as api.ConversionsBatchInsertRequest);
     });
@@ -15171,7 +15264,9 @@
   unittest.group('obj-schema-ConversionsBatchInsertResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConversionsBatchInsertResponse();
-      var od = api.ConversionsBatchInsertResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConversionsBatchInsertResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConversionsBatchInsertResponse(
           od as api.ConversionsBatchInsertResponse);
     });
@@ -15180,7 +15275,9 @@
   unittest.group('obj-schema-ConversionsBatchUpdateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConversionsBatchUpdateRequest();
-      var od = api.ConversionsBatchUpdateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConversionsBatchUpdateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConversionsBatchUpdateRequest(
           od as api.ConversionsBatchUpdateRequest);
     });
@@ -15189,7 +15286,9 @@
   unittest.group('obj-schema-ConversionsBatchUpdateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConversionsBatchUpdateResponse();
-      var od = api.ConversionsBatchUpdateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConversionsBatchUpdateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConversionsBatchUpdateResponse(
           od as api.ConversionsBatchUpdateResponse);
     });
@@ -15198,7 +15297,9 @@
   unittest.group('obj-schema-CountriesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCountriesListResponse();
-      var od = api.CountriesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CountriesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCountriesListResponse(od as api.CountriesListResponse);
     });
   });
@@ -15206,7 +15307,9 @@
   unittest.group('obj-schema-Country', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCountry();
-      var od = api.Country.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Country.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCountry(od as api.Country);
     });
   });
@@ -15214,7 +15317,9 @@
   unittest.group('obj-schema-Creative', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreative();
-      var od = api.Creative.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Creative.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCreative(od as api.Creative);
     });
   });
@@ -15222,7 +15327,9 @@
   unittest.group('obj-schema-CreativeAsset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeAsset();
-      var od = api.CreativeAsset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeAsset.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeAsset(od as api.CreativeAsset);
     });
   });
@@ -15230,7 +15337,9 @@
   unittest.group('obj-schema-CreativeAssetId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeAssetId();
-      var od = api.CreativeAssetId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeAssetId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeAssetId(od as api.CreativeAssetId);
     });
   });
@@ -15238,7 +15347,9 @@
   unittest.group('obj-schema-CreativeAssetMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeAssetMetadata();
-      var od = api.CreativeAssetMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeAssetMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeAssetMetadata(od as api.CreativeAssetMetadata);
     });
   });
@@ -15246,7 +15357,9 @@
   unittest.group('obj-schema-CreativeAssetSelection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeAssetSelection();
-      var od = api.CreativeAssetSelection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeAssetSelection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeAssetSelection(od as api.CreativeAssetSelection);
     });
   });
@@ -15254,7 +15367,9 @@
   unittest.group('obj-schema-CreativeAssignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeAssignment();
-      var od = api.CreativeAssignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeAssignment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeAssignment(od as api.CreativeAssignment);
     });
   });
@@ -15262,7 +15377,9 @@
   unittest.group('obj-schema-CreativeClickThroughUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeClickThroughUrl();
-      var od = api.CreativeClickThroughUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeClickThroughUrl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeClickThroughUrl(od as api.CreativeClickThroughUrl);
     });
   });
@@ -15270,7 +15387,9 @@
   unittest.group('obj-schema-CreativeCustomEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeCustomEvent();
-      var od = api.CreativeCustomEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeCustomEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeCustomEvent(od as api.CreativeCustomEvent);
     });
   });
@@ -15278,7 +15397,9 @@
   unittest.group('obj-schema-CreativeField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeField();
-      var od = api.CreativeField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeField(od as api.CreativeField);
     });
   });
@@ -15286,7 +15407,9 @@
   unittest.group('obj-schema-CreativeFieldAssignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeFieldAssignment();
-      var od = api.CreativeFieldAssignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeFieldAssignment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeFieldAssignment(od as api.CreativeFieldAssignment);
     });
   });
@@ -15294,7 +15417,9 @@
   unittest.group('obj-schema-CreativeFieldValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeFieldValue();
-      var od = api.CreativeFieldValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeFieldValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeFieldValue(od as api.CreativeFieldValue);
     });
   });
@@ -15302,7 +15427,9 @@
   unittest.group('obj-schema-CreativeFieldValuesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeFieldValuesListResponse();
-      var od = api.CreativeFieldValuesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeFieldValuesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeFieldValuesListResponse(
           od as api.CreativeFieldValuesListResponse);
     });
@@ -15311,7 +15438,9 @@
   unittest.group('obj-schema-CreativeFieldsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeFieldsListResponse();
-      var od = api.CreativeFieldsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeFieldsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeFieldsListResponse(od as api.CreativeFieldsListResponse);
     });
   });
@@ -15319,7 +15448,9 @@
   unittest.group('obj-schema-CreativeGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeGroup();
-      var od = api.CreativeGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeGroup(od as api.CreativeGroup);
     });
   });
@@ -15327,7 +15458,9 @@
   unittest.group('obj-schema-CreativeGroupAssignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeGroupAssignment();
-      var od = api.CreativeGroupAssignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeGroupAssignment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeGroupAssignment(od as api.CreativeGroupAssignment);
     });
   });
@@ -15335,7 +15468,9 @@
   unittest.group('obj-schema-CreativeGroupsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeGroupsListResponse();
-      var od = api.CreativeGroupsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeGroupsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeGroupsListResponse(od as api.CreativeGroupsListResponse);
     });
   });
@@ -15343,7 +15478,9 @@
   unittest.group('obj-schema-CreativeOptimizationConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeOptimizationConfiguration();
-      var od = api.CreativeOptimizationConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeOptimizationConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeOptimizationConfiguration(
           od as api.CreativeOptimizationConfiguration);
     });
@@ -15352,7 +15489,9 @@
   unittest.group('obj-schema-CreativeRotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeRotation();
-      var od = api.CreativeRotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeRotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeRotation(od as api.CreativeRotation);
     });
   });
@@ -15360,7 +15499,9 @@
   unittest.group('obj-schema-CreativesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativesListResponse();
-      var od = api.CreativesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativesListResponse(od as api.CreativesListResponse);
     });
   });
@@ -15368,8 +15509,9 @@
   unittest.group('obj-schema-CrossDimensionReachReportCompatibleFields', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCrossDimensionReachReportCompatibleFields();
-      var od =
-          api.CrossDimensionReachReportCompatibleFields.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CrossDimensionReachReportCompatibleFields.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCrossDimensionReachReportCompatibleFields(
           od as api.CrossDimensionReachReportCompatibleFields);
     });
@@ -15378,7 +15520,9 @@
   unittest.group('obj-schema-CustomEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomEvent();
-      var od = api.CustomEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomEvent(od as api.CustomEvent);
     });
   });
@@ -15386,7 +15530,9 @@
   unittest.group('obj-schema-CustomEventClickAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomEventClickAnnotation();
-      var od = api.CustomEventClickAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomEventClickAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomEventClickAnnotation(od as api.CustomEventClickAnnotation);
     });
   });
@@ -15394,7 +15540,9 @@
   unittest.group('obj-schema-CustomEventError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomEventError();
-      var od = api.CustomEventError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomEventError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomEventError(od as api.CustomEventError);
     });
   });
@@ -15402,7 +15550,9 @@
   unittest.group('obj-schema-CustomEventImpressionAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomEventImpressionAnnotation();
-      var od = api.CustomEventImpressionAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomEventImpressionAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomEventImpressionAnnotation(
           od as api.CustomEventImpressionAnnotation);
     });
@@ -15411,7 +15561,9 @@
   unittest.group('obj-schema-CustomEventInsert', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomEventInsert();
-      var od = api.CustomEventInsert.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomEventInsert.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomEventInsert(od as api.CustomEventInsert);
     });
   });
@@ -15419,7 +15571,9 @@
   unittest.group('obj-schema-CustomEventStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomEventStatus();
-      var od = api.CustomEventStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomEventStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomEventStatus(od as api.CustomEventStatus);
     });
   });
@@ -15427,7 +15581,9 @@
   unittest.group('obj-schema-CustomEventsBatchInsertRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomEventsBatchInsertRequest();
-      var od = api.CustomEventsBatchInsertRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomEventsBatchInsertRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomEventsBatchInsertRequest(
           od as api.CustomEventsBatchInsertRequest);
     });
@@ -15436,7 +15592,9 @@
   unittest.group('obj-schema-CustomEventsBatchInsertResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomEventsBatchInsertResponse();
-      var od = api.CustomEventsBatchInsertResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomEventsBatchInsertResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomEventsBatchInsertResponse(
           od as api.CustomEventsBatchInsertResponse);
     });
@@ -15445,7 +15603,9 @@
   unittest.group('obj-schema-CustomFloodlightVariable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomFloodlightVariable();
-      var od = api.CustomFloodlightVariable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomFloodlightVariable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomFloodlightVariable(od as api.CustomFloodlightVariable);
     });
   });
@@ -15453,7 +15613,9 @@
   unittest.group('obj-schema-CustomRichMediaEvents', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomRichMediaEvents();
-      var od = api.CustomRichMediaEvents.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomRichMediaEvents.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomRichMediaEvents(od as api.CustomRichMediaEvents);
     });
   });
@@ -15461,7 +15623,9 @@
   unittest.group('obj-schema-CustomVariable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomVariable();
-      var od = api.CustomVariable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomVariable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomVariable(od as api.CustomVariable);
     });
   });
@@ -15469,7 +15633,9 @@
   unittest.group('obj-schema-CustomViewabilityMetric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomViewabilityMetric();
-      var od = api.CustomViewabilityMetric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomViewabilityMetric.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomViewabilityMetric(od as api.CustomViewabilityMetric);
     });
   });
@@ -15477,7 +15643,9 @@
   unittest.group('obj-schema-CustomViewabilityMetricConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomViewabilityMetricConfiguration();
-      var od = api.CustomViewabilityMetricConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomViewabilityMetricConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomViewabilityMetricConfiguration(
           od as api.CustomViewabilityMetricConfiguration);
     });
@@ -15486,7 +15654,9 @@
   unittest.group('obj-schema-DV3Ids', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDV3Ids();
-      var od = api.DV3Ids.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DV3Ids.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDV3Ids(od as api.DV3Ids);
     });
   });
@@ -15494,7 +15664,9 @@
   unittest.group('obj-schema-DateRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateRange();
-      var od = api.DateRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DateRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDateRange(od as api.DateRange);
     });
   });
@@ -15502,7 +15674,9 @@
   unittest.group('obj-schema-DayPartTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDayPartTargeting();
-      var od = api.DayPartTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DayPartTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDayPartTargeting(od as api.DayPartTargeting);
     });
   });
@@ -15510,7 +15684,9 @@
   unittest.group('obj-schema-DeepLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeepLink();
-      var od = api.DeepLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DeepLink.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeepLink(od as api.DeepLink);
     });
   });
@@ -15518,7 +15694,9 @@
   unittest.group('obj-schema-DefaultClickThroughEventTagProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDefaultClickThroughEventTagProperties();
-      var od = api.DefaultClickThroughEventTagProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DefaultClickThroughEventTagProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDefaultClickThroughEventTagProperties(
           od as api.DefaultClickThroughEventTagProperties);
     });
@@ -15527,7 +15705,9 @@
   unittest.group('obj-schema-DeliverySchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeliverySchedule();
-      var od = api.DeliverySchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeliverySchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeliverySchedule(od as api.DeliverySchedule);
     });
   });
@@ -15535,7 +15715,9 @@
   unittest.group('obj-schema-DfpSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDfpSettings();
-      var od = api.DfpSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DfpSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDfpSettings(od as api.DfpSettings);
     });
   });
@@ -15543,7 +15725,9 @@
   unittest.group('obj-schema-Dimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimension();
-      var od = api.Dimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Dimension.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDimension(od as api.Dimension);
     });
   });
@@ -15551,7 +15735,9 @@
   unittest.group('obj-schema-DimensionFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionFilter();
-      var od = api.DimensionFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionFilter(od as api.DimensionFilter);
     });
   });
@@ -15559,7 +15745,9 @@
   unittest.group('obj-schema-DimensionValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionValue();
-      var od = api.DimensionValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionValue(od as api.DimensionValue);
     });
   });
@@ -15567,7 +15755,9 @@
   unittest.group('obj-schema-DimensionValueList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionValueList();
-      var od = api.DimensionValueList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionValueList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionValueList(od as api.DimensionValueList);
     });
   });
@@ -15575,7 +15765,9 @@
   unittest.group('obj-schema-DimensionValueRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionValueRequest();
-      var od = api.DimensionValueRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionValueRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionValueRequest(od as api.DimensionValueRequest);
     });
   });
@@ -15583,7 +15775,9 @@
   unittest.group('obj-schema-DirectorySite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectorySite();
-      var od = api.DirectorySite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectorySite.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectorySite(od as api.DirectorySite);
     });
   });
@@ -15591,7 +15785,9 @@
   unittest.group('obj-schema-DirectorySiteSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectorySiteSettings();
-      var od = api.DirectorySiteSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectorySiteSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectorySiteSettings(od as api.DirectorySiteSettings);
     });
   });
@@ -15599,7 +15795,9 @@
   unittest.group('obj-schema-DirectorySitesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectorySitesListResponse();
-      var od = api.DirectorySitesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectorySitesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectorySitesListResponse(od as api.DirectorySitesListResponse);
     });
   });
@@ -15607,7 +15805,9 @@
   unittest.group('obj-schema-DisjunctiveMatchStatement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisjunctiveMatchStatement();
-      var od = api.DisjunctiveMatchStatement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisjunctiveMatchStatement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisjunctiveMatchStatement(od as api.DisjunctiveMatchStatement);
     });
   });
@@ -15615,7 +15815,9 @@
   unittest.group('obj-schema-DynamicTargetingKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicTargetingKey();
-      var od = api.DynamicTargetingKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicTargetingKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicTargetingKey(od as api.DynamicTargetingKey);
     });
   });
@@ -15623,7 +15825,9 @@
   unittest.group('obj-schema-DynamicTargetingKeysListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicTargetingKeysListResponse();
-      var od = api.DynamicTargetingKeysListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicTargetingKeysListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicTargetingKeysListResponse(
           od as api.DynamicTargetingKeysListResponse);
     });
@@ -15632,7 +15836,9 @@
   unittest.group('obj-schema-EncryptionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncryptionInfo();
-      var od = api.EncryptionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EncryptionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEncryptionInfo(od as api.EncryptionInfo);
     });
   });
@@ -15640,7 +15846,9 @@
   unittest.group('obj-schema-EventFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventFilter();
-      var od = api.EventFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventFilter(od as api.EventFilter);
     });
   });
@@ -15648,7 +15856,9 @@
   unittest.group('obj-schema-EventTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventTag();
-      var od = api.EventTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EventTag.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEventTag(od as api.EventTag);
     });
   });
@@ -15656,7 +15866,9 @@
   unittest.group('obj-schema-EventTagOverride', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventTagOverride();
-      var od = api.EventTagOverride.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventTagOverride.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventTagOverride(od as api.EventTagOverride);
     });
   });
@@ -15664,7 +15876,9 @@
   unittest.group('obj-schema-EventTagsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventTagsListResponse();
-      var od = api.EventTagsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventTagsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventTagsListResponse(od as api.EventTagsListResponse);
     });
   });
@@ -15672,7 +15886,9 @@
   unittest.group('obj-schema-FileUrls', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileUrls();
-      var od = api.FileUrls.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FileUrls.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFileUrls(od as api.FileUrls);
     });
   });
@@ -15680,7 +15896,8 @@
   unittest.group('obj-schema-File', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFile();
-      var od = api.File.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.File.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFile(od as api.File);
     });
   });
@@ -15688,7 +15905,9 @@
   unittest.group('obj-schema-FileList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileList();
-      var od = api.FileList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FileList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFileList(od as api.FileList);
     });
   });
@@ -15696,7 +15915,9 @@
   unittest.group('obj-schema-Flight', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFlight();
-      var od = api.Flight.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Flight.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFlight(od as api.Flight);
     });
   });
@@ -15704,7 +15925,9 @@
   unittest.group('obj-schema-FloodlightActivitiesGenerateTagResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightActivitiesGenerateTagResponse();
-      var od = api.FloodlightActivitiesGenerateTagResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightActivitiesGenerateTagResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightActivitiesGenerateTagResponse(
           od as api.FloodlightActivitiesGenerateTagResponse);
     });
@@ -15713,7 +15936,9 @@
   unittest.group('obj-schema-FloodlightActivitiesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightActivitiesListResponse();
-      var od = api.FloodlightActivitiesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightActivitiesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightActivitiesListResponse(
           od as api.FloodlightActivitiesListResponse);
     });
@@ -15722,7 +15947,9 @@
   unittest.group('obj-schema-FloodlightActivity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightActivity();
-      var od = api.FloodlightActivity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightActivity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightActivity(od as api.FloodlightActivity);
     });
   });
@@ -15730,7 +15957,9 @@
   unittest.group('obj-schema-FloodlightActivityDynamicTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightActivityDynamicTag();
-      var od = api.FloodlightActivityDynamicTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightActivityDynamicTag.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightActivityDynamicTag(od as api.FloodlightActivityDynamicTag);
     });
   });
@@ -15738,7 +15967,9 @@
   unittest.group('obj-schema-FloodlightActivityGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightActivityGroup();
-      var od = api.FloodlightActivityGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightActivityGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightActivityGroup(od as api.FloodlightActivityGroup);
     });
   });
@@ -15746,7 +15977,9 @@
   unittest.group('obj-schema-FloodlightActivityGroupsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightActivityGroupsListResponse();
-      var od = api.FloodlightActivityGroupsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightActivityGroupsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightActivityGroupsListResponse(
           od as api.FloodlightActivityGroupsListResponse);
     });
@@ -15755,7 +15988,9 @@
   unittest.group('obj-schema-FloodlightActivityPublisherDynamicTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightActivityPublisherDynamicTag();
-      var od = api.FloodlightActivityPublisherDynamicTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightActivityPublisherDynamicTag.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightActivityPublisherDynamicTag(
           od as api.FloodlightActivityPublisherDynamicTag);
     });
@@ -15764,7 +15999,9 @@
   unittest.group('obj-schema-FloodlightConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightConfiguration();
-      var od = api.FloodlightConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightConfiguration(od as api.FloodlightConfiguration);
     });
   });
@@ -15772,7 +16009,9 @@
   unittest.group('obj-schema-FloodlightConfigurationsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightConfigurationsListResponse();
-      var od = api.FloodlightConfigurationsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightConfigurationsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightConfigurationsListResponse(
           od as api.FloodlightConfigurationsListResponse);
     });
@@ -15781,7 +16020,9 @@
   unittest.group('obj-schema-FloodlightReportCompatibleFields', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightReportCompatibleFields();
-      var od = api.FloodlightReportCompatibleFields.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightReportCompatibleFields.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightReportCompatibleFields(
           od as api.FloodlightReportCompatibleFields);
     });
@@ -15790,7 +16031,9 @@
   unittest.group('obj-schema-FrequencyCap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFrequencyCap();
-      var od = api.FrequencyCap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FrequencyCap.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFrequencyCap(od as api.FrequencyCap);
     });
   });
@@ -15798,7 +16041,9 @@
   unittest.group('obj-schema-FsCommand', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFsCommand();
-      var od = api.FsCommand.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FsCommand.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFsCommand(od as api.FsCommand);
     });
   });
@@ -15806,7 +16051,9 @@
   unittest.group('obj-schema-GeoTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeoTargeting();
-      var od = api.GeoTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeoTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeoTargeting(od as api.GeoTargeting);
     });
   });
@@ -15814,7 +16061,9 @@
   unittest.group('obj-schema-InventoryItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventoryItem();
-      var od = api.InventoryItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventoryItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventoryItem(od as api.InventoryItem);
     });
   });
@@ -15822,7 +16071,9 @@
   unittest.group('obj-schema-InventoryItemsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventoryItemsListResponse();
-      var od = api.InventoryItemsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventoryItemsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventoryItemsListResponse(od as api.InventoryItemsListResponse);
     });
   });
@@ -15830,7 +16081,9 @@
   unittest.group('obj-schema-KeyValueTargetingExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyValueTargetingExpression();
-      var od = api.KeyValueTargetingExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeyValueTargetingExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKeyValueTargetingExpression(od as api.KeyValueTargetingExpression);
     });
   });
@@ -15838,7 +16091,9 @@
   unittest.group('obj-schema-LandingPage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLandingPage();
-      var od = api.LandingPage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LandingPage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLandingPage(od as api.LandingPage);
     });
   });
@@ -15846,7 +16101,9 @@
   unittest.group('obj-schema-Language', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLanguage();
-      var od = api.Language.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Language.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLanguage(od as api.Language);
     });
   });
@@ -15854,7 +16111,9 @@
   unittest.group('obj-schema-LanguageTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLanguageTargeting();
-      var od = api.LanguageTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LanguageTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLanguageTargeting(od as api.LanguageTargeting);
     });
   });
@@ -15862,7 +16121,9 @@
   unittest.group('obj-schema-LanguagesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLanguagesListResponse();
-      var od = api.LanguagesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LanguagesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLanguagesListResponse(od as api.LanguagesListResponse);
     });
   });
@@ -15870,7 +16131,9 @@
   unittest.group('obj-schema-LastModifiedInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLastModifiedInfo();
-      var od = api.LastModifiedInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LastModifiedInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLastModifiedInfo(od as api.LastModifiedInfo);
     });
   });
@@ -15878,7 +16141,9 @@
   unittest.group('obj-schema-ListPopulationClause', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPopulationClause();
-      var od = api.ListPopulationClause.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPopulationClause.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPopulationClause(od as api.ListPopulationClause);
     });
   });
@@ -15886,7 +16151,9 @@
   unittest.group('obj-schema-ListPopulationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPopulationRule();
-      var od = api.ListPopulationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPopulationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPopulationRule(od as api.ListPopulationRule);
     });
   });
@@ -15894,7 +16161,9 @@
   unittest.group('obj-schema-ListPopulationTerm', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPopulationTerm();
-      var od = api.ListPopulationTerm.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPopulationTerm.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPopulationTerm(od as api.ListPopulationTerm);
     });
   });
@@ -15902,7 +16171,9 @@
   unittest.group('obj-schema-ListTargetingExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTargetingExpression();
-      var od = api.ListTargetingExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTargetingExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTargetingExpression(od as api.ListTargetingExpression);
     });
   });
@@ -15910,7 +16181,9 @@
   unittest.group('obj-schema-LookbackConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLookbackConfiguration();
-      var od = api.LookbackConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LookbackConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLookbackConfiguration(od as api.LookbackConfiguration);
     });
   });
@@ -15918,7 +16191,9 @@
   unittest.group('obj-schema-Metric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetric();
-      var od = api.Metric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metric.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetric(od as api.Metric);
     });
   });
@@ -15926,7 +16201,8 @@
   unittest.group('obj-schema-Metro', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetro();
-      var od = api.Metro.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Metro.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetro(od as api.Metro);
     });
   });
@@ -15934,7 +16210,9 @@
   unittest.group('obj-schema-MetrosListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetrosListResponse();
-      var od = api.MetrosListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetrosListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetrosListResponse(od as api.MetrosListResponse);
     });
   });
@@ -15942,7 +16220,9 @@
   unittest.group('obj-schema-MobileApp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileApp();
-      var od = api.MobileApp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MobileApp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMobileApp(od as api.MobileApp);
     });
   });
@@ -15950,7 +16230,9 @@
   unittest.group('obj-schema-MobileAppsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileAppsListResponse();
-      var od = api.MobileAppsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MobileAppsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMobileAppsListResponse(od as api.MobileAppsListResponse);
     });
   });
@@ -15958,7 +16240,9 @@
   unittest.group('obj-schema-MobileCarrier', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileCarrier();
-      var od = api.MobileCarrier.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MobileCarrier.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMobileCarrier(od as api.MobileCarrier);
     });
   });
@@ -15966,7 +16250,9 @@
   unittest.group('obj-schema-MobileCarriersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileCarriersListResponse();
-      var od = api.MobileCarriersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MobileCarriersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMobileCarriersListResponse(od as api.MobileCarriersListResponse);
     });
   });
@@ -15974,7 +16260,9 @@
   unittest.group('obj-schema-ObaIcon', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObaIcon();
-      var od = api.ObaIcon.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ObaIcon.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkObaIcon(od as api.ObaIcon);
     });
   });
@@ -15982,7 +16270,9 @@
   unittest.group('obj-schema-ObjectFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectFilter();
-      var od = api.ObjectFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectFilter(od as api.ObjectFilter);
     });
   });
@@ -15990,7 +16280,9 @@
   unittest.group('obj-schema-OffsetPosition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOffsetPosition();
-      var od = api.OffsetPosition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OffsetPosition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOffsetPosition(od as api.OffsetPosition);
     });
   });
@@ -15998,7 +16290,9 @@
   unittest.group('obj-schema-OmnitureSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOmnitureSettings();
-      var od = api.OmnitureSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OmnitureSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOmnitureSettings(od as api.OmnitureSettings);
     });
   });
@@ -16006,7 +16300,9 @@
   unittest.group('obj-schema-OperatingSystem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperatingSystem();
-      var od = api.OperatingSystem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperatingSystem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperatingSystem(od as api.OperatingSystem);
     });
   });
@@ -16014,7 +16310,9 @@
   unittest.group('obj-schema-OperatingSystemVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperatingSystemVersion();
-      var od = api.OperatingSystemVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperatingSystemVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperatingSystemVersion(od as api.OperatingSystemVersion);
     });
   });
@@ -16022,7 +16320,9 @@
   unittest.group('obj-schema-OperatingSystemVersionsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperatingSystemVersionsListResponse();
-      var od = api.OperatingSystemVersionsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperatingSystemVersionsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperatingSystemVersionsListResponse(
           od as api.OperatingSystemVersionsListResponse);
     });
@@ -16031,7 +16331,9 @@
   unittest.group('obj-schema-OperatingSystemsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperatingSystemsListResponse();
-      var od = api.OperatingSystemsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperatingSystemsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperatingSystemsListResponse(od as api.OperatingSystemsListResponse);
     });
   });
@@ -16039,7 +16341,9 @@
   unittest.group('obj-schema-OptimizationActivity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOptimizationActivity();
-      var od = api.OptimizationActivity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OptimizationActivity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOptimizationActivity(od as api.OptimizationActivity);
     });
   });
@@ -16047,7 +16351,8 @@
   unittest.group('obj-schema-Order', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrder();
-      var od = api.Order.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Order.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrder(od as api.Order);
     });
   });
@@ -16055,7 +16360,9 @@
   unittest.group('obj-schema-OrderContact', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderContact();
-      var od = api.OrderContact.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderContact.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderContact(od as api.OrderContact);
     });
   });
@@ -16063,7 +16370,9 @@
   unittest.group('obj-schema-OrderDocument', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderDocument();
-      var od = api.OrderDocument.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderDocument.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderDocument(od as api.OrderDocument);
     });
   });
@@ -16071,7 +16380,9 @@
   unittest.group('obj-schema-OrderDocumentsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderDocumentsListResponse();
-      var od = api.OrderDocumentsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrderDocumentsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrderDocumentsListResponse(od as api.OrderDocumentsListResponse);
     });
   });
@@ -16079,7 +16390,9 @@
   unittest.group('obj-schema-OrdersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrdersListResponse();
-      var od = api.OrdersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrdersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrdersListResponse(od as api.OrdersListResponse);
     });
   });
@@ -16087,7 +16400,9 @@
   unittest.group('obj-schema-PathFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathFilter();
-      var od = api.PathFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PathFilter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPathFilter(od as api.PathFilter);
     });
   });
@@ -16095,7 +16410,9 @@
   unittest.group('obj-schema-PathReportCompatibleFields', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathReportCompatibleFields();
-      var od = api.PathReportCompatibleFields.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PathReportCompatibleFields.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPathReportCompatibleFields(od as api.PathReportCompatibleFields);
     });
   });
@@ -16103,7 +16420,9 @@
   unittest.group('obj-schema-PathReportDimensionValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathReportDimensionValue();
-      var od = api.PathReportDimensionValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PathReportDimensionValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPathReportDimensionValue(od as api.PathReportDimensionValue);
     });
   });
@@ -16111,7 +16430,9 @@
   unittest.group('obj-schema-PathToConversionReportCompatibleFields', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathToConversionReportCompatibleFields();
-      var od = api.PathToConversionReportCompatibleFields.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PathToConversionReportCompatibleFields.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPathToConversionReportCompatibleFields(
           od as api.PathToConversionReportCompatibleFields);
     });
@@ -16120,7 +16441,9 @@
   unittest.group('obj-schema-Placement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlacement();
-      var od = api.Placement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Placement.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPlacement(od as api.Placement);
     });
   });
@@ -16128,7 +16451,9 @@
   unittest.group('obj-schema-PlacementAssignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlacementAssignment();
-      var od = api.PlacementAssignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlacementAssignment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlacementAssignment(od as api.PlacementAssignment);
     });
   });
@@ -16136,7 +16461,9 @@
   unittest.group('obj-schema-PlacementGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlacementGroup();
-      var od = api.PlacementGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlacementGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlacementGroup(od as api.PlacementGroup);
     });
   });
@@ -16144,7 +16471,9 @@
   unittest.group('obj-schema-PlacementGroupsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlacementGroupsListResponse();
-      var od = api.PlacementGroupsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlacementGroupsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlacementGroupsListResponse(od as api.PlacementGroupsListResponse);
     });
   });
@@ -16152,7 +16481,9 @@
   unittest.group('obj-schema-PlacementStrategiesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlacementStrategiesListResponse();
-      var od = api.PlacementStrategiesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlacementStrategiesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlacementStrategiesListResponse(
           od as api.PlacementStrategiesListResponse);
     });
@@ -16161,7 +16492,9 @@
   unittest.group('obj-schema-PlacementStrategy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlacementStrategy();
-      var od = api.PlacementStrategy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlacementStrategy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlacementStrategy(od as api.PlacementStrategy);
     });
   });
@@ -16169,7 +16502,9 @@
   unittest.group('obj-schema-PlacementTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlacementTag();
-      var od = api.PlacementTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlacementTag.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlacementTag(od as api.PlacementTag);
     });
   });
@@ -16177,7 +16512,9 @@
   unittest.group('obj-schema-PlacementsGenerateTagsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlacementsGenerateTagsResponse();
-      var od = api.PlacementsGenerateTagsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlacementsGenerateTagsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlacementsGenerateTagsResponse(
           od as api.PlacementsGenerateTagsResponse);
     });
@@ -16186,7 +16523,9 @@
   unittest.group('obj-schema-PlacementsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlacementsListResponse();
-      var od = api.PlacementsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlacementsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlacementsListResponse(od as api.PlacementsListResponse);
     });
   });
@@ -16194,7 +16533,9 @@
   unittest.group('obj-schema-PlatformType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlatformType();
-      var od = api.PlatformType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlatformType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlatformType(od as api.PlatformType);
     });
   });
@@ -16202,7 +16543,9 @@
   unittest.group('obj-schema-PlatformTypesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlatformTypesListResponse();
-      var od = api.PlatformTypesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlatformTypesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlatformTypesListResponse(od as api.PlatformTypesListResponse);
     });
   });
@@ -16210,7 +16553,9 @@
   unittest.group('obj-schema-PopupWindowProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPopupWindowProperties();
-      var od = api.PopupWindowProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PopupWindowProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPopupWindowProperties(od as api.PopupWindowProperties);
     });
   });
@@ -16218,7 +16563,9 @@
   unittest.group('obj-schema-PostalCode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostalCode();
-      var od = api.PostalCode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PostalCode.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPostalCode(od as api.PostalCode);
     });
   });
@@ -16226,7 +16573,9 @@
   unittest.group('obj-schema-PostalCodesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostalCodesListResponse();
-      var od = api.PostalCodesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostalCodesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostalCodesListResponse(od as api.PostalCodesListResponse);
     });
   });
@@ -16234,7 +16583,9 @@
   unittest.group('obj-schema-Pricing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPricing();
-      var od = api.Pricing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Pricing.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPricing(od as api.Pricing);
     });
   });
@@ -16242,7 +16593,9 @@
   unittest.group('obj-schema-PricingSchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPricingSchedule();
-      var od = api.PricingSchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PricingSchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPricingSchedule(od as api.PricingSchedule);
     });
   });
@@ -16250,7 +16603,9 @@
   unittest.group('obj-schema-PricingSchedulePricingPeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPricingSchedulePricingPeriod();
-      var od = api.PricingSchedulePricingPeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PricingSchedulePricingPeriod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPricingSchedulePricingPeriod(od as api.PricingSchedulePricingPeriod);
     });
   });
@@ -16258,7 +16613,9 @@
   unittest.group('obj-schema-Project', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProject();
-      var od = api.Project.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Project.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProject(od as api.Project);
     });
   });
@@ -16266,7 +16623,9 @@
   unittest.group('obj-schema-ProjectsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectsListResponse();
-      var od = api.ProjectsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectsListResponse(od as api.ProjectsListResponse);
     });
   });
@@ -16274,7 +16633,9 @@
   unittest.group('obj-schema-ReachReportCompatibleFields', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReachReportCompatibleFields();
-      var od = api.ReachReportCompatibleFields.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReachReportCompatibleFields.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReachReportCompatibleFields(od as api.ReachReportCompatibleFields);
     });
   });
@@ -16282,7 +16643,9 @@
   unittest.group('obj-schema-Recipient', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecipient();
-      var od = api.Recipient.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Recipient.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRecipient(od as api.Recipient);
     });
   });
@@ -16290,7 +16653,9 @@
   unittest.group('obj-schema-Region', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegion();
-      var od = api.Region.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Region.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRegion(od as api.Region);
     });
   });
@@ -16298,7 +16663,9 @@
   unittest.group('obj-schema-RegionsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionsListResponse();
-      var od = api.RegionsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionsListResponse(od as api.RegionsListResponse);
     });
   });
@@ -16306,7 +16673,9 @@
   unittest.group('obj-schema-RemarketingList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemarketingList();
-      var od = api.RemarketingList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemarketingList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemarketingList(od as api.RemarketingList);
     });
   });
@@ -16314,7 +16683,9 @@
   unittest.group('obj-schema-RemarketingListShare', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemarketingListShare();
-      var od = api.RemarketingListShare.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemarketingListShare.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemarketingListShare(od as api.RemarketingListShare);
     });
   });
@@ -16322,7 +16693,9 @@
   unittest.group('obj-schema-RemarketingListsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemarketingListsListResponse();
-      var od = api.RemarketingListsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemarketingListsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemarketingListsListResponse(od as api.RemarketingListsListResponse);
     });
   });
@@ -16330,7 +16703,9 @@
   unittest.group('obj-schema-ReportCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportCriteria();
-      var od = api.ReportCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportCriteria(od as api.ReportCriteria);
     });
   });
@@ -16338,7 +16713,9 @@
   unittest.group('obj-schema-ReportCrossDimensionReachCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportCrossDimensionReachCriteria();
-      var od = api.ReportCrossDimensionReachCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportCrossDimensionReachCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportCrossDimensionReachCriteria(
           od as api.ReportCrossDimensionReachCriteria);
     });
@@ -16347,7 +16724,9 @@
   unittest.group('obj-schema-ReportDelivery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportDelivery();
-      var od = api.ReportDelivery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportDelivery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportDelivery(od as api.ReportDelivery);
     });
   });
@@ -16355,8 +16734,9 @@
   unittest.group('obj-schema-ReportFloodlightCriteriaReportProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportFloodlightCriteriaReportProperties();
-      var od =
-          api.ReportFloodlightCriteriaReportProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportFloodlightCriteriaReportProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportFloodlightCriteriaReportProperties(
           od as api.ReportFloodlightCriteriaReportProperties);
     });
@@ -16365,7 +16745,9 @@
   unittest.group('obj-schema-ReportFloodlightCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportFloodlightCriteria();
-      var od = api.ReportFloodlightCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportFloodlightCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportFloodlightCriteria(od as api.ReportFloodlightCriteria);
     });
   });
@@ -16373,7 +16755,9 @@
   unittest.group('obj-schema-ReportPathAttributionCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportPathAttributionCriteria();
-      var od = api.ReportPathAttributionCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportPathAttributionCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportPathAttributionCriteria(
           od as api.ReportPathAttributionCriteria);
     });
@@ -16382,7 +16766,9 @@
   unittest.group('obj-schema-ReportPathCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportPathCriteria();
-      var od = api.ReportPathCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportPathCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportPathCriteria(od as api.ReportPathCriteria);
     });
   });
@@ -16391,8 +16777,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportPathToConversionCriteriaReportProperties();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ReportPathToConversionCriteriaReportProperties.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportPathToConversionCriteriaReportProperties(
           od as api.ReportPathToConversionCriteriaReportProperties);
     });
@@ -16401,7 +16788,9 @@
   unittest.group('obj-schema-ReportPathToConversionCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportPathToConversionCriteria();
-      var od = api.ReportPathToConversionCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportPathToConversionCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportPathToConversionCriteria(
           od as api.ReportPathToConversionCriteria);
     });
@@ -16410,7 +16799,9 @@
   unittest.group('obj-schema-ReportReachCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportReachCriteria();
-      var od = api.ReportReachCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportReachCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportReachCriteria(od as api.ReportReachCriteria);
     });
   });
@@ -16418,7 +16809,9 @@
   unittest.group('obj-schema-ReportSchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportSchedule();
-      var od = api.ReportSchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportSchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportSchedule(od as api.ReportSchedule);
     });
   });
@@ -16426,7 +16819,9 @@
   unittest.group('obj-schema-Report', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReport();
-      var od = api.Report.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Report.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReport(od as api.Report);
     });
   });
@@ -16434,7 +16829,9 @@
   unittest.group('obj-schema-ReportCompatibleFields', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportCompatibleFields();
-      var od = api.ReportCompatibleFields.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportCompatibleFields.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportCompatibleFields(od as api.ReportCompatibleFields);
     });
   });
@@ -16442,7 +16839,9 @@
   unittest.group('obj-schema-ReportList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportList();
-      var od = api.ReportList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReportList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReportList(od as api.ReportList);
     });
   });
@@ -16450,7 +16849,9 @@
   unittest.group('obj-schema-ReportsConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportsConfiguration();
-      var od = api.ReportsConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportsConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportsConfiguration(od as api.ReportsConfiguration);
     });
   });
@@ -16458,7 +16859,9 @@
   unittest.group('obj-schema-RichMediaExitOverride', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRichMediaExitOverride();
-      var od = api.RichMediaExitOverride.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RichMediaExitOverride.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRichMediaExitOverride(od as api.RichMediaExitOverride);
     });
   });
@@ -16466,7 +16869,8 @@
   unittest.group('obj-schema-Rule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRule();
-      var od = api.Rule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Rule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRule(od as api.Rule);
     });
   });
@@ -16474,7 +16878,8 @@
   unittest.group('obj-schema-Site', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSite();
-      var od = api.Site.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Site.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSite(od as api.Site);
     });
   });
@@ -16482,7 +16887,9 @@
   unittest.group('obj-schema-SiteCompanionSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteCompanionSetting();
-      var od = api.SiteCompanionSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteCompanionSetting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteCompanionSetting(od as api.SiteCompanionSetting);
     });
   });
@@ -16490,7 +16897,9 @@
   unittest.group('obj-schema-SiteContact', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteContact();
-      var od = api.SiteContact.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteContact.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteContact(od as api.SiteContact);
     });
   });
@@ -16498,7 +16907,9 @@
   unittest.group('obj-schema-SiteSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteSettings();
-      var od = api.SiteSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteSettings(od as api.SiteSettings);
     });
   });
@@ -16506,7 +16917,9 @@
   unittest.group('obj-schema-SiteSkippableSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteSkippableSetting();
-      var od = api.SiteSkippableSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteSkippableSetting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteSkippableSetting(od as api.SiteSkippableSetting);
     });
   });
@@ -16514,7 +16927,9 @@
   unittest.group('obj-schema-SiteTranscodeSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteTranscodeSetting();
-      var od = api.SiteTranscodeSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteTranscodeSetting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteTranscodeSetting(od as api.SiteTranscodeSetting);
     });
   });
@@ -16522,7 +16937,9 @@
   unittest.group('obj-schema-SiteVideoSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteVideoSettings();
-      var od = api.SiteVideoSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteVideoSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteVideoSettings(od as api.SiteVideoSettings);
     });
   });
@@ -16530,7 +16947,9 @@
   unittest.group('obj-schema-SitesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSitesListResponse();
-      var od = api.SitesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SitesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSitesListResponse(od as api.SitesListResponse);
     });
   });
@@ -16538,7 +16957,8 @@
   unittest.group('obj-schema-Size', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSize();
-      var od = api.Size.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Size.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSize(od as api.Size);
     });
   });
@@ -16546,7 +16966,9 @@
   unittest.group('obj-schema-SizesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSizesListResponse();
-      var od = api.SizesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SizesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSizesListResponse(od as api.SizesListResponse);
     });
   });
@@ -16554,7 +16976,9 @@
   unittest.group('obj-schema-SkippableSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSkippableSetting();
-      var od = api.SkippableSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SkippableSetting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSkippableSetting(od as api.SkippableSetting);
     });
   });
@@ -16562,7 +16986,9 @@
   unittest.group('obj-schema-SortedDimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSortedDimension();
-      var od = api.SortedDimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SortedDimension.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSortedDimension(od as api.SortedDimension);
     });
   });
@@ -16570,7 +16996,9 @@
   unittest.group('obj-schema-Subaccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubaccount();
-      var od = api.Subaccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Subaccount.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSubaccount(od as api.Subaccount);
     });
   });
@@ -16578,7 +17006,9 @@
   unittest.group('obj-schema-SubaccountsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubaccountsListResponse();
-      var od = api.SubaccountsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubaccountsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubaccountsListResponse(od as api.SubaccountsListResponse);
     });
   });
@@ -16586,7 +17016,9 @@
   unittest.group('obj-schema-TagData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTagData();
-      var od = api.TagData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TagData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTagData(od as api.TagData);
     });
   });
@@ -16594,7 +17026,9 @@
   unittest.group('obj-schema-TagSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTagSetting();
-      var od = api.TagSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TagSetting.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTagSetting(od as api.TagSetting);
     });
   });
@@ -16602,7 +17036,9 @@
   unittest.group('obj-schema-TagSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTagSettings();
-      var od = api.TagSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TagSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTagSettings(od as api.TagSettings);
     });
   });
@@ -16610,7 +17046,9 @@
   unittest.group('obj-schema-TargetWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetWindow();
-      var od = api.TargetWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetWindow(od as api.TargetWindow);
     });
   });
@@ -16618,7 +17056,9 @@
   unittest.group('obj-schema-TargetableRemarketingList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetableRemarketingList();
-      var od = api.TargetableRemarketingList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetableRemarketingList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetableRemarketingList(od as api.TargetableRemarketingList);
     });
   });
@@ -16626,7 +17066,9 @@
   unittest.group('obj-schema-TargetableRemarketingListsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetableRemarketingListsListResponse();
-      var od = api.TargetableRemarketingListsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetableRemarketingListsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetableRemarketingListsListResponse(
           od as api.TargetableRemarketingListsListResponse);
     });
@@ -16635,7 +17077,9 @@
   unittest.group('obj-schema-TargetingTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingTemplate();
-      var od = api.TargetingTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingTemplate(od as api.TargetingTemplate);
     });
   });
@@ -16643,7 +17087,9 @@
   unittest.group('obj-schema-TargetingTemplatesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingTemplatesListResponse();
-      var od = api.TargetingTemplatesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingTemplatesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingTemplatesListResponse(
           od as api.TargetingTemplatesListResponse);
     });
@@ -16652,7 +17098,9 @@
   unittest.group('obj-schema-TechnologyTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTechnologyTargeting();
-      var od = api.TechnologyTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TechnologyTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTechnologyTargeting(od as api.TechnologyTargeting);
     });
   });
@@ -16660,7 +17108,9 @@
   unittest.group('obj-schema-ThirdPartyAuthenticationToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThirdPartyAuthenticationToken();
-      var od = api.ThirdPartyAuthenticationToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThirdPartyAuthenticationToken.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThirdPartyAuthenticationToken(
           od as api.ThirdPartyAuthenticationToken);
     });
@@ -16669,7 +17119,9 @@
   unittest.group('obj-schema-ThirdPartyTrackingUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThirdPartyTrackingUrl();
-      var od = api.ThirdPartyTrackingUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThirdPartyTrackingUrl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThirdPartyTrackingUrl(od as api.ThirdPartyTrackingUrl);
     });
   });
@@ -16677,7 +17129,9 @@
   unittest.group('obj-schema-TranscodeSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTranscodeSetting();
-      var od = api.TranscodeSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TranscodeSetting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTranscodeSetting(od as api.TranscodeSetting);
     });
   });
@@ -16685,7 +17139,9 @@
   unittest.group('obj-schema-UniversalAdId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUniversalAdId();
-      var od = api.UniversalAdId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UniversalAdId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUniversalAdId(od as api.UniversalAdId);
     });
   });
@@ -16693,7 +17149,9 @@
   unittest.group('obj-schema-UserDefinedVariableConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserDefinedVariableConfiguration();
-      var od = api.UserDefinedVariableConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserDefinedVariableConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserDefinedVariableConfiguration(
           od as api.UserDefinedVariableConfiguration);
     });
@@ -16702,7 +17160,9 @@
   unittest.group('obj-schema-UserProfile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserProfile();
-      var od = api.UserProfile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserProfile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserProfile(od as api.UserProfile);
     });
   });
@@ -16710,7 +17170,9 @@
   unittest.group('obj-schema-UserProfileList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserProfileList();
-      var od = api.UserProfileList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserProfileList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserProfileList(od as api.UserProfileList);
     });
   });
@@ -16718,7 +17180,9 @@
   unittest.group('obj-schema-UserRole', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserRole();
-      var od = api.UserRole.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserRole.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserRole(od as api.UserRole);
     });
   });
@@ -16726,7 +17190,9 @@
   unittest.group('obj-schema-UserRolePermission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserRolePermission();
-      var od = api.UserRolePermission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserRolePermission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserRolePermission(od as api.UserRolePermission);
     });
   });
@@ -16734,7 +17200,9 @@
   unittest.group('obj-schema-UserRolePermissionGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserRolePermissionGroup();
-      var od = api.UserRolePermissionGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserRolePermissionGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserRolePermissionGroup(od as api.UserRolePermissionGroup);
     });
   });
@@ -16742,7 +17210,9 @@
   unittest.group('obj-schema-UserRolePermissionGroupsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserRolePermissionGroupsListResponse();
-      var od = api.UserRolePermissionGroupsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserRolePermissionGroupsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserRolePermissionGroupsListResponse(
           od as api.UserRolePermissionGroupsListResponse);
     });
@@ -16751,7 +17221,9 @@
   unittest.group('obj-schema-UserRolePermissionsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserRolePermissionsListResponse();
-      var od = api.UserRolePermissionsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserRolePermissionsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserRolePermissionsListResponse(
           od as api.UserRolePermissionsListResponse);
     });
@@ -16760,7 +17232,9 @@
   unittest.group('obj-schema-UserRolesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserRolesListResponse();
-      var od = api.UserRolesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserRolesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserRolesListResponse(od as api.UserRolesListResponse);
     });
   });
@@ -16768,7 +17242,9 @@
   unittest.group('obj-schema-VideoFormat', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoFormat();
-      var od = api.VideoFormat.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoFormat.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoFormat(od as api.VideoFormat);
     });
   });
@@ -16776,7 +17252,9 @@
   unittest.group('obj-schema-VideoFormatsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoFormatsListResponse();
-      var od = api.VideoFormatsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoFormatsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoFormatsListResponse(od as api.VideoFormatsListResponse);
     });
   });
@@ -16784,7 +17262,9 @@
   unittest.group('obj-schema-VideoOffset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoOffset();
-      var od = api.VideoOffset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoOffset.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoOffset(od as api.VideoOffset);
     });
   });
@@ -16792,7 +17272,9 @@
   unittest.group('obj-schema-VideoSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoSettings();
-      var od = api.VideoSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoSettings(od as api.VideoSettings);
     });
   });
diff --git a/generated/googleapis/test/dialogflow/v2_test.dart b/generated/googleapis/test/dialogflow/v2_test.dart
index 7808197..7c25b85 100644
--- a/generated/googleapis/test/dialogflow/v2_test.dart
+++ b/generated/googleapis/test/dialogflow/v2_test.dart
@@ -14250,7 +14250,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3AudioInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3AudioInput();
-      var od = api.GoogleCloudDialogflowCxV3AudioInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3AudioInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3AudioInput(
           od as api.GoogleCloudDialogflowCxV3AudioInput);
     });
@@ -14260,8 +14262,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3BatchRunTestCasesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3BatchRunTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3BatchRunTestCasesMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3BatchRunTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3BatchRunTestCasesMetadata);
     });
@@ -14271,8 +14274,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3BatchRunTestCasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3BatchRunTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3BatchRunTestCasesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3BatchRunTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3BatchRunTestCasesResponse);
     });
@@ -14281,8 +14285,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ConversationTurn', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ConversationTurn();
-      var od =
-          api.GoogleCloudDialogflowCxV3ConversationTurn.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ConversationTurn.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ConversationTurn(
           od as api.GoogleCloudDialogflowCxV3ConversationTurn);
     });
@@ -14292,8 +14297,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3ConversationTurnUserInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ConversationTurnUserInput();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ConversationTurnUserInput.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ConversationTurnUserInput(
           od as api.GoogleCloudDialogflowCxV3ConversationTurnUserInput);
     });
@@ -14305,8 +14311,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3ConversationTurnVirtualAgentOutput();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ConversationTurnVirtualAgentOutput
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ConversationTurnVirtualAgentOutput(od
           as api.GoogleCloudDialogflowCxV3ConversationTurnVirtualAgentOutput);
     });
@@ -14317,9 +14324,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3CreateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3CreateDocumentOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3CreateDocumentOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3CreateDocumentOperationMetadata);
     });
@@ -14329,9 +14337,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3CreateVersionOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3CreateVersionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3CreateVersionOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3CreateVersionOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3CreateVersionOperationMetadata);
     });
@@ -14342,9 +14351,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3DeleteDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3DeleteDocumentOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3DeleteDocumentOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3DeleteDocumentOperationMetadata);
     });
@@ -14353,7 +14363,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3DtmfInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3DtmfInput();
-      var od = api.GoogleCloudDialogflowCxV3DtmfInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3DtmfInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3DtmfInput(
           od as api.GoogleCloudDialogflowCxV3DtmfInput);
     });
@@ -14362,7 +14374,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3EventHandler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3EventHandler();
-      var od = api.GoogleCloudDialogflowCxV3EventHandler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3EventHandler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3EventHandler(
           od as api.GoogleCloudDialogflowCxV3EventHandler);
     });
@@ -14371,7 +14385,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3EventInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3EventInput();
-      var od = api.GoogleCloudDialogflowCxV3EventInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3EventInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3EventInput(
           od as api.GoogleCloudDialogflowCxV3EventInput);
     });
@@ -14380,8 +14396,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ExportAgentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExportAgentResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3ExportAgentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ExportAgentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExportAgentResponse(
           od as api.GoogleCloudDialogflowCxV3ExportAgentResponse);
     });
@@ -14391,8 +14408,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExportTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ExportTestCasesMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExportTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3ExportTestCasesMetadata);
     });
@@ -14402,8 +14420,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExportTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ExportTestCasesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExportTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3ExportTestCasesResponse);
     });
@@ -14412,7 +14431,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Form', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Form();
-      var od = api.GoogleCloudDialogflowCxV3Form.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Form.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Form(
           od as api.GoogleCloudDialogflowCxV3Form);
     });
@@ -14421,7 +14442,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3FormParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FormParameter();
-      var od = api.GoogleCloudDialogflowCxV3FormParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3FormParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FormParameter(
           od as api.GoogleCloudDialogflowCxV3FormParameter);
     });
@@ -14431,8 +14454,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3FormParameterFillBehavior', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FormParameterFillBehavior();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3FormParameterFillBehavior.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FormParameterFillBehavior(
           od as api.GoogleCloudDialogflowCxV3FormParameterFillBehavior);
     });
@@ -14441,7 +14465,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Fulfillment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Fulfillment();
-      var od = api.GoogleCloudDialogflowCxV3Fulfillment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Fulfillment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Fulfillment(
           od as api.GoogleCloudDialogflowCxV3Fulfillment);
     });
@@ -14451,9 +14477,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3FulfillmentConditionalCases', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FulfillmentConditionalCases();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3FulfillmentConditionalCases.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FulfillmentConditionalCases(
           od as api.GoogleCloudDialogflowCxV3FulfillmentConditionalCases);
     });
@@ -14464,9 +14491,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FulfillmentConditionalCasesCase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3FulfillmentConditionalCasesCase.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FulfillmentConditionalCasesCase(
           od as api.GoogleCloudDialogflowCxV3FulfillmentConditionalCasesCase);
     });
@@ -14478,9 +14506,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3FulfillmentConditionalCasesCaseCaseContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3FulfillmentConditionalCasesCaseCaseContent
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FulfillmentConditionalCasesCaseCaseContent(
           od as api
               .GoogleCloudDialogflowCxV3FulfillmentConditionalCasesCaseCaseContent);
@@ -14491,9 +14520,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3FulfillmentSetParameterAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FulfillmentSetParameterAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3FulfillmentSetParameterAction.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FulfillmentSetParameterAction(
           od as api.GoogleCloudDialogflowCxV3FulfillmentSetParameterAction);
     });
@@ -14504,8 +14534,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3GenericKnowledgeOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3GenericKnowledgeOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3GenericKnowledgeOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3GenericKnowledgeOperationMetadata);
     });
@@ -14516,8 +14547,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ImportDocumentsOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ImportDocumentsOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ImportDocumentsOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3ImportDocumentsOperationMetadata);
     });
@@ -14527,8 +14559,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ImportDocumentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ImportDocumentsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ImportDocumentsResponse(
           od as api.GoogleCloudDialogflowCxV3ImportDocumentsResponse);
     });
@@ -14538,8 +14571,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ImportTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ImportTestCasesMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ImportTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3ImportTestCasesMetadata);
     });
@@ -14549,8 +14583,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ImportTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ImportTestCasesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ImportTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3ImportTestCasesResponse);
     });
@@ -14559,8 +14594,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3InputAudioConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3InputAudioConfig();
-      var od =
-          api.GoogleCloudDialogflowCxV3InputAudioConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3InputAudioConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3InputAudioConfig(
           od as api.GoogleCloudDialogflowCxV3InputAudioConfig);
     });
@@ -14569,7 +14605,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Intent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Intent();
-      var od = api.GoogleCloudDialogflowCxV3Intent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Intent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Intent(
           od as api.GoogleCloudDialogflowCxV3Intent);
     });
@@ -14578,7 +14616,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3IntentInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3IntentInput();
-      var od = api.GoogleCloudDialogflowCxV3IntentInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3IntentInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3IntentInput(
           od as api.GoogleCloudDialogflowCxV3IntentInput);
     });
@@ -14587,8 +14627,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3IntentParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3IntentParameter();
-      var od =
-          api.GoogleCloudDialogflowCxV3IntentParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3IntentParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3IntentParameter(
           od as api.GoogleCloudDialogflowCxV3IntentParameter);
     });
@@ -14598,8 +14639,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3IntentTrainingPhrase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3IntentTrainingPhrase.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3IntentTrainingPhrase(
           od as api.GoogleCloudDialogflowCxV3IntentTrainingPhrase);
     });
@@ -14609,8 +14651,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3IntentTrainingPhrasePart();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3IntentTrainingPhrasePart.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3IntentTrainingPhrasePart(
           od as api.GoogleCloudDialogflowCxV3IntentTrainingPhrasePart);
     });
@@ -14619,7 +14662,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Page();
-      var od = api.GoogleCloudDialogflowCxV3Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Page.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Page(
           od as api.GoogleCloudDialogflowCxV3Page);
     });
@@ -14628,7 +14673,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3PageInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3PageInfo();
-      var od = api.GoogleCloudDialogflowCxV3PageInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3PageInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3PageInfo(
           od as api.GoogleCloudDialogflowCxV3PageInfo);
     });
@@ -14637,8 +14684,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3PageInfoFormInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3PageInfoFormInfo();
-      var od =
-          api.GoogleCloudDialogflowCxV3PageInfoFormInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3PageInfoFormInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3PageInfoFormInfo(
           od as api.GoogleCloudDialogflowCxV3PageInfoFormInfo);
     });
@@ -14648,9 +14696,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3PageInfoFormInfoParameterInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3PageInfoFormInfoParameterInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3PageInfoFormInfoParameterInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3PageInfoFormInfoParameterInfo(
           od as api.GoogleCloudDialogflowCxV3PageInfoFormInfoParameterInfo);
     });
@@ -14659,7 +14708,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3QueryInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3QueryInput();
-      var od = api.GoogleCloudDialogflowCxV3QueryInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3QueryInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3QueryInput(
           od as api.GoogleCloudDialogflowCxV3QueryInput);
     });
@@ -14670,9 +14721,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ReloadDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ReloadDocumentOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ReloadDocumentOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3ReloadDocumentOperationMetadata);
     });
@@ -14681,8 +14733,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ResponseMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessage();
-      var od =
-          api.GoogleCloudDialogflowCxV3ResponseMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ResponseMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessage(
           od as api.GoogleCloudDialogflowCxV3ResponseMessage);
     });
@@ -14694,8 +14747,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3ResponseMessageConversationSuccess();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ResponseMessageConversationSuccess
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageConversationSuccess(od
           as api.GoogleCloudDialogflowCxV3ResponseMessageConversationSuccess);
     });
@@ -14705,9 +14759,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3ResponseMessageEndInteraction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageEndInteraction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ResponseMessageEndInteraction.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageEndInteraction(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageEndInteraction);
     });
@@ -14718,9 +14773,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageLiveAgentHandoff();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ResponseMessageLiveAgentHandoff.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageLiveAgentHandoff(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageLiveAgentHandoff);
     });
@@ -14730,8 +14786,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3ResponseMessageMixedAudio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageMixedAudio();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ResponseMessageMixedAudio.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageMixedAudio(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageMixedAudio);
     });
@@ -14742,8 +14799,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageMixedAudioSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ResponseMessageMixedAudioSegment
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageMixedAudioSegment(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageMixedAudioSegment);
     });
@@ -14753,9 +14811,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3ResponseMessageOutputAudioText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageOutputAudioText();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ResponseMessageOutputAudioText.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageOutputAudioText(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageOutputAudioText);
     });
@@ -14765,8 +14824,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessagePlayAudio();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ResponseMessagePlayAudio.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessagePlayAudio(
           od as api.GoogleCloudDialogflowCxV3ResponseMessagePlayAudio);
     });
@@ -14775,8 +14835,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ResponseMessageText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageText();
-      var od =
-          api.GoogleCloudDialogflowCxV3ResponseMessageText.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ResponseMessageText.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageText(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageText);
     });
@@ -14785,8 +14846,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3RunTestCaseMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3RunTestCaseMetadata();
-      var od =
-          api.GoogleCloudDialogflowCxV3RunTestCaseMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3RunTestCaseMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3RunTestCaseMetadata(
           od as api.GoogleCloudDialogflowCxV3RunTestCaseMetadata);
     });
@@ -14795,8 +14857,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3RunTestCaseResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3RunTestCaseResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3RunTestCaseResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3RunTestCaseResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3RunTestCaseResponse(
           od as api.GoogleCloudDialogflowCxV3RunTestCaseResponse);
     });
@@ -14805,7 +14868,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3SessionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3SessionInfo();
-      var od = api.GoogleCloudDialogflowCxV3SessionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3SessionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3SessionInfo(
           od as api.GoogleCloudDialogflowCxV3SessionInfo);
     });
@@ -14814,7 +14879,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestCase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestCase();
-      var od = api.GoogleCloudDialogflowCxV3TestCase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestCase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestCase(
           od as api.GoogleCloudDialogflowCxV3TestCase);
     });
@@ -14823,7 +14890,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestCaseError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestCaseError();
-      var od = api.GoogleCloudDialogflowCxV3TestCaseError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestCaseError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestCaseError(
           od as api.GoogleCloudDialogflowCxV3TestCaseError);
     });
@@ -14832,7 +14901,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestCaseResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestCaseResult();
-      var od = api.GoogleCloudDialogflowCxV3TestCaseResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestCaseResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestCaseResult(
           od as api.GoogleCloudDialogflowCxV3TestCaseResult);
     });
@@ -14841,7 +14912,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestConfig();
-      var od = api.GoogleCloudDialogflowCxV3TestConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestConfig(
           od as api.GoogleCloudDialogflowCxV3TestConfig);
     });
@@ -14850,7 +14923,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestError();
-      var od = api.GoogleCloudDialogflowCxV3TestError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestError(
           od as api.GoogleCloudDialogflowCxV3TestError);
     });
@@ -14859,8 +14934,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestRunDifference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestRunDifference();
-      var od =
-          api.GoogleCloudDialogflowCxV3TestRunDifference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestRunDifference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestRunDifference(
           od as api.GoogleCloudDialogflowCxV3TestRunDifference);
     });
@@ -14869,7 +14945,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TextInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TextInput();
-      var od = api.GoogleCloudDialogflowCxV3TextInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TextInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TextInput(
           od as api.GoogleCloudDialogflowCxV3TextInput);
     });
@@ -14878,8 +14956,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TransitionRoute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TransitionRoute();
-      var od =
-          api.GoogleCloudDialogflowCxV3TransitionRoute.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TransitionRoute.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TransitionRoute(
           od as api.GoogleCloudDialogflowCxV3TransitionRoute);
     });
@@ -14890,9 +14969,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3UpdateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3UpdateDocumentOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3UpdateDocumentOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3UpdateDocumentOperationMetadata);
     });
@@ -14901,7 +14981,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3WebhookRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3WebhookRequest();
-      var od = api.GoogleCloudDialogflowCxV3WebhookRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3WebhookRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookRequest(
           od as api.GoogleCloudDialogflowCxV3WebhookRequest);
     });
@@ -14911,9 +14993,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3WebhookRequestFulfillmentInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3WebhookRequestFulfillmentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3WebhookRequestFulfillmentInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookRequestFulfillmentInfo(
           od as api.GoogleCloudDialogflowCxV3WebhookRequestFulfillmentInfo);
     });
@@ -14923,8 +15006,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3WebhookRequestIntentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3WebhookRequestIntentInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookRequestIntentInfo(
           od as api.GoogleCloudDialogflowCxV3WebhookRequestIntentInfo);
     });
@@ -14936,9 +15020,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue(
           od as api
               .GoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue);
@@ -14951,9 +15036,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3WebhookRequestSentimentAnalysisResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3WebhookRequestSentimentAnalysisResult
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookRequestSentimentAnalysisResult(od
           as api
               .GoogleCloudDialogflowCxV3WebhookRequestSentimentAnalysisResult);
@@ -14963,8 +15049,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3WebhookResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3WebhookResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3WebhookResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3WebhookResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookResponse(
           od as api.GoogleCloudDialogflowCxV3WebhookResponse);
     });
@@ -14976,8 +15063,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3WebhookResponseFulfillmentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3WebhookResponseFulfillmentResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookResponseFulfillmentResponse(od
           as api.GoogleCloudDialogflowCxV3WebhookResponseFulfillmentResponse);
     });
@@ -14986,8 +15074,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1AudioInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1AudioInput();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1AudioInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1AudioInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1AudioInput(
           od as api.GoogleCloudDialogflowCxV3beta1AudioInput);
     });
@@ -14997,9 +15086,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1BatchRunTestCasesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1BatchRunTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1BatchRunTestCasesMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1BatchRunTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3beta1BatchRunTestCasesMetadata);
     });
@@ -15009,9 +15099,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1BatchRunTestCasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1BatchRunTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1BatchRunTestCasesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1BatchRunTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3beta1BatchRunTestCasesResponse);
     });
@@ -15021,8 +15112,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ConversationTurn();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ConversationTurn.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ConversationTurn(
           od as api.GoogleCloudDialogflowCxV3beta1ConversationTurn);
     });
@@ -15032,9 +15124,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ConversationTurnUserInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ConversationTurnUserInput();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ConversationTurnUserInput.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ConversationTurnUserInput(
           od as api.GoogleCloudDialogflowCxV3beta1ConversationTurnUserInput);
     });
@@ -15046,9 +15139,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ConversationTurnVirtualAgentOutput();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ConversationTurnVirtualAgentOutput
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ConversationTurnVirtualAgentOutput(od
           as api
               .GoogleCloudDialogflowCxV3beta1ConversationTurnVirtualAgentOutput);
@@ -15061,8 +15155,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1CreateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1CreateDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1CreateDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowCxV3beta1CreateDocumentOperationMetadata);
     });
@@ -15074,8 +15169,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata(od
           as api.GoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata);
     });
@@ -15087,8 +15183,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1DeleteDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1DeleteDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1DeleteDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowCxV3beta1DeleteDocumentOperationMetadata);
     });
@@ -15097,7 +15194,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1DtmfInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1DtmfInput();
-      var od = api.GoogleCloudDialogflowCxV3beta1DtmfInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1DtmfInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1DtmfInput(
           od as api.GoogleCloudDialogflowCxV3beta1DtmfInput);
     });
@@ -15106,8 +15205,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1EventHandler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1EventHandler();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1EventHandler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1EventHandler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1EventHandler(
           od as api.GoogleCloudDialogflowCxV3beta1EventHandler);
     });
@@ -15116,8 +15216,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1EventInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1EventInput();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1EventInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1EventInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1EventInput(
           od as api.GoogleCloudDialogflowCxV3beta1EventInput);
     });
@@ -15127,8 +15228,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ExportAgentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ExportAgentResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ExportAgentResponse(
           od as api.GoogleCloudDialogflowCxV3beta1ExportAgentResponse);
     });
@@ -15138,9 +15240,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ExportTestCasesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ExportTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ExportTestCasesMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ExportTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3beta1ExportTestCasesMetadata);
     });
@@ -15150,9 +15253,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ExportTestCasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ExportTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ExportTestCasesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ExportTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3beta1ExportTestCasesResponse);
     });
@@ -15161,7 +15265,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1Form', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1Form();
-      var od = api.GoogleCloudDialogflowCxV3beta1Form.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1Form.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1Form(
           od as api.GoogleCloudDialogflowCxV3beta1Form);
     });
@@ -15170,8 +15276,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1FormParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1FormParameter();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1FormParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1FormParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FormParameter(
           od as api.GoogleCloudDialogflowCxV3beta1FormParameter);
     });
@@ -15181,9 +15288,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1FormParameterFillBehavior', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1FormParameterFillBehavior();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1FormParameterFillBehavior.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FormParameterFillBehavior(
           od as api.GoogleCloudDialogflowCxV3beta1FormParameterFillBehavior);
     });
@@ -15192,8 +15300,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1Fulfillment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1Fulfillment();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1Fulfillment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1Fulfillment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1Fulfillment(
           od as api.GoogleCloudDialogflowCxV3beta1Fulfillment);
     });
@@ -15204,8 +15313,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCases();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCases
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCases(
           od as api.GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCases);
     });
@@ -15217,8 +15327,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCase
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCase(od
           as api.GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCase);
     });
@@ -15230,9 +15341,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCaseCaseContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCaseCaseContent
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCaseCaseContent(
           od as api
               .GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCaseCaseContent);
@@ -15245,8 +15357,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1FulfillmentSetParameterAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1FulfillmentSetParameterAction
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FulfillmentSetParameterAction(od
           as api.GoogleCloudDialogflowCxV3beta1FulfillmentSetParameterAction);
     });
@@ -15258,9 +15371,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1GenericKnowledgeOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1GenericKnowledgeOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1GenericKnowledgeOperationMetadata(od
           as api
               .GoogleCloudDialogflowCxV3beta1GenericKnowledgeOperationMetadata);
@@ -15273,9 +15387,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ImportDocumentsOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ImportDocumentsOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ImportDocumentsOperationMetadata(od
           as api
               .GoogleCloudDialogflowCxV3beta1ImportDocumentsOperationMetadata);
@@ -15286,9 +15401,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ImportDocumentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ImportDocumentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ImportDocumentsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ImportDocumentsResponse(
           od as api.GoogleCloudDialogflowCxV3beta1ImportDocumentsResponse);
     });
@@ -15298,9 +15414,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ImportTestCasesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ImportTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ImportTestCasesMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ImportTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3beta1ImportTestCasesMetadata);
     });
@@ -15310,9 +15427,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ImportTestCasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ImportTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ImportTestCasesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ImportTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3beta1ImportTestCasesResponse);
     });
@@ -15322,8 +15440,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1InputAudioConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1InputAudioConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1InputAudioConfig(
           od as api.GoogleCloudDialogflowCxV3beta1InputAudioConfig);
     });
@@ -15332,7 +15451,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1Intent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1Intent();
-      var od = api.GoogleCloudDialogflowCxV3beta1Intent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1Intent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1Intent(
           od as api.GoogleCloudDialogflowCxV3beta1Intent);
     });
@@ -15341,8 +15462,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1IntentInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1IntentInput();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1IntentInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1IntentInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1IntentInput(
           od as api.GoogleCloudDialogflowCxV3beta1IntentInput);
     });
@@ -15352,8 +15474,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1IntentParameter();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1IntentParameter.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1IntentParameter(
           od as api.GoogleCloudDialogflowCxV3beta1IntentParameter);
     });
@@ -15363,8 +15486,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1IntentTrainingPhrase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1IntentTrainingPhrase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1IntentTrainingPhrase.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1IntentTrainingPhrase(
           od as api.GoogleCloudDialogflowCxV3beta1IntentTrainingPhrase);
     });
@@ -15374,9 +15498,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1IntentTrainingPhrasePart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1IntentTrainingPhrasePart();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1IntentTrainingPhrasePart.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1IntentTrainingPhrasePart(
           od as api.GoogleCloudDialogflowCxV3beta1IntentTrainingPhrasePart);
     });
@@ -15385,7 +15510,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1Page();
-      var od = api.GoogleCloudDialogflowCxV3beta1Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1Page.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1Page(
           od as api.GoogleCloudDialogflowCxV3beta1Page);
     });
@@ -15394,7 +15521,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1PageInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1PageInfo();
-      var od = api.GoogleCloudDialogflowCxV3beta1PageInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1PageInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1PageInfo(
           od as api.GoogleCloudDialogflowCxV3beta1PageInfo);
     });
@@ -15404,8 +15533,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1PageInfoFormInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfo(
           od as api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfo);
     });
@@ -15417,8 +15547,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo(od
           as api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo);
     });
@@ -15427,8 +15558,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1QueryInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1QueryInput();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1QueryInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1QueryInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1QueryInput(
           od as api.GoogleCloudDialogflowCxV3beta1QueryInput);
     });
@@ -15440,8 +15572,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ReloadDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ReloadDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ReloadDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowCxV3beta1ReloadDocumentOperationMetadata);
     });
@@ -15451,8 +15584,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ResponseMessage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessage(
           od as api.GoogleCloudDialogflowCxV3beta1ResponseMessage);
     });
@@ -15464,9 +15598,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess(od
           as api
               .GoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess);
@@ -15479,8 +15614,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction(od
           as api.GoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction);
     });
@@ -15492,8 +15628,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff(od
           as api.GoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff);
     });
@@ -15503,9 +15640,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio(
           od as api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio);
     });
@@ -15517,9 +15655,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment(od
           as api
               .GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment);
@@ -15532,8 +15671,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText(od
           as api.GoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText);
     });
@@ -15543,9 +15683,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio(
           od as api.GoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio);
     });
@@ -15555,8 +15696,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ResponseMessageText();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageText.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageText(
           od as api.GoogleCloudDialogflowCxV3beta1ResponseMessageText);
     });
@@ -15566,8 +15708,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1RunTestCaseMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1RunTestCaseMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1RunTestCaseMetadata(
           od as api.GoogleCloudDialogflowCxV3beta1RunTestCaseMetadata);
     });
@@ -15577,8 +15720,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1RunTestCaseResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1RunTestCaseResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1RunTestCaseResponse(
           od as api.GoogleCloudDialogflowCxV3beta1RunTestCaseResponse);
     });
@@ -15587,8 +15731,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1SessionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1SessionInfo();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1SessionInfo(
           od as api.GoogleCloudDialogflowCxV3beta1SessionInfo);
     });
@@ -15597,7 +15742,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TestCase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestCase();
-      var od = api.GoogleCloudDialogflowCxV3beta1TestCase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TestCase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestCase(
           od as api.GoogleCloudDialogflowCxV3beta1TestCase);
     });
@@ -15606,8 +15753,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TestCaseError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestCaseError();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1TestCaseError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TestCaseError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestCaseError(
           od as api.GoogleCloudDialogflowCxV3beta1TestCaseError);
     });
@@ -15616,8 +15764,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TestCaseResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestCaseResult();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1TestCaseResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TestCaseResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestCaseResult(
           od as api.GoogleCloudDialogflowCxV3beta1TestCaseResult);
     });
@@ -15626,8 +15775,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TestConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestConfig();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1TestConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TestConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestConfig(
           od as api.GoogleCloudDialogflowCxV3beta1TestConfig);
     });
@@ -15636,7 +15786,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TestError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestError();
-      var od = api.GoogleCloudDialogflowCxV3beta1TestError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TestError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestError(
           od as api.GoogleCloudDialogflowCxV3beta1TestError);
     });
@@ -15646,8 +15798,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestRunDifference();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1TestRunDifference.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestRunDifference(
           od as api.GoogleCloudDialogflowCxV3beta1TestRunDifference);
     });
@@ -15656,7 +15809,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TextInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TextInput();
-      var od = api.GoogleCloudDialogflowCxV3beta1TextInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TextInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TextInput(
           od as api.GoogleCloudDialogflowCxV3beta1TextInput);
     });
@@ -15666,8 +15821,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TransitionRoute();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1TransitionRoute.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TransitionRoute(
           od as api.GoogleCloudDialogflowCxV3beta1TransitionRoute);
     });
@@ -15679,8 +15835,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1UpdateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1UpdateDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1UpdateDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowCxV3beta1UpdateDocumentOperationMetadata);
     });
@@ -15689,8 +15846,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1WebhookRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1WebhookRequest();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1WebhookRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1WebhookRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookRequest(
           od as api.GoogleCloudDialogflowCxV3beta1WebhookRequest);
     });
@@ -15702,8 +15860,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo(od
           as api.GoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo);
     });
@@ -15713,9 +15872,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo(
           od as api.GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo);
     });
@@ -15727,9 +15887,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue(
           od as api
               .GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue);
@@ -15742,9 +15903,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1WebhookRequestSentimentAnalysisResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookRequestSentimentAnalysisResult
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookRequestSentimentAnalysisResult(
           od as api
               .GoogleCloudDialogflowCxV3beta1WebhookRequestSentimentAnalysisResult);
@@ -15755,8 +15917,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1WebhookResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1WebhookResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookResponse(
           od as api.GoogleCloudDialogflowCxV3beta1WebhookResponse);
     });
@@ -15768,9 +15931,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse(od
           as api
               .GoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse);
@@ -15780,7 +15944,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Agent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Agent();
-      var od = api.GoogleCloudDialogflowV2Agent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Agent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Agent(od as api.GoogleCloudDialogflowV2Agent);
     });
   });
@@ -15788,8 +15954,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2AnnotatedMessagePart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2AnnotatedMessagePart();
-      var od =
-          api.GoogleCloudDialogflowV2AnnotatedMessagePart.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2AnnotatedMessagePart.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2AnnotatedMessagePart(
           od as api.GoogleCloudDialogflowV2AnnotatedMessagePart);
     });
@@ -15799,8 +15966,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchCreateEntitiesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2BatchCreateEntitiesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchCreateEntitiesRequest(
           od as api.GoogleCloudDialogflowV2BatchCreateEntitiesRequest);
     });
@@ -15810,8 +15978,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchDeleteEntitiesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2BatchDeleteEntitiesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchDeleteEntitiesRequest(
           od as api.GoogleCloudDialogflowV2BatchDeleteEntitiesRequest);
     });
@@ -15821,9 +15990,10 @@
       'obj-schema-GoogleCloudDialogflowV2BatchDeleteEntityTypesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchDeleteEntityTypesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2BatchDeleteEntityTypesRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchDeleteEntityTypesRequest(
           od as api.GoogleCloudDialogflowV2BatchDeleteEntityTypesRequest);
     });
@@ -15833,8 +16003,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchDeleteIntentsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2BatchDeleteIntentsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchDeleteIntentsRequest(
           od as api.GoogleCloudDialogflowV2BatchDeleteIntentsRequest);
     });
@@ -15844,8 +16015,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchUpdateEntitiesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2BatchUpdateEntitiesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchUpdateEntitiesRequest(
           od as api.GoogleCloudDialogflowV2BatchUpdateEntitiesRequest);
     });
@@ -15855,9 +16027,10 @@
       'obj-schema-GoogleCloudDialogflowV2BatchUpdateEntityTypesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchUpdateEntityTypesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2BatchUpdateEntityTypesRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchUpdateEntityTypesRequest(
           od as api.GoogleCloudDialogflowV2BatchUpdateEntityTypesRequest);
     });
@@ -15867,9 +16040,10 @@
       'obj-schema-GoogleCloudDialogflowV2BatchUpdateEntityTypesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchUpdateEntityTypesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2BatchUpdateEntityTypesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchUpdateEntityTypesResponse(
           od as api.GoogleCloudDialogflowV2BatchUpdateEntityTypesResponse);
     });
@@ -15879,8 +16053,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchUpdateIntentsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2BatchUpdateIntentsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchUpdateIntentsRequest(
           od as api.GoogleCloudDialogflowV2BatchUpdateIntentsRequest);
     });
@@ -15890,8 +16065,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchUpdateIntentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2BatchUpdateIntentsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchUpdateIntentsResponse(
           od as api.GoogleCloudDialogflowV2BatchUpdateIntentsResponse);
     });
@@ -15900,7 +16076,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Context', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Context();
-      var od = api.GoogleCloudDialogflowV2Context.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Context.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Context(
           od as api.GoogleCloudDialogflowV2Context);
     });
@@ -15909,8 +16087,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2ConversationEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ConversationEvent();
-      var od =
-          api.GoogleCloudDialogflowV2ConversationEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2ConversationEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ConversationEvent(
           od as api.GoogleCloudDialogflowV2ConversationEvent);
     });
@@ -15919,8 +16098,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2DetectIntentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2DetectIntentRequest();
-      var od =
-          api.GoogleCloudDialogflowV2DetectIntentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2DetectIntentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2DetectIntentRequest(
           od as api.GoogleCloudDialogflowV2DetectIntentRequest);
     });
@@ -15929,8 +16109,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2DetectIntentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2DetectIntentResponse();
-      var od =
-          api.GoogleCloudDialogflowV2DetectIntentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2DetectIntentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2DetectIntentResponse(
           od as api.GoogleCloudDialogflowV2DetectIntentResponse);
     });
@@ -15939,7 +16120,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2EntityType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2EntityType();
-      var od = api.GoogleCloudDialogflowV2EntityType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2EntityType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2EntityType(
           od as api.GoogleCloudDialogflowV2EntityType);
     });
@@ -15948,7 +16131,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2EntityTypeBatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2EntityTypeBatch();
-      var od = api.GoogleCloudDialogflowV2EntityTypeBatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2EntityTypeBatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2EntityTypeBatch(
           od as api.GoogleCloudDialogflowV2EntityTypeBatch);
     });
@@ -15957,7 +16142,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2EntityTypeEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2EntityTypeEntity();
-      var od = api.GoogleCloudDialogflowV2EntityTypeEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2EntityTypeEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2EntityTypeEntity(
           od as api.GoogleCloudDialogflowV2EntityTypeEntity);
     });
@@ -15966,7 +16153,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Environment();
-      var od = api.GoogleCloudDialogflowV2Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Environment(
           od as api.GoogleCloudDialogflowV2Environment);
     });
@@ -15975,7 +16164,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2EventInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2EventInput();
-      var od = api.GoogleCloudDialogflowV2EventInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2EventInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2EventInput(
           od as api.GoogleCloudDialogflowV2EventInput);
     });
@@ -15984,8 +16175,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2ExportAgentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ExportAgentRequest();
-      var od =
-          api.GoogleCloudDialogflowV2ExportAgentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2ExportAgentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ExportAgentRequest(
           od as api.GoogleCloudDialogflowV2ExportAgentRequest);
     });
@@ -15994,8 +16186,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2ExportAgentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ExportAgentResponse();
-      var od =
-          api.GoogleCloudDialogflowV2ExportAgentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2ExportAgentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ExportAgentResponse(
           od as api.GoogleCloudDialogflowV2ExportAgentResponse);
     });
@@ -16004,7 +16197,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Fulfillment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Fulfillment();
-      var od = api.GoogleCloudDialogflowV2Fulfillment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Fulfillment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Fulfillment(
           od as api.GoogleCloudDialogflowV2Fulfillment);
     });
@@ -16013,8 +16208,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2FulfillmentFeature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2FulfillmentFeature();
-      var od =
-          api.GoogleCloudDialogflowV2FulfillmentFeature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2FulfillmentFeature.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2FulfillmentFeature(
           od as api.GoogleCloudDialogflowV2FulfillmentFeature);
     });
@@ -16024,8 +16220,9 @@
       'obj-schema-GoogleCloudDialogflowV2FulfillmentGenericWebService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2FulfillmentGenericWebService();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2FulfillmentGenericWebService.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2FulfillmentGenericWebService(
           od as api.GoogleCloudDialogflowV2FulfillmentGenericWebService);
     });
@@ -16034,8 +16231,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2ImportAgentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ImportAgentRequest();
-      var od =
-          api.GoogleCloudDialogflowV2ImportAgentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2ImportAgentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ImportAgentRequest(
           od as api.GoogleCloudDialogflowV2ImportAgentRequest);
     });
@@ -16044,7 +16242,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2InputAudioConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2InputAudioConfig();
-      var od = api.GoogleCloudDialogflowV2InputAudioConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2InputAudioConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2InputAudioConfig(
           od as api.GoogleCloudDialogflowV2InputAudioConfig);
     });
@@ -16053,7 +16253,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Intent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Intent();
-      var od = api.GoogleCloudDialogflowV2Intent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Intent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Intent(
           od as api.GoogleCloudDialogflowV2Intent);
     });
@@ -16062,7 +16264,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentBatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentBatch();
-      var od = api.GoogleCloudDialogflowV2IntentBatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentBatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentBatch(
           od as api.GoogleCloudDialogflowV2IntentBatch);
     });
@@ -16072,8 +16276,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentFollowupIntentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentFollowupIntentInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentFollowupIntentInfo(
           od as api.GoogleCloudDialogflowV2IntentFollowupIntentInfo);
     });
@@ -16082,7 +16287,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessage();
-      var od = api.GoogleCloudDialogflowV2IntentMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessage(
           od as api.GoogleCloudDialogflowV2IntentMessage);
     });
@@ -16092,8 +16299,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageBasicCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageBasicCard.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBasicCard(
           od as api.GoogleCloudDialogflowV2IntentMessageBasicCard);
     });
@@ -16103,8 +16311,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageBasicCardButton', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageBasicCardButton();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageBasicCardButton.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(
           od as api.GoogleCloudDialogflowV2IntentMessageBasicCardButton);
     });
@@ -16116,9 +16325,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction(od
           as api
               .GoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction);
@@ -16129,9 +16339,10 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageBrowseCarouselCard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageBrowseCarouselCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCard.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCard(
           od as api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCard);
     });
@@ -16143,9 +16354,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem(
           od as api
               .GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem);
@@ -16158,9 +16370,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction(
           od as api
               .GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction);
@@ -16170,8 +16383,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentMessageCard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageCard();
-      var od =
-          api.GoogleCloudDialogflowV2IntentMessageCard.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentMessageCard.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageCard(
           od as api.GoogleCloudDialogflowV2IntentMessageCard);
     });
@@ -16181,8 +16395,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageCardButton();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageCardButton.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageCardButton(
           od as api.GoogleCloudDialogflowV2IntentMessageCardButton);
     });
@@ -16192,8 +16407,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageCarouselSelect', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageCarouselSelect();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageCarouselSelect.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageCarouselSelect(
           od as api.GoogleCloudDialogflowV2IntentMessageCarouselSelect);
     });
@@ -16203,9 +16419,10 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageCarouselSelectItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageCarouselSelectItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageCarouselSelectItem.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageCarouselSelectItem(
           od as api.GoogleCloudDialogflowV2IntentMessageCarouselSelectItem);
     });
@@ -16215,9 +16432,10 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageColumnProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageColumnProperties();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageColumnProperties.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageColumnProperties(
           od as api.GoogleCloudDialogflowV2IntentMessageColumnProperties);
     });
@@ -16226,8 +16444,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentMessageImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageImage();
-      var od =
-          api.GoogleCloudDialogflowV2IntentMessageImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentMessageImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageImage(
           od as api.GoogleCloudDialogflowV2IntentMessageImage);
     });
@@ -16237,9 +16456,10 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageLinkOutSuggestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageLinkOutSuggestion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageLinkOutSuggestion.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageLinkOutSuggestion(
           od as api.GoogleCloudDialogflowV2IntentMessageLinkOutSuggestion);
     });
@@ -16249,8 +16469,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageListSelect();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageListSelect.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageListSelect(
           od as api.GoogleCloudDialogflowV2IntentMessageListSelect);
     });
@@ -16260,8 +16481,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageListSelectItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageListSelectItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageListSelectItem.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageListSelectItem(
           od as api.GoogleCloudDialogflowV2IntentMessageListSelectItem);
     });
@@ -16271,8 +16493,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageMediaContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageMediaContent.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageMediaContent(
           od as api.GoogleCloudDialogflowV2IntentMessageMediaContent);
     });
@@ -16284,9 +16507,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject(
           od as api
               .GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject);
@@ -16297,8 +16521,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageQuickReplies();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageQuickReplies.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageQuickReplies(
           od as api.GoogleCloudDialogflowV2IntentMessageQuickReplies);
     });
@@ -16308,8 +16533,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageSelectItemInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageSelectItemInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageSelectItemInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageSelectItemInfo(
           od as api.GoogleCloudDialogflowV2IntentMessageSelectItemInfo);
     });
@@ -16319,8 +16545,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageSimpleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageSimpleResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageSimpleResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageSimpleResponse(
           od as api.GoogleCloudDialogflowV2IntentMessageSimpleResponse);
     });
@@ -16330,8 +16557,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageSimpleResponses', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageSimpleResponses();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageSimpleResponses.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageSimpleResponses(
           od as api.GoogleCloudDialogflowV2IntentMessageSimpleResponses);
     });
@@ -16341,8 +16569,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageSuggestion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageSuggestion.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageSuggestion(
           od as api.GoogleCloudDialogflowV2IntentMessageSuggestion);
     });
@@ -16352,8 +16581,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageSuggestions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageSuggestions.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageSuggestions(
           od as api.GoogleCloudDialogflowV2IntentMessageSuggestions);
     });
@@ -16363,8 +16593,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageTableCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageTableCard.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageTableCard(
           od as api.GoogleCloudDialogflowV2IntentMessageTableCard);
     });
@@ -16374,8 +16605,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageTableCardCell();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageTableCardCell.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageTableCardCell(
           od as api.GoogleCloudDialogflowV2IntentMessageTableCardCell);
     });
@@ -16385,8 +16617,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageTableCardRow();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageTableCardRow.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageTableCardRow(
           od as api.GoogleCloudDialogflowV2IntentMessageTableCardRow);
     });
@@ -16395,8 +16628,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentMessageText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageText();
-      var od =
-          api.GoogleCloudDialogflowV2IntentMessageText.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentMessageText.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageText(
           od as api.GoogleCloudDialogflowV2IntentMessageText);
     });
@@ -16405,7 +16639,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentParameter();
-      var od = api.GoogleCloudDialogflowV2IntentParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentParameter(
           od as api.GoogleCloudDialogflowV2IntentParameter);
     });
@@ -16414,8 +16650,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentTrainingPhrase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentTrainingPhrase();
-      var od =
-          api.GoogleCloudDialogflowV2IntentTrainingPhrase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentTrainingPhrase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentTrainingPhrase(
           od as api.GoogleCloudDialogflowV2IntentTrainingPhrase);
     });
@@ -16425,8 +16662,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentTrainingPhrasePart();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentTrainingPhrasePart.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentTrainingPhrasePart(
           od as api.GoogleCloudDialogflowV2IntentTrainingPhrasePart);
     });
@@ -16435,8 +16673,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2ListContextsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ListContextsResponse();
-      var od =
-          api.GoogleCloudDialogflowV2ListContextsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2ListContextsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ListContextsResponse(
           od as api.GoogleCloudDialogflowV2ListContextsResponse);
     });
@@ -16446,8 +16685,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ListEntityTypesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2ListEntityTypesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ListEntityTypesResponse(
           od as api.GoogleCloudDialogflowV2ListEntityTypesResponse);
     });
@@ -16457,8 +16697,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ListEnvironmentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2ListEnvironmentsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ListEnvironmentsResponse(
           od as api.GoogleCloudDialogflowV2ListEnvironmentsResponse);
     });
@@ -16467,8 +16708,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2ListIntentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ListIntentsResponse();
-      var od =
-          api.GoogleCloudDialogflowV2ListIntentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2ListIntentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ListIntentsResponse(
           od as api.GoogleCloudDialogflowV2ListIntentsResponse);
     });
@@ -16478,9 +16720,10 @@
       'obj-schema-GoogleCloudDialogflowV2ListSessionEntityTypesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ListSessionEntityTypesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2ListSessionEntityTypesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ListSessionEntityTypesResponse(
           od as api.GoogleCloudDialogflowV2ListSessionEntityTypesResponse);
     });
@@ -16489,7 +16732,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Message', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Message();
-      var od = api.GoogleCloudDialogflowV2Message.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Message.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Message(
           od as api.GoogleCloudDialogflowV2Message);
     });
@@ -16498,8 +16743,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2MessageAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2MessageAnnotation();
-      var od =
-          api.GoogleCloudDialogflowV2MessageAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2MessageAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2MessageAnnotation(
           od as api.GoogleCloudDialogflowV2MessageAnnotation);
     });
@@ -16509,8 +16755,9 @@
       'obj-schema-GoogleCloudDialogflowV2OriginalDetectIntentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2OriginalDetectIntentRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2OriginalDetectIntentRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2OriginalDetectIntentRequest(
           od as api.GoogleCloudDialogflowV2OriginalDetectIntentRequest);
     });
@@ -16519,8 +16766,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2OutputAudioConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2OutputAudioConfig();
-      var od =
-          api.GoogleCloudDialogflowV2OutputAudioConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2OutputAudioConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2OutputAudioConfig(
           od as api.GoogleCloudDialogflowV2OutputAudioConfig);
     });
@@ -16529,7 +16777,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2QueryInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2QueryInput();
-      var od = api.GoogleCloudDialogflowV2QueryInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2QueryInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2QueryInput(
           od as api.GoogleCloudDialogflowV2QueryInput);
     });
@@ -16538,7 +16788,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2QueryParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2QueryParameters();
-      var od = api.GoogleCloudDialogflowV2QueryParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2QueryParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2QueryParameters(
           od as api.GoogleCloudDialogflowV2QueryParameters);
     });
@@ -16547,7 +16799,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2QueryResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2QueryResult();
-      var od = api.GoogleCloudDialogflowV2QueryResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2QueryResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2QueryResult(
           od as api.GoogleCloudDialogflowV2QueryResult);
     });
@@ -16556,8 +16810,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2RestoreAgentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2RestoreAgentRequest();
-      var od =
-          api.GoogleCloudDialogflowV2RestoreAgentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2RestoreAgentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2RestoreAgentRequest(
           od as api.GoogleCloudDialogflowV2RestoreAgentRequest);
     });
@@ -16566,8 +16821,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2SearchAgentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2SearchAgentsResponse();
-      var od =
-          api.GoogleCloudDialogflowV2SearchAgentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2SearchAgentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2SearchAgentsResponse(
           od as api.GoogleCloudDialogflowV2SearchAgentsResponse);
     });
@@ -16576,7 +16832,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Sentiment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Sentiment();
-      var od = api.GoogleCloudDialogflowV2Sentiment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Sentiment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Sentiment(
           od as api.GoogleCloudDialogflowV2Sentiment);
     });
@@ -16586,9 +16844,10 @@
       'obj-schema-GoogleCloudDialogflowV2SentimentAnalysisRequestConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2SentimentAnalysisRequestConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2SentimentAnalysisRequestConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2SentimentAnalysisRequestConfig(
           od as api.GoogleCloudDialogflowV2SentimentAnalysisRequestConfig);
     });
@@ -16598,8 +16857,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2SentimentAnalysisResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2SentimentAnalysisResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2SentimentAnalysisResult(
           od as api.GoogleCloudDialogflowV2SentimentAnalysisResult);
     });
@@ -16608,8 +16868,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2SessionEntityType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2SessionEntityType();
-      var od =
-          api.GoogleCloudDialogflowV2SessionEntityType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2SessionEntityType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2SessionEntityType(
           od as api.GoogleCloudDialogflowV2SessionEntityType);
     });
@@ -16618,7 +16879,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2SpeechContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2SpeechContext();
-      var od = api.GoogleCloudDialogflowV2SpeechContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2SpeechContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2SpeechContext(
           od as api.GoogleCloudDialogflowV2SpeechContext);
     });
@@ -16628,8 +16891,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2SynthesizeSpeechConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2SynthesizeSpeechConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2SynthesizeSpeechConfig(
           od as api.GoogleCloudDialogflowV2SynthesizeSpeechConfig);
     });
@@ -16638,7 +16902,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2TextInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2TextInput();
-      var od = api.GoogleCloudDialogflowV2TextInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2TextInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2TextInput(
           od as api.GoogleCloudDialogflowV2TextInput);
     });
@@ -16647,8 +16913,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2TrainAgentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2TrainAgentRequest();
-      var od =
-          api.GoogleCloudDialogflowV2TrainAgentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2TrainAgentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2TrainAgentRequest(
           od as api.GoogleCloudDialogflowV2TrainAgentRequest);
     });
@@ -16657,7 +16924,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2ValidationError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ValidationError();
-      var od = api.GoogleCloudDialogflowV2ValidationError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2ValidationError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ValidationError(
           od as api.GoogleCloudDialogflowV2ValidationError);
     });
@@ -16666,7 +16935,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2ValidationResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ValidationResult();
-      var od = api.GoogleCloudDialogflowV2ValidationResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2ValidationResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ValidationResult(
           od as api.GoogleCloudDialogflowV2ValidationResult);
     });
@@ -16675,8 +16946,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2VoiceSelectionParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2VoiceSelectionParams();
-      var od =
-          api.GoogleCloudDialogflowV2VoiceSelectionParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2VoiceSelectionParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2VoiceSelectionParams(
           od as api.GoogleCloudDialogflowV2VoiceSelectionParams);
     });
@@ -16685,7 +16957,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2WebhookRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2WebhookRequest();
-      var od = api.GoogleCloudDialogflowV2WebhookRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2WebhookRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2WebhookRequest(
           od as api.GoogleCloudDialogflowV2WebhookRequest);
     });
@@ -16694,7 +16968,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2WebhookResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2WebhookResponse();
-      var od = api.GoogleCloudDialogflowV2WebhookResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2WebhookResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2WebhookResponse(
           od as api.GoogleCloudDialogflowV2WebhookResponse);
     });
@@ -16705,8 +16981,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse(
           od as api.GoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse);
     });
@@ -16716,9 +16993,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse(
           od as api.GoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse);
     });
@@ -16727,7 +17005,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1Context', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1Context();
-      var od = api.GoogleCloudDialogflowV2beta1Context.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1Context.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1Context(
           od as api.GoogleCloudDialogflowV2beta1Context);
     });
@@ -16736,7 +17016,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1EntityType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1EntityType();
-      var od = api.GoogleCloudDialogflowV2beta1EntityType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1EntityType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1EntityType(
           od as api.GoogleCloudDialogflowV2beta1EntityType);
     });
@@ -16745,8 +17027,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1EntityTypeEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1EntityTypeEntity();
-      var od =
-          api.GoogleCloudDialogflowV2beta1EntityTypeEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1EntityTypeEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1EntityTypeEntity(
           od as api.GoogleCloudDialogflowV2beta1EntityTypeEntity);
     });
@@ -16755,7 +17038,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1EventInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1EventInput();
-      var od = api.GoogleCloudDialogflowV2beta1EventInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1EventInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1EventInput(
           od as api.GoogleCloudDialogflowV2beta1EventInput);
     });
@@ -16765,8 +17050,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1ExportAgentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1ExportAgentResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1ExportAgentResponse(
           od as api.GoogleCloudDialogflowV2beta1ExportAgentResponse);
     });
@@ -16775,7 +17061,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1Intent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1Intent();
-      var od = api.GoogleCloudDialogflowV2beta1Intent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1Intent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1Intent(
           od as api.GoogleCloudDialogflowV2beta1Intent);
     });
@@ -16785,9 +17073,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentFollowupIntentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentFollowupIntentInfo(
           od as api.GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo);
     });
@@ -16796,8 +17085,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1IntentMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessage();
-      var od =
-          api.GoogleCloudDialogflowV2beta1IntentMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1IntentMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessage(
           od as api.GoogleCloudDialogflowV2beta1IntentMessage);
     });
@@ -16807,8 +17097,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageBasicCard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageBasicCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageBasicCard.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBasicCard(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCard);
     });
@@ -16819,9 +17110,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton);
     });
@@ -16833,9 +17125,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction);
@@ -16848,8 +17141,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard(od
           as api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard);
     });
@@ -16861,9 +17155,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem);
@@ -16876,9 +17171,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction);
@@ -16889,8 +17185,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageCard.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageCard(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageCard);
     });
@@ -16900,8 +17197,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageCardButton', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageCardButton();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageCardButton.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageCardButton(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageCardButton);
     });
@@ -16911,9 +17209,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageCarouselSelect', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageCarouselSelect();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelect.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelect(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelect);
     });
@@ -16925,8 +17224,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem(od
           as api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem);
     });
@@ -16937,8 +17237,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageColumnProperties();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageColumnProperties
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageColumnProperties(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageColumnProperties);
     });
@@ -16948,8 +17249,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageImage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageImage(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
     });
@@ -16960,8 +17262,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion);
     });
@@ -16971,8 +17274,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageListSelect', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageListSelect();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageListSelect.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageListSelect(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageListSelect);
     });
@@ -16982,9 +17286,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageListSelectItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageListSelectItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageListSelectItem.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageListSelectItem(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageListSelectItem);
     });
@@ -16994,9 +17299,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageMediaContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageMediaContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageMediaContent.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageMediaContent(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageMediaContent);
     });
@@ -17008,9 +17314,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject);
@@ -17021,9 +17328,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageQuickReplies', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageQuickReplies();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageQuickReplies.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageQuickReplies(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageQuickReplies);
     });
@@ -17033,9 +17341,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent);
     });
@@ -17047,9 +17356,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia(od
           as api
               .GoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia);
@@ -17061,9 +17371,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard);
     });
@@ -17074,8 +17385,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard);
     });
@@ -17087,8 +17399,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction(od
           as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction);
     });
@@ -17100,9 +17413,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial);
@@ -17115,9 +17429,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri);
@@ -17130,9 +17445,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation);
@@ -17144,8 +17460,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply);
     });
@@ -17155,9 +17472,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion);
     });
@@ -17167,8 +17485,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmText();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmText.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmText(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmText);
     });
@@ -17178,9 +17497,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo);
     });
@@ -17190,9 +17510,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSimpleResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponse(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse);
     });
@@ -17203,9 +17524,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSimpleResponses();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponses.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponses(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponses);
     });
@@ -17215,8 +17537,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageSuggestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSuggestion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageSuggestion.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageSuggestion(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageSuggestion);
     });
@@ -17226,9 +17549,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageSuggestions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSuggestions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSuggestions.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageSuggestions(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageSuggestions);
     });
@@ -17238,8 +17562,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageTableCard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageTableCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageTableCard.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTableCard(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageTableCard);
     });
@@ -17249,9 +17574,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageTableCardCell', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageTableCardCell();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTableCardCell.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTableCardCell(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageTableCardCell);
     });
@@ -17261,9 +17587,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageTableCardRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageTableCardRow();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTableCardRow.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTableCardRow(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageTableCardRow);
     });
@@ -17275,8 +17602,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio(od
           as api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio);
     });
@@ -17288,9 +17616,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech(od
           as api
               .GoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech);
@@ -17303,9 +17632,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall(od
           as api
               .GoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall);
@@ -17316,8 +17646,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageText();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageText.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageText(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageText);
     });
@@ -17326,8 +17657,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1IntentParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentParameter();
-      var od =
-          api.GoogleCloudDialogflowV2beta1IntentParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1IntentParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentParameter(
           od as api.GoogleCloudDialogflowV2beta1IntentParameter);
     });
@@ -17337,8 +17669,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentTrainingPhrase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentTrainingPhrase.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentTrainingPhrase(
           od as api.GoogleCloudDialogflowV2beta1IntentTrainingPhrase);
     });
@@ -17348,9 +17681,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentTrainingPhrasePart();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentTrainingPhrasePart(
           od as api.GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart);
     });
@@ -17359,8 +17693,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1KnowledgeAnswers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1KnowledgeAnswers();
-      var od =
-          api.GoogleCloudDialogflowV2beta1KnowledgeAnswers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1KnowledgeAnswers.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1KnowledgeAnswers(
           od as api.GoogleCloudDialogflowV2beta1KnowledgeAnswers);
     });
@@ -17370,8 +17705,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer(
           od as api.GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer);
     });
@@ -17381,9 +17717,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1KnowledgeOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1KnowledgeOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1KnowledgeOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1KnowledgeOperationMetadata(
           od as api.GoogleCloudDialogflowV2beta1KnowledgeOperationMetadata);
     });
@@ -17393,9 +17730,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1OriginalDetectIntentRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1OriginalDetectIntentRequest(
           od as api.GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest);
     });
@@ -17404,7 +17742,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1QueryResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1QueryResult();
-      var od = api.GoogleCloudDialogflowV2beta1QueryResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1QueryResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1QueryResult(
           od as api.GoogleCloudDialogflowV2beta1QueryResult);
     });
@@ -17413,7 +17753,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1Sentiment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1Sentiment();
-      var od = api.GoogleCloudDialogflowV2beta1Sentiment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1Sentiment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1Sentiment(
           od as api.GoogleCloudDialogflowV2beta1Sentiment);
     });
@@ -17423,8 +17765,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1SentimentAnalysisResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1SentimentAnalysisResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1SentimentAnalysisResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1SentimentAnalysisResult(
           od as api.GoogleCloudDialogflowV2beta1SentimentAnalysisResult);
     });
@@ -17434,8 +17777,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1SessionEntityType();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1SessionEntityType.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1SessionEntityType(
           od as api.GoogleCloudDialogflowV2beta1SessionEntityType);
     });
@@ -17444,8 +17788,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1WebhookRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1WebhookRequest();
-      var od =
-          api.GoogleCloudDialogflowV2beta1WebhookRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1WebhookRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1WebhookRequest(
           od as api.GoogleCloudDialogflowV2beta1WebhookRequest);
     });
@@ -17454,8 +17799,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1WebhookResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1WebhookResponse();
-      var od =
-          api.GoogleCloudDialogflowV2beta1WebhookResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1WebhookResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1WebhookResponse(
           od as api.GoogleCloudDialogflowV2beta1WebhookResponse);
     });
@@ -17467,8 +17813,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1CreateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV3alpha1CreateDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1CreateDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowV3alpha1CreateDocumentOperationMetadata);
     });
@@ -17480,8 +17827,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1DeleteDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV3alpha1DeleteDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1DeleteDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowV3alpha1DeleteDocumentOperationMetadata);
     });
@@ -17493,9 +17841,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1GenericKnowledgeOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV3alpha1GenericKnowledgeOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1GenericKnowledgeOperationMetadata(od
           as api
               .GoogleCloudDialogflowV3alpha1GenericKnowledgeOperationMetadata);
@@ -17508,8 +17857,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1ImportDocumentsOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV3alpha1ImportDocumentsOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1ImportDocumentsOperationMetadata(od
           as api.GoogleCloudDialogflowV3alpha1ImportDocumentsOperationMetadata);
     });
@@ -17519,9 +17869,10 @@
       'obj-schema-GoogleCloudDialogflowV3alpha1ImportDocumentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV3alpha1ImportDocumentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV3alpha1ImportDocumentsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1ImportDocumentsResponse(
           od as api.GoogleCloudDialogflowV3alpha1ImportDocumentsResponse);
     });
@@ -17533,8 +17884,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1ReloadDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV3alpha1ReloadDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1ReloadDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowV3alpha1ReloadDocumentOperationMetadata);
     });
@@ -17546,8 +17898,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1UpdateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV3alpha1UpdateDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1UpdateDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowV3alpha1UpdateDocumentOperationMetadata);
     });
@@ -17556,7 +17909,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -17565,7 +17920,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -17573,7 +17930,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -17581,7 +17940,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
@@ -17589,7 +17950,9 @@
   unittest.group('obj-schema-GoogleTypeLatLng', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeLatLng();
-      var od = api.GoogleTypeLatLng.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeLatLng.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeLatLng(od as api.GoogleTypeLatLng);
     });
   });
diff --git a/generated/googleapis/test/dialogflow/v3_test.dart b/generated/googleapis/test/dialogflow/v3_test.dart
index 642ee0c..3d93c28 100644
--- a/generated/googleapis/test/dialogflow/v3_test.dart
+++ b/generated/googleapis/test/dialogflow/v3_test.dart
@@ -16146,7 +16146,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Agent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Agent();
-      var od = api.GoogleCloudDialogflowCxV3Agent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Agent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Agent(
           od as api.GoogleCloudDialogflowCxV3Agent);
     });
@@ -16156,8 +16158,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3AgentValidationResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3AgentValidationResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3AgentValidationResult(
           od as api.GoogleCloudDialogflowCxV3AgentValidationResult);
     });
@@ -16166,7 +16169,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3AudioInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3AudioInput();
-      var od = api.GoogleCloudDialogflowCxV3AudioInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3AudioInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3AudioInput(
           od as api.GoogleCloudDialogflowCxV3AudioInput);
     });
@@ -16176,9 +16181,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3BatchDeleteTestCasesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3BatchDeleteTestCasesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3BatchDeleteTestCasesRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3BatchDeleteTestCasesRequest(
           od as api.GoogleCloudDialogflowCxV3BatchDeleteTestCasesRequest);
     });
@@ -16188,8 +16194,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3BatchRunTestCasesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3BatchRunTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3BatchRunTestCasesMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3BatchRunTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3BatchRunTestCasesMetadata);
     });
@@ -16199,8 +16206,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3BatchRunTestCasesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3BatchRunTestCasesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3BatchRunTestCasesRequest(
           od as api.GoogleCloudDialogflowCxV3BatchRunTestCasesRequest);
     });
@@ -16210,8 +16218,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3BatchRunTestCasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3BatchRunTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3BatchRunTestCasesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3BatchRunTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3BatchRunTestCasesResponse);
     });
@@ -16221,8 +16230,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3CalculateCoverageResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3CalculateCoverageResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3CalculateCoverageResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3CalculateCoverageResponse(
           od as api.GoogleCloudDialogflowCxV3CalculateCoverageResponse);
     });
@@ -16231,8 +16241,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ConversationTurn', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ConversationTurn();
-      var od =
-          api.GoogleCloudDialogflowCxV3ConversationTurn.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ConversationTurn.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ConversationTurn(
           od as api.GoogleCloudDialogflowCxV3ConversationTurn);
     });
@@ -16242,8 +16253,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3ConversationTurnUserInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ConversationTurnUserInput();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ConversationTurnUserInput.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ConversationTurnUserInput(
           od as api.GoogleCloudDialogflowCxV3ConversationTurnUserInput);
     });
@@ -16255,8 +16267,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3ConversationTurnVirtualAgentOutput();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ConversationTurnVirtualAgentOutput
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ConversationTurnVirtualAgentOutput(od
           as api.GoogleCloudDialogflowCxV3ConversationTurnVirtualAgentOutput);
     });
@@ -16267,9 +16280,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3CreateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3CreateDocumentOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3CreateDocumentOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3CreateDocumentOperationMetadata);
     });
@@ -16279,9 +16293,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3CreateVersionOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3CreateVersionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3CreateVersionOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3CreateVersionOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3CreateVersionOperationMetadata);
     });
@@ -16292,9 +16307,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3DeleteDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3DeleteDocumentOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3DeleteDocumentOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3DeleteDocumentOperationMetadata);
     });
@@ -16303,8 +16319,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3DetectIntentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3DetectIntentRequest();
-      var od =
-          api.GoogleCloudDialogflowCxV3DetectIntentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3DetectIntentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3DetectIntentRequest(
           od as api.GoogleCloudDialogflowCxV3DetectIntentRequest);
     });
@@ -16314,8 +16331,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3DetectIntentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3DetectIntentResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3DetectIntentResponse(
           od as api.GoogleCloudDialogflowCxV3DetectIntentResponse);
     });
@@ -16324,7 +16342,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3DtmfInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3DtmfInput();
-      var od = api.GoogleCloudDialogflowCxV3DtmfInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3DtmfInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3DtmfInput(
           od as api.GoogleCloudDialogflowCxV3DtmfInput);
     });
@@ -16333,7 +16353,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3EntityType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3EntityType();
-      var od = api.GoogleCloudDialogflowCxV3EntityType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3EntityType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3EntityType(
           od as api.GoogleCloudDialogflowCxV3EntityType);
     });
@@ -16342,8 +16364,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3EntityTypeEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3EntityTypeEntity();
-      var od =
-          api.GoogleCloudDialogflowCxV3EntityTypeEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3EntityTypeEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3EntityTypeEntity(
           od as api.GoogleCloudDialogflowCxV3EntityTypeEntity);
     });
@@ -16353,8 +16376,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3EntityTypeExcludedPhrase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3EntityTypeExcludedPhrase.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3EntityTypeExcludedPhrase(
           od as api.GoogleCloudDialogflowCxV3EntityTypeExcludedPhrase);
     });
@@ -16363,7 +16387,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Environment();
-      var od = api.GoogleCloudDialogflowCxV3Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Environment(
           od as api.GoogleCloudDialogflowCxV3Environment);
     });
@@ -16373,8 +16399,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3EnvironmentVersionConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3EnvironmentVersionConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3EnvironmentVersionConfig(
           od as api.GoogleCloudDialogflowCxV3EnvironmentVersionConfig);
     });
@@ -16383,7 +16410,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3EventHandler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3EventHandler();
-      var od = api.GoogleCloudDialogflowCxV3EventHandler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3EventHandler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3EventHandler(
           od as api.GoogleCloudDialogflowCxV3EventHandler);
     });
@@ -16392,7 +16421,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3EventInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3EventInput();
-      var od = api.GoogleCloudDialogflowCxV3EventInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3EventInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3EventInput(
           od as api.GoogleCloudDialogflowCxV3EventInput);
     });
@@ -16401,7 +16432,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Experiment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Experiment();
-      var od = api.GoogleCloudDialogflowCxV3Experiment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Experiment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Experiment(
           od as api.GoogleCloudDialogflowCxV3Experiment);
     });
@@ -16411,8 +16444,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExperimentDefinition();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ExperimentDefinition.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExperimentDefinition(
           od as api.GoogleCloudDialogflowCxV3ExperimentDefinition);
     });
@@ -16421,8 +16455,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ExperimentResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExperimentResult();
-      var od =
-          api.GoogleCloudDialogflowCxV3ExperimentResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ExperimentResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExperimentResult(
           od as api.GoogleCloudDialogflowCxV3ExperimentResult);
     });
@@ -16434,8 +16469,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3ExperimentResultConfidenceInterval();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ExperimentResultConfidenceInterval
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExperimentResultConfidenceInterval(od
           as api.GoogleCloudDialogflowCxV3ExperimentResultConfidenceInterval);
     });
@@ -16445,8 +16481,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExperimentResultMetric();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ExperimentResultMetric.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExperimentResultMetric(
           od as api.GoogleCloudDialogflowCxV3ExperimentResultMetric);
     });
@@ -16456,9 +16493,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3ExperimentResultVersionMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExperimentResultVersionMetrics();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ExperimentResultVersionMetrics.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExperimentResultVersionMetrics(
           od as api.GoogleCloudDialogflowCxV3ExperimentResultVersionMetrics);
     });
@@ -16467,8 +16505,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ExportAgentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExportAgentRequest();
-      var od =
-          api.GoogleCloudDialogflowCxV3ExportAgentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ExportAgentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExportAgentRequest(
           od as api.GoogleCloudDialogflowCxV3ExportAgentRequest);
     });
@@ -16477,8 +16516,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ExportAgentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExportAgentResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3ExportAgentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ExportAgentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExportAgentResponse(
           od as api.GoogleCloudDialogflowCxV3ExportAgentResponse);
     });
@@ -16488,8 +16528,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExportTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ExportTestCasesMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExportTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3ExportTestCasesMetadata);
     });
@@ -16499,8 +16540,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExportTestCasesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ExportTestCasesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExportTestCasesRequest(
           od as api.GoogleCloudDialogflowCxV3ExportTestCasesRequest);
     });
@@ -16510,8 +16552,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ExportTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ExportTestCasesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ExportTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3ExportTestCasesResponse);
     });
@@ -16520,7 +16563,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Flow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Flow();
-      var od = api.GoogleCloudDialogflowCxV3Flow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Flow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Flow(
           od as api.GoogleCloudDialogflowCxV3Flow);
     });
@@ -16530,8 +16575,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FlowValidationResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3FlowValidationResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FlowValidationResult(
           od as api.GoogleCloudDialogflowCxV3FlowValidationResult);
     });
@@ -16540,7 +16586,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Form', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Form();
-      var od = api.GoogleCloudDialogflowCxV3Form.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Form.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Form(
           od as api.GoogleCloudDialogflowCxV3Form);
     });
@@ -16549,7 +16597,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3FormParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FormParameter();
-      var od = api.GoogleCloudDialogflowCxV3FormParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3FormParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FormParameter(
           od as api.GoogleCloudDialogflowCxV3FormParameter);
     });
@@ -16559,8 +16609,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3FormParameterFillBehavior', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FormParameterFillBehavior();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3FormParameterFillBehavior.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FormParameterFillBehavior(
           od as api.GoogleCloudDialogflowCxV3FormParameterFillBehavior);
     });
@@ -16570,8 +16621,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FulfillIntentRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3FulfillIntentRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FulfillIntentRequest(
           od as api.GoogleCloudDialogflowCxV3FulfillIntentRequest);
     });
@@ -16581,8 +16633,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FulfillIntentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3FulfillIntentResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FulfillIntentResponse(
           od as api.GoogleCloudDialogflowCxV3FulfillIntentResponse);
     });
@@ -16591,7 +16644,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Fulfillment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Fulfillment();
-      var od = api.GoogleCloudDialogflowCxV3Fulfillment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Fulfillment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Fulfillment(
           od as api.GoogleCloudDialogflowCxV3Fulfillment);
     });
@@ -16601,9 +16656,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3FulfillmentConditionalCases', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FulfillmentConditionalCases();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3FulfillmentConditionalCases.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FulfillmentConditionalCases(
           od as api.GoogleCloudDialogflowCxV3FulfillmentConditionalCases);
     });
@@ -16614,9 +16670,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FulfillmentConditionalCasesCase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3FulfillmentConditionalCasesCase.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FulfillmentConditionalCasesCase(
           od as api.GoogleCloudDialogflowCxV3FulfillmentConditionalCasesCase);
     });
@@ -16628,9 +16685,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3FulfillmentConditionalCasesCaseCaseContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3FulfillmentConditionalCasesCaseCaseContent
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FulfillmentConditionalCasesCaseCaseContent(
           od as api
               .GoogleCloudDialogflowCxV3FulfillmentConditionalCasesCaseCaseContent);
@@ -16641,9 +16699,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3FulfillmentSetParameterAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3FulfillmentSetParameterAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3FulfillmentSetParameterAction.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3FulfillmentSetParameterAction(
           od as api.GoogleCloudDialogflowCxV3FulfillmentSetParameterAction);
     });
@@ -16654,8 +16713,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3GenericKnowledgeOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3GenericKnowledgeOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3GenericKnowledgeOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3GenericKnowledgeOperationMetadata);
     });
@@ -16666,8 +16726,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ImportDocumentsOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ImportDocumentsOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ImportDocumentsOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3ImportDocumentsOperationMetadata);
     });
@@ -16677,8 +16738,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ImportDocumentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ImportDocumentsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ImportDocumentsResponse(
           od as api.GoogleCloudDialogflowCxV3ImportDocumentsResponse);
     });
@@ -16688,8 +16750,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ImportTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ImportTestCasesMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ImportTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3ImportTestCasesMetadata);
     });
@@ -16699,8 +16762,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ImportTestCasesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ImportTestCasesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ImportTestCasesRequest(
           od as api.GoogleCloudDialogflowCxV3ImportTestCasesRequest);
     });
@@ -16710,8 +16774,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ImportTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ImportTestCasesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ImportTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3ImportTestCasesResponse);
     });
@@ -16720,8 +16785,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3InputAudioConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3InputAudioConfig();
-      var od =
-          api.GoogleCloudDialogflowCxV3InputAudioConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3InputAudioConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3InputAudioConfig(
           od as api.GoogleCloudDialogflowCxV3InputAudioConfig);
     });
@@ -16730,7 +16796,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Intent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Intent();
-      var od = api.GoogleCloudDialogflowCxV3Intent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Intent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Intent(
           od as api.GoogleCloudDialogflowCxV3Intent);
     });
@@ -16739,7 +16807,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3IntentCoverage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3IntentCoverage();
-      var od = api.GoogleCloudDialogflowCxV3IntentCoverage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3IntentCoverage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3IntentCoverage(
           od as api.GoogleCloudDialogflowCxV3IntentCoverage);
     });
@@ -16749,8 +16819,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3IntentCoverageIntent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3IntentCoverageIntent.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3IntentCoverageIntent(
           od as api.GoogleCloudDialogflowCxV3IntentCoverageIntent);
     });
@@ -16759,7 +16830,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3IntentInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3IntentInput();
-      var od = api.GoogleCloudDialogflowCxV3IntentInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3IntentInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3IntentInput(
           od as api.GoogleCloudDialogflowCxV3IntentInput);
     });
@@ -16768,8 +16841,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3IntentParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3IntentParameter();
-      var od =
-          api.GoogleCloudDialogflowCxV3IntentParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3IntentParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3IntentParameter(
           od as api.GoogleCloudDialogflowCxV3IntentParameter);
     });
@@ -16779,8 +16853,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3IntentTrainingPhrase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3IntentTrainingPhrase.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3IntentTrainingPhrase(
           od as api.GoogleCloudDialogflowCxV3IntentTrainingPhrase);
     });
@@ -16790,8 +16865,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3IntentTrainingPhrasePart();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3IntentTrainingPhrasePart.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3IntentTrainingPhrasePart(
           od as api.GoogleCloudDialogflowCxV3IntentTrainingPhrasePart);
     });
@@ -16800,8 +16876,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ListAgentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListAgentsResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3ListAgentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ListAgentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListAgentsResponse(
           od as api.GoogleCloudDialogflowCxV3ListAgentsResponse);
     });
@@ -16811,8 +16888,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListEntityTypesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ListEntityTypesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListEntityTypesResponse(
           od as api.GoogleCloudDialogflowCxV3ListEntityTypesResponse);
     });
@@ -16822,8 +16900,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListEnvironmentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ListEnvironmentsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListEnvironmentsResponse(
           od as api.GoogleCloudDialogflowCxV3ListEnvironmentsResponse);
     });
@@ -16833,8 +16912,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListExperimentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ListExperimentsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListExperimentsResponse(
           od as api.GoogleCloudDialogflowCxV3ListExperimentsResponse);
     });
@@ -16843,8 +16923,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ListFlowsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListFlowsResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3ListFlowsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ListFlowsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListFlowsResponse(
           od as api.GoogleCloudDialogflowCxV3ListFlowsResponse);
     });
@@ -16853,8 +16934,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ListIntentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListIntentsResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3ListIntentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ListIntentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListIntentsResponse(
           od as api.GoogleCloudDialogflowCxV3ListIntentsResponse);
     });
@@ -16863,8 +16945,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ListPagesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListPagesResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3ListPagesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ListPagesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListPagesResponse(
           od as api.GoogleCloudDialogflowCxV3ListPagesResponse);
     });
@@ -16874,9 +16957,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3ListSecuritySettingsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListSecuritySettingsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ListSecuritySettingsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListSecuritySettingsResponse(
           od as api.GoogleCloudDialogflowCxV3ListSecuritySettingsResponse);
     });
@@ -16886,9 +16970,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3ListSessionEntityTypesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListSessionEntityTypesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ListSessionEntityTypesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListSessionEntityTypesResponse(
           od as api.GoogleCloudDialogflowCxV3ListSessionEntityTypesResponse);
     });
@@ -16898,9 +16983,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3ListTestCaseResultsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListTestCaseResultsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ListTestCaseResultsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListTestCaseResultsResponse(
           od as api.GoogleCloudDialogflowCxV3ListTestCaseResultsResponse);
     });
@@ -16910,8 +16996,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ListTestCasesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3ListTestCasesResponse);
     });
@@ -16922,8 +17009,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListTransitionRouteGroupsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ListTransitionRouteGroupsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListTransitionRouteGroupsResponse(
           od as api.GoogleCloudDialogflowCxV3ListTransitionRouteGroupsResponse);
     });
@@ -16933,8 +17021,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListVersionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ListVersionsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListVersionsResponse(
           od as api.GoogleCloudDialogflowCxV3ListVersionsResponse);
     });
@@ -16944,8 +17033,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ListWebhooksResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ListWebhooksResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ListWebhooksResponse(
           od as api.GoogleCloudDialogflowCxV3ListWebhooksResponse);
     });
@@ -16954,8 +17044,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3LoadVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3LoadVersionRequest();
-      var od =
-          api.GoogleCloudDialogflowCxV3LoadVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3LoadVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3LoadVersionRequest(
           od as api.GoogleCloudDialogflowCxV3LoadVersionRequest);
     });
@@ -16966,8 +17057,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3LookupEnvironmentHistoryResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3LookupEnvironmentHistoryResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3LookupEnvironmentHistoryResponse(
           od as api.GoogleCloudDialogflowCxV3LookupEnvironmentHistoryResponse);
     });
@@ -16976,7 +17068,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Match', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Match();
-      var od = api.GoogleCloudDialogflowCxV3Match.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Match.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Match(
           od as api.GoogleCloudDialogflowCxV3Match);
     });
@@ -16985,8 +17079,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3MatchIntentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3MatchIntentRequest();
-      var od =
-          api.GoogleCloudDialogflowCxV3MatchIntentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3MatchIntentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3MatchIntentRequest(
           od as api.GoogleCloudDialogflowCxV3MatchIntentRequest);
     });
@@ -16995,8 +17090,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3MatchIntentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3MatchIntentResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3MatchIntentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3MatchIntentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3MatchIntentResponse(
           od as api.GoogleCloudDialogflowCxV3MatchIntentResponse);
     });
@@ -17005,7 +17101,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3NluSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3NluSettings();
-      var od = api.GoogleCloudDialogflowCxV3NluSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3NluSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3NluSettings(
           od as api.GoogleCloudDialogflowCxV3NluSettings);
     });
@@ -17014,8 +17112,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3OutputAudioConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3OutputAudioConfig();
-      var od =
-          api.GoogleCloudDialogflowCxV3OutputAudioConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3OutputAudioConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3OutputAudioConfig(
           od as api.GoogleCloudDialogflowCxV3OutputAudioConfig);
     });
@@ -17024,7 +17123,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Page();
-      var od = api.GoogleCloudDialogflowCxV3Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Page.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Page(
           od as api.GoogleCloudDialogflowCxV3Page);
     });
@@ -17033,7 +17134,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3PageInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3PageInfo();
-      var od = api.GoogleCloudDialogflowCxV3PageInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3PageInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3PageInfo(
           od as api.GoogleCloudDialogflowCxV3PageInfo);
     });
@@ -17042,8 +17145,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3PageInfoFormInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3PageInfoFormInfo();
-      var od =
-          api.GoogleCloudDialogflowCxV3PageInfoFormInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3PageInfoFormInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3PageInfoFormInfo(
           od as api.GoogleCloudDialogflowCxV3PageInfoFormInfo);
     });
@@ -17053,9 +17157,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3PageInfoFormInfoParameterInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3PageInfoFormInfoParameterInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3PageInfoFormInfoParameterInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3PageInfoFormInfoParameterInfo(
           od as api.GoogleCloudDialogflowCxV3PageInfoFormInfoParameterInfo);
     });
@@ -17064,7 +17169,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3QueryInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3QueryInput();
-      var od = api.GoogleCloudDialogflowCxV3QueryInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3QueryInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3QueryInput(
           od as api.GoogleCloudDialogflowCxV3QueryInput);
     });
@@ -17073,8 +17180,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3QueryParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3QueryParameters();
-      var od =
-          api.GoogleCloudDialogflowCxV3QueryParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3QueryParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3QueryParameters(
           od as api.GoogleCloudDialogflowCxV3QueryParameters);
     });
@@ -17083,7 +17191,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3QueryResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3QueryResult();
-      var od = api.GoogleCloudDialogflowCxV3QueryResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3QueryResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3QueryResult(
           od as api.GoogleCloudDialogflowCxV3QueryResult);
     });
@@ -17094,9 +17204,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ReloadDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ReloadDocumentOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ReloadDocumentOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3ReloadDocumentOperationMetadata);
     });
@@ -17105,7 +17216,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ResourceName', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResourceName();
-      var od = api.GoogleCloudDialogflowCxV3ResourceName.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ResourceName.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResourceName(
           od as api.GoogleCloudDialogflowCxV3ResourceName);
     });
@@ -17114,8 +17227,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ResponseMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessage();
-      var od =
-          api.GoogleCloudDialogflowCxV3ResponseMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ResponseMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessage(
           od as api.GoogleCloudDialogflowCxV3ResponseMessage);
     });
@@ -17127,8 +17241,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3ResponseMessageConversationSuccess();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ResponseMessageConversationSuccess
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageConversationSuccess(od
           as api.GoogleCloudDialogflowCxV3ResponseMessageConversationSuccess);
     });
@@ -17138,9 +17253,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3ResponseMessageEndInteraction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageEndInteraction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ResponseMessageEndInteraction.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageEndInteraction(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageEndInteraction);
     });
@@ -17151,9 +17267,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageLiveAgentHandoff();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ResponseMessageLiveAgentHandoff.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageLiveAgentHandoff(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageLiveAgentHandoff);
     });
@@ -17163,8 +17280,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3ResponseMessageMixedAudio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageMixedAudio();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ResponseMessageMixedAudio.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageMixedAudio(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageMixedAudio);
     });
@@ -17175,8 +17293,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageMixedAudioSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ResponseMessageMixedAudioSegment
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageMixedAudioSegment(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageMixedAudioSegment);
     });
@@ -17186,9 +17305,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3ResponseMessageOutputAudioText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageOutputAudioText();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3ResponseMessageOutputAudioText.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageOutputAudioText(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageOutputAudioText);
     });
@@ -17198,8 +17318,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessagePlayAudio();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ResponseMessagePlayAudio.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessagePlayAudio(
           od as api.GoogleCloudDialogflowCxV3ResponseMessagePlayAudio);
     });
@@ -17208,8 +17329,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ResponseMessageText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ResponseMessageText();
-      var od =
-          api.GoogleCloudDialogflowCxV3ResponseMessageText.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ResponseMessageText.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ResponseMessageText(
           od as api.GoogleCloudDialogflowCxV3ResponseMessageText);
     });
@@ -17218,8 +17340,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3RestoreAgentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3RestoreAgentRequest();
-      var od =
-          api.GoogleCloudDialogflowCxV3RestoreAgentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3RestoreAgentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3RestoreAgentRequest(
           od as api.GoogleCloudDialogflowCxV3RestoreAgentRequest);
     });
@@ -17228,8 +17351,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3RunTestCaseMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3RunTestCaseMetadata();
-      var od =
-          api.GoogleCloudDialogflowCxV3RunTestCaseMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3RunTestCaseMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3RunTestCaseMetadata(
           od as api.GoogleCloudDialogflowCxV3RunTestCaseMetadata);
     });
@@ -17238,8 +17362,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3RunTestCaseRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3RunTestCaseRequest();
-      var od =
-          api.GoogleCloudDialogflowCxV3RunTestCaseRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3RunTestCaseRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3RunTestCaseRequest(
           od as api.GoogleCloudDialogflowCxV3RunTestCaseRequest);
     });
@@ -17248,8 +17373,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3RunTestCaseResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3RunTestCaseResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3RunTestCaseResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3RunTestCaseResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3RunTestCaseResponse(
           od as api.GoogleCloudDialogflowCxV3RunTestCaseResponse);
     });
@@ -17258,8 +17384,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3SecuritySettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3SecuritySettings();
-      var od =
-          api.GoogleCloudDialogflowCxV3SecuritySettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3SecuritySettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3SecuritySettings(
           od as api.GoogleCloudDialogflowCxV3SecuritySettings);
     });
@@ -17269,8 +17396,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3SentimentAnalysisResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3SentimentAnalysisResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3SentimentAnalysisResult(
           od as api.GoogleCloudDialogflowCxV3SentimentAnalysisResult);
     });
@@ -17279,8 +17407,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3SessionEntityType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3SessionEntityType();
-      var od =
-          api.GoogleCloudDialogflowCxV3SessionEntityType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3SessionEntityType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3SessionEntityType(
           od as api.GoogleCloudDialogflowCxV3SessionEntityType);
     });
@@ -17289,7 +17418,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3SessionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3SessionInfo();
-      var od = api.GoogleCloudDialogflowCxV3SessionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3SessionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3SessionInfo(
           od as api.GoogleCloudDialogflowCxV3SessionInfo);
     });
@@ -17299,8 +17430,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3SpeechToTextSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3SpeechToTextSettings.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3SpeechToTextSettings(
           od as api.GoogleCloudDialogflowCxV3SpeechToTextSettings);
     });
@@ -17310,8 +17442,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3StartExperimentRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3StartExperimentRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3StartExperimentRequest(
           od as api.GoogleCloudDialogflowCxV3StartExperimentRequest);
     });
@@ -17321,8 +17454,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3StopExperimentRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3StopExperimentRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3StopExperimentRequest(
           od as api.GoogleCloudDialogflowCxV3StopExperimentRequest);
     });
@@ -17332,8 +17466,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3SynthesizeSpeechConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3SynthesizeSpeechConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3SynthesizeSpeechConfig(
           od as api.GoogleCloudDialogflowCxV3SynthesizeSpeechConfig);
     });
@@ -17342,7 +17477,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestCase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestCase();
-      var od = api.GoogleCloudDialogflowCxV3TestCase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestCase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestCase(
           od as api.GoogleCloudDialogflowCxV3TestCase);
     });
@@ -17351,7 +17488,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestCaseError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestCaseError();
-      var od = api.GoogleCloudDialogflowCxV3TestCaseError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestCaseError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestCaseError(
           od as api.GoogleCloudDialogflowCxV3TestCaseError);
     });
@@ -17360,7 +17499,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestCaseResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestCaseResult();
-      var od = api.GoogleCloudDialogflowCxV3TestCaseResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestCaseResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestCaseResult(
           od as api.GoogleCloudDialogflowCxV3TestCaseResult);
     });
@@ -17369,7 +17510,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestConfig();
-      var od = api.GoogleCloudDialogflowCxV3TestConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestConfig(
           od as api.GoogleCloudDialogflowCxV3TestConfig);
     });
@@ -17378,7 +17521,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestError();
-      var od = api.GoogleCloudDialogflowCxV3TestError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestError(
           od as api.GoogleCloudDialogflowCxV3TestError);
     });
@@ -17387,8 +17532,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TestRunDifference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TestRunDifference();
-      var od =
-          api.GoogleCloudDialogflowCxV3TestRunDifference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TestRunDifference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TestRunDifference(
           od as api.GoogleCloudDialogflowCxV3TestRunDifference);
     });
@@ -17397,7 +17543,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TextInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TextInput();
-      var od = api.GoogleCloudDialogflowCxV3TextInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TextInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TextInput(
           od as api.GoogleCloudDialogflowCxV3TextInput);
     });
@@ -17406,8 +17554,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TrainFlowRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TrainFlowRequest();
-      var od =
-          api.GoogleCloudDialogflowCxV3TrainFlowRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TrainFlowRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TrainFlowRequest(
           od as api.GoogleCloudDialogflowCxV3TrainFlowRequest);
     });
@@ -17416,8 +17565,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TransitionCoverage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TransitionCoverage();
-      var od =
-          api.GoogleCloudDialogflowCxV3TransitionCoverage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TransitionCoverage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TransitionCoverage(
           od as api.GoogleCloudDialogflowCxV3TransitionCoverage);
     });
@@ -17427,9 +17577,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3TransitionCoverageTransition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TransitionCoverageTransition();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3TransitionCoverageTransition.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TransitionCoverageTransition(
           od as api.GoogleCloudDialogflowCxV3TransitionCoverageTransition);
     });
@@ -17440,8 +17591,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TransitionCoverageTransitionNode();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3TransitionCoverageTransitionNode
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TransitionCoverageTransitionNode(
           od as api.GoogleCloudDialogflowCxV3TransitionCoverageTransitionNode);
     });
@@ -17450,8 +17602,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3TransitionRoute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TransitionRoute();
-      var od =
-          api.GoogleCloudDialogflowCxV3TransitionRoute.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3TransitionRoute.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TransitionRoute(
           od as api.GoogleCloudDialogflowCxV3TransitionRoute);
     });
@@ -17461,8 +17614,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TransitionRouteGroup();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3TransitionRouteGroup.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TransitionRouteGroup(
           od as api.GoogleCloudDialogflowCxV3TransitionRouteGroup);
     });
@@ -17472,9 +17626,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3TransitionRouteGroupCoverage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3TransitionRouteGroupCoverage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3TransitionRouteGroupCoverage.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TransitionRouteGroupCoverage(
           od as api.GoogleCloudDialogflowCxV3TransitionRouteGroupCoverage);
     });
@@ -17486,8 +17641,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3TransitionRouteGroupCoverageCoverage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3TransitionRouteGroupCoverageCoverage
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TransitionRouteGroupCoverageCoverage(od
           as api.GoogleCloudDialogflowCxV3TransitionRouteGroupCoverageCoverage);
     });
@@ -17499,9 +17655,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3TransitionRouteGroupCoverageCoverageTransition();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3TransitionRouteGroupCoverageCoverageTransition
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3TransitionRouteGroupCoverageCoverageTransition(
           od as api
               .GoogleCloudDialogflowCxV3TransitionRouteGroupCoverageCoverageTransition);
@@ -17513,9 +17670,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3UpdateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3UpdateDocumentOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3UpdateDocumentOperationMetadata(
           od as api.GoogleCloudDialogflowCxV3UpdateDocumentOperationMetadata);
     });
@@ -17525,8 +17683,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ValidateAgentRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3ValidateAgentRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ValidateAgentRequest(
           od as api.GoogleCloudDialogflowCxV3ValidateAgentRequest);
     });
@@ -17535,8 +17694,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ValidateFlowRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ValidateFlowRequest();
-      var od =
-          api.GoogleCloudDialogflowCxV3ValidateFlowRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ValidateFlowRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ValidateFlowRequest(
           od as api.GoogleCloudDialogflowCxV3ValidateFlowRequest);
     });
@@ -17545,8 +17705,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3ValidationMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3ValidationMessage();
-      var od =
-          api.GoogleCloudDialogflowCxV3ValidationMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3ValidationMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3ValidationMessage(
           od as api.GoogleCloudDialogflowCxV3ValidationMessage);
     });
@@ -17555,8 +17716,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3VariantsHistory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3VariantsHistory();
-      var od =
-          api.GoogleCloudDialogflowCxV3VariantsHistory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3VariantsHistory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3VariantsHistory(
           od as api.GoogleCloudDialogflowCxV3VariantsHistory);
     });
@@ -17565,7 +17727,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Version', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Version();
-      var od = api.GoogleCloudDialogflowCxV3Version.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Version.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Version(
           od as api.GoogleCloudDialogflowCxV3Version);
     });
@@ -17574,8 +17738,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3VersionVariants', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3VersionVariants();
-      var od =
-          api.GoogleCloudDialogflowCxV3VersionVariants.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3VersionVariants.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3VersionVariants(
           od as api.GoogleCloudDialogflowCxV3VersionVariants);
     });
@@ -17585,8 +17750,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3VersionVariantsVariant();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3VersionVariantsVariant.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3VersionVariantsVariant(
           od as api.GoogleCloudDialogflowCxV3VersionVariantsVariant);
     });
@@ -17596,8 +17762,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3VoiceSelectionParams();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3VoiceSelectionParams.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3VoiceSelectionParams(
           od as api.GoogleCloudDialogflowCxV3VoiceSelectionParams);
     });
@@ -17606,7 +17773,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3Webhook', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3Webhook();
-      var od = api.GoogleCloudDialogflowCxV3Webhook.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3Webhook.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3Webhook(
           od as api.GoogleCloudDialogflowCxV3Webhook);
     });
@@ -17616,8 +17785,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3WebhookGenericWebService();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3WebhookGenericWebService.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookGenericWebService(
           od as api.GoogleCloudDialogflowCxV3WebhookGenericWebService);
     });
@@ -17626,7 +17796,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3WebhookRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3WebhookRequest();
-      var od = api.GoogleCloudDialogflowCxV3WebhookRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3WebhookRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookRequest(
           od as api.GoogleCloudDialogflowCxV3WebhookRequest);
     });
@@ -17636,9 +17808,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3WebhookRequestFulfillmentInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3WebhookRequestFulfillmentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3WebhookRequestFulfillmentInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookRequestFulfillmentInfo(
           od as api.GoogleCloudDialogflowCxV3WebhookRequestFulfillmentInfo);
     });
@@ -17648,8 +17821,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3WebhookRequestIntentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3WebhookRequestIntentInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookRequestIntentInfo(
           od as api.GoogleCloudDialogflowCxV3WebhookRequestIntentInfo);
     });
@@ -17661,9 +17835,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue(
           od as api
               .GoogleCloudDialogflowCxV3WebhookRequestIntentInfoIntentParameterValue);
@@ -17676,9 +17851,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3WebhookRequestSentimentAnalysisResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3WebhookRequestSentimentAnalysisResult
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookRequestSentimentAnalysisResult(od
           as api
               .GoogleCloudDialogflowCxV3WebhookRequestSentimentAnalysisResult);
@@ -17688,8 +17864,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3WebhookResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3WebhookResponse();
-      var od =
-          api.GoogleCloudDialogflowCxV3WebhookResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3WebhookResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookResponse(
           od as api.GoogleCloudDialogflowCxV3WebhookResponse);
     });
@@ -17701,8 +17878,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3WebhookResponseFulfillmentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3WebhookResponseFulfillmentResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3WebhookResponseFulfillmentResponse(od
           as api.GoogleCloudDialogflowCxV3WebhookResponseFulfillmentResponse);
     });
@@ -17711,8 +17889,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1AudioInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1AudioInput();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1AudioInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1AudioInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1AudioInput(
           od as api.GoogleCloudDialogflowCxV3beta1AudioInput);
     });
@@ -17722,9 +17901,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1BatchRunTestCasesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1BatchRunTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1BatchRunTestCasesMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1BatchRunTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3beta1BatchRunTestCasesMetadata);
     });
@@ -17734,9 +17914,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1BatchRunTestCasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1BatchRunTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1BatchRunTestCasesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1BatchRunTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3beta1BatchRunTestCasesResponse);
     });
@@ -17746,8 +17927,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ConversationTurn();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ConversationTurn.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ConversationTurn(
           od as api.GoogleCloudDialogflowCxV3beta1ConversationTurn);
     });
@@ -17757,9 +17939,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ConversationTurnUserInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ConversationTurnUserInput();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ConversationTurnUserInput.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ConversationTurnUserInput(
           od as api.GoogleCloudDialogflowCxV3beta1ConversationTurnUserInput);
     });
@@ -17771,9 +17954,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ConversationTurnVirtualAgentOutput();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ConversationTurnVirtualAgentOutput
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ConversationTurnVirtualAgentOutput(od
           as api
               .GoogleCloudDialogflowCxV3beta1ConversationTurnVirtualAgentOutput);
@@ -17786,8 +17970,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1CreateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1CreateDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1CreateDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowCxV3beta1CreateDocumentOperationMetadata);
     });
@@ -17799,8 +17984,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata(od
           as api.GoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata);
     });
@@ -17812,8 +17998,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1DeleteDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1DeleteDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1DeleteDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowCxV3beta1DeleteDocumentOperationMetadata);
     });
@@ -17822,7 +18009,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1DtmfInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1DtmfInput();
-      var od = api.GoogleCloudDialogflowCxV3beta1DtmfInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1DtmfInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1DtmfInput(
           od as api.GoogleCloudDialogflowCxV3beta1DtmfInput);
     });
@@ -17831,8 +18020,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1EventHandler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1EventHandler();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1EventHandler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1EventHandler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1EventHandler(
           od as api.GoogleCloudDialogflowCxV3beta1EventHandler);
     });
@@ -17841,8 +18031,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1EventInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1EventInput();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1EventInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1EventInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1EventInput(
           od as api.GoogleCloudDialogflowCxV3beta1EventInput);
     });
@@ -17852,8 +18043,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ExportAgentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ExportAgentResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ExportAgentResponse(
           od as api.GoogleCloudDialogflowCxV3beta1ExportAgentResponse);
     });
@@ -17863,9 +18055,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ExportTestCasesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ExportTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ExportTestCasesMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ExportTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3beta1ExportTestCasesMetadata);
     });
@@ -17875,9 +18068,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ExportTestCasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ExportTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ExportTestCasesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ExportTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3beta1ExportTestCasesResponse);
     });
@@ -17886,7 +18080,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1Form', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1Form();
-      var od = api.GoogleCloudDialogflowCxV3beta1Form.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1Form.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1Form(
           od as api.GoogleCloudDialogflowCxV3beta1Form);
     });
@@ -17895,8 +18091,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1FormParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1FormParameter();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1FormParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1FormParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FormParameter(
           od as api.GoogleCloudDialogflowCxV3beta1FormParameter);
     });
@@ -17906,9 +18103,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1FormParameterFillBehavior', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1FormParameterFillBehavior();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1FormParameterFillBehavior.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FormParameterFillBehavior(
           od as api.GoogleCloudDialogflowCxV3beta1FormParameterFillBehavior);
     });
@@ -17917,8 +18115,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1Fulfillment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1Fulfillment();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1Fulfillment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1Fulfillment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1Fulfillment(
           od as api.GoogleCloudDialogflowCxV3beta1Fulfillment);
     });
@@ -17929,8 +18128,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCases();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCases
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCases(
           od as api.GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCases);
     });
@@ -17942,8 +18142,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCase
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCase(od
           as api.GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCase);
     });
@@ -17955,9 +18156,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCaseCaseContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCaseCaseContent
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCaseCaseContent(
           od as api
               .GoogleCloudDialogflowCxV3beta1FulfillmentConditionalCasesCaseCaseContent);
@@ -17970,8 +18172,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1FulfillmentSetParameterAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1FulfillmentSetParameterAction
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1FulfillmentSetParameterAction(od
           as api.GoogleCloudDialogflowCxV3beta1FulfillmentSetParameterAction);
     });
@@ -17983,9 +18186,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1GenericKnowledgeOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1GenericKnowledgeOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1GenericKnowledgeOperationMetadata(od
           as api
               .GoogleCloudDialogflowCxV3beta1GenericKnowledgeOperationMetadata);
@@ -17998,9 +18202,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ImportDocumentsOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ImportDocumentsOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ImportDocumentsOperationMetadata(od
           as api
               .GoogleCloudDialogflowCxV3beta1ImportDocumentsOperationMetadata);
@@ -18011,9 +18216,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ImportDocumentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ImportDocumentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ImportDocumentsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ImportDocumentsResponse(
           od as api.GoogleCloudDialogflowCxV3beta1ImportDocumentsResponse);
     });
@@ -18023,9 +18229,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ImportTestCasesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ImportTestCasesMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ImportTestCasesMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ImportTestCasesMetadata(
           od as api.GoogleCloudDialogflowCxV3beta1ImportTestCasesMetadata);
     });
@@ -18035,9 +18242,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ImportTestCasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ImportTestCasesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ImportTestCasesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ImportTestCasesResponse(
           od as api.GoogleCloudDialogflowCxV3beta1ImportTestCasesResponse);
     });
@@ -18047,8 +18255,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1InputAudioConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1InputAudioConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1InputAudioConfig(
           od as api.GoogleCloudDialogflowCxV3beta1InputAudioConfig);
     });
@@ -18057,7 +18266,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1Intent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1Intent();
-      var od = api.GoogleCloudDialogflowCxV3beta1Intent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1Intent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1Intent(
           od as api.GoogleCloudDialogflowCxV3beta1Intent);
     });
@@ -18066,8 +18277,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1IntentInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1IntentInput();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1IntentInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1IntentInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1IntentInput(
           od as api.GoogleCloudDialogflowCxV3beta1IntentInput);
     });
@@ -18077,8 +18289,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1IntentParameter();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1IntentParameter.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1IntentParameter(
           od as api.GoogleCloudDialogflowCxV3beta1IntentParameter);
     });
@@ -18088,8 +18301,9 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1IntentTrainingPhrase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1IntentTrainingPhrase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1IntentTrainingPhrase.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1IntentTrainingPhrase(
           od as api.GoogleCloudDialogflowCxV3beta1IntentTrainingPhrase);
     });
@@ -18099,9 +18313,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1IntentTrainingPhrasePart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1IntentTrainingPhrasePart();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1IntentTrainingPhrasePart.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1IntentTrainingPhrasePart(
           od as api.GoogleCloudDialogflowCxV3beta1IntentTrainingPhrasePart);
     });
@@ -18110,7 +18325,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1Page();
-      var od = api.GoogleCloudDialogflowCxV3beta1Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1Page.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1Page(
           od as api.GoogleCloudDialogflowCxV3beta1Page);
     });
@@ -18119,7 +18336,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1PageInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1PageInfo();
-      var od = api.GoogleCloudDialogflowCxV3beta1PageInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1PageInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1PageInfo(
           od as api.GoogleCloudDialogflowCxV3beta1PageInfo);
     });
@@ -18129,8 +18348,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1PageInfoFormInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfo(
           od as api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfo);
     });
@@ -18142,8 +18362,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo(od
           as api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo);
     });
@@ -18152,8 +18373,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1QueryInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1QueryInput();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1QueryInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1QueryInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1QueryInput(
           od as api.GoogleCloudDialogflowCxV3beta1QueryInput);
     });
@@ -18165,8 +18387,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ReloadDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ReloadDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ReloadDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowCxV3beta1ReloadDocumentOperationMetadata);
     });
@@ -18176,8 +18399,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ResponseMessage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessage(
           od as api.GoogleCloudDialogflowCxV3beta1ResponseMessage);
     });
@@ -18189,9 +18413,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess(od
           as api
               .GoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess);
@@ -18204,8 +18429,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction(od
           as api.GoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction);
     });
@@ -18217,8 +18443,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff(od
           as api.GoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff);
     });
@@ -18228,9 +18455,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio(
           od as api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio);
     });
@@ -18242,9 +18470,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment(od
           as api
               .GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment);
@@ -18257,8 +18486,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText(od
           as api.GoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText);
     });
@@ -18268,9 +18498,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio(
           od as api.GoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio);
     });
@@ -18280,8 +18511,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1ResponseMessageText();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageText.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1ResponseMessageText(
           od as api.GoogleCloudDialogflowCxV3beta1ResponseMessageText);
     });
@@ -18291,8 +18523,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1RunTestCaseMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1RunTestCaseMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1RunTestCaseMetadata(
           od as api.GoogleCloudDialogflowCxV3beta1RunTestCaseMetadata);
     });
@@ -18302,8 +18535,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1RunTestCaseResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1RunTestCaseResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1RunTestCaseResponse(
           od as api.GoogleCloudDialogflowCxV3beta1RunTestCaseResponse);
     });
@@ -18312,8 +18546,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1SessionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1SessionInfo();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1SessionInfo(
           od as api.GoogleCloudDialogflowCxV3beta1SessionInfo);
     });
@@ -18322,7 +18557,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TestCase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestCase();
-      var od = api.GoogleCloudDialogflowCxV3beta1TestCase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TestCase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestCase(
           od as api.GoogleCloudDialogflowCxV3beta1TestCase);
     });
@@ -18331,8 +18568,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TestCaseError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestCaseError();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1TestCaseError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TestCaseError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestCaseError(
           od as api.GoogleCloudDialogflowCxV3beta1TestCaseError);
     });
@@ -18341,8 +18579,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TestCaseResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestCaseResult();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1TestCaseResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TestCaseResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestCaseResult(
           od as api.GoogleCloudDialogflowCxV3beta1TestCaseResult);
     });
@@ -18351,8 +18590,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TestConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestConfig();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1TestConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TestConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestConfig(
           od as api.GoogleCloudDialogflowCxV3beta1TestConfig);
     });
@@ -18361,7 +18601,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TestError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestError();
-      var od = api.GoogleCloudDialogflowCxV3beta1TestError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TestError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestError(
           od as api.GoogleCloudDialogflowCxV3beta1TestError);
     });
@@ -18371,8 +18613,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TestRunDifference();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1TestRunDifference.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TestRunDifference(
           od as api.GoogleCloudDialogflowCxV3beta1TestRunDifference);
     });
@@ -18381,7 +18624,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1TextInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TextInput();
-      var od = api.GoogleCloudDialogflowCxV3beta1TextInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1TextInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TextInput(
           od as api.GoogleCloudDialogflowCxV3beta1TextInput);
     });
@@ -18391,8 +18636,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1TransitionRoute();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1TransitionRoute.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1TransitionRoute(
           od as api.GoogleCloudDialogflowCxV3beta1TransitionRoute);
     });
@@ -18404,8 +18650,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1UpdateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1UpdateDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1UpdateDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowCxV3beta1UpdateDocumentOperationMetadata);
     });
@@ -18414,8 +18661,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowCxV3beta1WebhookRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1WebhookRequest();
-      var od =
-          api.GoogleCloudDialogflowCxV3beta1WebhookRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowCxV3beta1WebhookRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookRequest(
           od as api.GoogleCloudDialogflowCxV3beta1WebhookRequest);
     });
@@ -18427,8 +18675,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo(od
           as api.GoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo);
     });
@@ -18438,9 +18687,10 @@
       'obj-schema-GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo(
           od as api.GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo);
     });
@@ -18452,9 +18702,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue(
           od as api
               .GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue);
@@ -18467,9 +18718,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1WebhookRequestSentimentAnalysisResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookRequestSentimentAnalysisResult
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookRequestSentimentAnalysisResult(
           od as api
               .GoogleCloudDialogflowCxV3beta1WebhookRequestSentimentAnalysisResult);
@@ -18480,8 +18732,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowCxV3beta1WebhookResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowCxV3beta1WebhookResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookResponse(
           od as api.GoogleCloudDialogflowCxV3beta1WebhookResponse);
     });
@@ -18493,9 +18746,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse(od
           as api
               .GoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse);
@@ -18505,8 +18759,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2AnnotatedMessagePart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2AnnotatedMessagePart();
-      var od =
-          api.GoogleCloudDialogflowV2AnnotatedMessagePart.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2AnnotatedMessagePart.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2AnnotatedMessagePart(
           od as api.GoogleCloudDialogflowV2AnnotatedMessagePart);
     });
@@ -18516,9 +18771,10 @@
       'obj-schema-GoogleCloudDialogflowV2BatchUpdateEntityTypesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchUpdateEntityTypesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2BatchUpdateEntityTypesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchUpdateEntityTypesResponse(
           od as api.GoogleCloudDialogflowV2BatchUpdateEntityTypesResponse);
     });
@@ -18528,8 +18784,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2BatchUpdateIntentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2BatchUpdateIntentsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2BatchUpdateIntentsResponse(
           od as api.GoogleCloudDialogflowV2BatchUpdateIntentsResponse);
     });
@@ -18538,7 +18795,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Context', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Context();
-      var od = api.GoogleCloudDialogflowV2Context.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Context.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Context(
           od as api.GoogleCloudDialogflowV2Context);
     });
@@ -18547,8 +18806,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2ConversationEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ConversationEvent();
-      var od =
-          api.GoogleCloudDialogflowV2ConversationEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2ConversationEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ConversationEvent(
           od as api.GoogleCloudDialogflowV2ConversationEvent);
     });
@@ -18557,7 +18817,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2EntityType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2EntityType();
-      var od = api.GoogleCloudDialogflowV2EntityType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2EntityType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2EntityType(
           od as api.GoogleCloudDialogflowV2EntityType);
     });
@@ -18566,7 +18828,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2EntityTypeEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2EntityTypeEntity();
-      var od = api.GoogleCloudDialogflowV2EntityTypeEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2EntityTypeEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2EntityTypeEntity(
           od as api.GoogleCloudDialogflowV2EntityTypeEntity);
     });
@@ -18575,7 +18839,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2EventInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2EventInput();
-      var od = api.GoogleCloudDialogflowV2EventInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2EventInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2EventInput(
           od as api.GoogleCloudDialogflowV2EventInput);
     });
@@ -18584,8 +18850,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2ExportAgentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2ExportAgentResponse();
-      var od =
-          api.GoogleCloudDialogflowV2ExportAgentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2ExportAgentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2ExportAgentResponse(
           od as api.GoogleCloudDialogflowV2ExportAgentResponse);
     });
@@ -18594,7 +18861,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Intent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Intent();
-      var od = api.GoogleCloudDialogflowV2Intent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Intent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Intent(
           od as api.GoogleCloudDialogflowV2Intent);
     });
@@ -18604,8 +18873,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentFollowupIntentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentFollowupIntentInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentFollowupIntentInfo(
           od as api.GoogleCloudDialogflowV2IntentFollowupIntentInfo);
     });
@@ -18614,7 +18884,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessage();
-      var od = api.GoogleCloudDialogflowV2IntentMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessage(
           od as api.GoogleCloudDialogflowV2IntentMessage);
     });
@@ -18624,8 +18896,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageBasicCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageBasicCard.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBasicCard(
           od as api.GoogleCloudDialogflowV2IntentMessageBasicCard);
     });
@@ -18635,8 +18908,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageBasicCardButton', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageBasicCardButton();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageBasicCardButton.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(
           od as api.GoogleCloudDialogflowV2IntentMessageBasicCardButton);
     });
@@ -18648,9 +18922,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction(od
           as api
               .GoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction);
@@ -18661,9 +18936,10 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageBrowseCarouselCard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageBrowseCarouselCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCard.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCard(
           od as api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCard);
     });
@@ -18675,9 +18951,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem(
           od as api
               .GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem);
@@ -18690,9 +18967,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction(
           od as api
               .GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction);
@@ -18702,8 +18980,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentMessageCard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageCard();
-      var od =
-          api.GoogleCloudDialogflowV2IntentMessageCard.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentMessageCard.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageCard(
           od as api.GoogleCloudDialogflowV2IntentMessageCard);
     });
@@ -18713,8 +18992,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageCardButton();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageCardButton.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageCardButton(
           od as api.GoogleCloudDialogflowV2IntentMessageCardButton);
     });
@@ -18724,8 +19004,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageCarouselSelect', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageCarouselSelect();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageCarouselSelect.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageCarouselSelect(
           od as api.GoogleCloudDialogflowV2IntentMessageCarouselSelect);
     });
@@ -18735,9 +19016,10 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageCarouselSelectItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageCarouselSelectItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageCarouselSelectItem.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageCarouselSelectItem(
           od as api.GoogleCloudDialogflowV2IntentMessageCarouselSelectItem);
     });
@@ -18747,9 +19029,10 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageColumnProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageColumnProperties();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageColumnProperties.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageColumnProperties(
           od as api.GoogleCloudDialogflowV2IntentMessageColumnProperties);
     });
@@ -18758,8 +19041,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentMessageImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageImage();
-      var od =
-          api.GoogleCloudDialogflowV2IntentMessageImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentMessageImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageImage(
           od as api.GoogleCloudDialogflowV2IntentMessageImage);
     });
@@ -18769,9 +19053,10 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageLinkOutSuggestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageLinkOutSuggestion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageLinkOutSuggestion.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageLinkOutSuggestion(
           od as api.GoogleCloudDialogflowV2IntentMessageLinkOutSuggestion);
     });
@@ -18781,8 +19066,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageListSelect();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageListSelect.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageListSelect(
           od as api.GoogleCloudDialogflowV2IntentMessageListSelect);
     });
@@ -18792,8 +19078,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageListSelectItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageListSelectItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageListSelectItem.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageListSelectItem(
           od as api.GoogleCloudDialogflowV2IntentMessageListSelectItem);
     });
@@ -18803,8 +19090,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageMediaContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageMediaContent.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageMediaContent(
           od as api.GoogleCloudDialogflowV2IntentMessageMediaContent);
     });
@@ -18816,9 +19104,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject(
           od as api
               .GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject);
@@ -18829,8 +19118,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageQuickReplies();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageQuickReplies.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageQuickReplies(
           od as api.GoogleCloudDialogflowV2IntentMessageQuickReplies);
     });
@@ -18840,8 +19130,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageSelectItemInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageSelectItemInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageSelectItemInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageSelectItemInfo(
           od as api.GoogleCloudDialogflowV2IntentMessageSelectItemInfo);
     });
@@ -18851,8 +19142,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageSimpleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageSimpleResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageSimpleResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageSimpleResponse(
           od as api.GoogleCloudDialogflowV2IntentMessageSimpleResponse);
     });
@@ -18862,8 +19154,9 @@
       'obj-schema-GoogleCloudDialogflowV2IntentMessageSimpleResponses', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageSimpleResponses();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageSimpleResponses.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageSimpleResponses(
           od as api.GoogleCloudDialogflowV2IntentMessageSimpleResponses);
     });
@@ -18873,8 +19166,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageSuggestion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageSuggestion.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageSuggestion(
           od as api.GoogleCloudDialogflowV2IntentMessageSuggestion);
     });
@@ -18884,8 +19178,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageSuggestions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageSuggestions.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageSuggestions(
           od as api.GoogleCloudDialogflowV2IntentMessageSuggestions);
     });
@@ -18895,8 +19190,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageTableCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageTableCard.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageTableCard(
           od as api.GoogleCloudDialogflowV2IntentMessageTableCard);
     });
@@ -18906,8 +19202,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageTableCardCell();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageTableCardCell.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageTableCardCell(
           od as api.GoogleCloudDialogflowV2IntentMessageTableCardCell);
     });
@@ -18917,8 +19214,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageTableCardRow();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentMessageTableCardRow.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageTableCardRow(
           od as api.GoogleCloudDialogflowV2IntentMessageTableCardRow);
     });
@@ -18927,8 +19225,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentMessageText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentMessageText();
-      var od =
-          api.GoogleCloudDialogflowV2IntentMessageText.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentMessageText.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentMessageText(
           od as api.GoogleCloudDialogflowV2IntentMessageText);
     });
@@ -18937,7 +19236,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentParameter();
-      var od = api.GoogleCloudDialogflowV2IntentParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentParameter(
           od as api.GoogleCloudDialogflowV2IntentParameter);
     });
@@ -18946,8 +19247,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2IntentTrainingPhrase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentTrainingPhrase();
-      var od =
-          api.GoogleCloudDialogflowV2IntentTrainingPhrase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2IntentTrainingPhrase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentTrainingPhrase(
           od as api.GoogleCloudDialogflowV2IntentTrainingPhrase);
     });
@@ -18957,8 +19259,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2IntentTrainingPhrasePart();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2IntentTrainingPhrasePart.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2IntentTrainingPhrasePart(
           od as api.GoogleCloudDialogflowV2IntentTrainingPhrasePart);
     });
@@ -18967,7 +19270,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Message', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Message();
-      var od = api.GoogleCloudDialogflowV2Message.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Message.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Message(
           od as api.GoogleCloudDialogflowV2Message);
     });
@@ -18976,8 +19281,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2MessageAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2MessageAnnotation();
-      var od =
-          api.GoogleCloudDialogflowV2MessageAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2MessageAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2MessageAnnotation(
           od as api.GoogleCloudDialogflowV2MessageAnnotation);
     });
@@ -18987,8 +19293,9 @@
       'obj-schema-GoogleCloudDialogflowV2OriginalDetectIntentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2OriginalDetectIntentRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2OriginalDetectIntentRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2OriginalDetectIntentRequest(
           od as api.GoogleCloudDialogflowV2OriginalDetectIntentRequest);
     });
@@ -18997,7 +19304,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2QueryResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2QueryResult();
-      var od = api.GoogleCloudDialogflowV2QueryResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2QueryResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2QueryResult(
           od as api.GoogleCloudDialogflowV2QueryResult);
     });
@@ -19006,7 +19315,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2Sentiment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2Sentiment();
-      var od = api.GoogleCloudDialogflowV2Sentiment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2Sentiment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2Sentiment(
           od as api.GoogleCloudDialogflowV2Sentiment);
     });
@@ -19016,8 +19327,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2SentimentAnalysisResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2SentimentAnalysisResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2SentimentAnalysisResult(
           od as api.GoogleCloudDialogflowV2SentimentAnalysisResult);
     });
@@ -19026,8 +19338,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2SessionEntityType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2SessionEntityType();
-      var od =
-          api.GoogleCloudDialogflowV2SessionEntityType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2SessionEntityType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2SessionEntityType(
           od as api.GoogleCloudDialogflowV2SessionEntityType);
     });
@@ -19036,7 +19349,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2WebhookRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2WebhookRequest();
-      var od = api.GoogleCloudDialogflowV2WebhookRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2WebhookRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2WebhookRequest(
           od as api.GoogleCloudDialogflowV2WebhookRequest);
     });
@@ -19045,7 +19360,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2WebhookResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2WebhookResponse();
-      var od = api.GoogleCloudDialogflowV2WebhookResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2WebhookResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2WebhookResponse(
           od as api.GoogleCloudDialogflowV2WebhookResponse);
     });
@@ -19056,8 +19373,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse(
           od as api.GoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse);
     });
@@ -19067,9 +19385,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse(
           od as api.GoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse);
     });
@@ -19078,7 +19397,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1Context', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1Context();
-      var od = api.GoogleCloudDialogflowV2beta1Context.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1Context.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1Context(
           od as api.GoogleCloudDialogflowV2beta1Context);
     });
@@ -19087,7 +19408,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1EntityType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1EntityType();
-      var od = api.GoogleCloudDialogflowV2beta1EntityType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1EntityType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1EntityType(
           od as api.GoogleCloudDialogflowV2beta1EntityType);
     });
@@ -19096,8 +19419,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1EntityTypeEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1EntityTypeEntity();
-      var od =
-          api.GoogleCloudDialogflowV2beta1EntityTypeEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1EntityTypeEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1EntityTypeEntity(
           od as api.GoogleCloudDialogflowV2beta1EntityTypeEntity);
     });
@@ -19106,7 +19430,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1EventInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1EventInput();
-      var od = api.GoogleCloudDialogflowV2beta1EventInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1EventInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1EventInput(
           od as api.GoogleCloudDialogflowV2beta1EventInput);
     });
@@ -19116,8 +19442,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1ExportAgentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1ExportAgentResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1ExportAgentResponse(
           od as api.GoogleCloudDialogflowV2beta1ExportAgentResponse);
     });
@@ -19126,7 +19453,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1Intent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1Intent();
-      var od = api.GoogleCloudDialogflowV2beta1Intent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1Intent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1Intent(
           od as api.GoogleCloudDialogflowV2beta1Intent);
     });
@@ -19136,9 +19465,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentFollowupIntentInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentFollowupIntentInfo(
           od as api.GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo);
     });
@@ -19147,8 +19477,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1IntentMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessage();
-      var od =
-          api.GoogleCloudDialogflowV2beta1IntentMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1IntentMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessage(
           od as api.GoogleCloudDialogflowV2beta1IntentMessage);
     });
@@ -19158,8 +19489,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageBasicCard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageBasicCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageBasicCard.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBasicCard(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCard);
     });
@@ -19170,9 +19502,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton);
     });
@@ -19184,9 +19517,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction);
@@ -19199,8 +19533,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard(od
           as api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard);
     });
@@ -19212,9 +19547,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem);
@@ -19227,9 +19563,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction);
@@ -19240,8 +19577,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageCard.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageCard(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageCard);
     });
@@ -19251,8 +19589,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageCardButton', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageCardButton();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageCardButton.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageCardButton(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageCardButton);
     });
@@ -19262,9 +19601,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageCarouselSelect', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageCarouselSelect();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelect.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelect(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelect);
     });
@@ -19276,8 +19616,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem(od
           as api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem);
     });
@@ -19288,8 +19629,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageColumnProperties();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageColumnProperties
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageColumnProperties(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageColumnProperties);
     });
@@ -19299,8 +19641,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageImage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageImage(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
     });
@@ -19311,8 +19654,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion);
     });
@@ -19322,8 +19666,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageListSelect', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageListSelect();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageListSelect.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageListSelect(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageListSelect);
     });
@@ -19333,9 +19678,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageListSelectItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageListSelectItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageListSelectItem.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageListSelectItem(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageListSelectItem);
     });
@@ -19345,9 +19691,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageMediaContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageMediaContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageMediaContent.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageMediaContent(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageMediaContent);
     });
@@ -19359,9 +19706,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject);
@@ -19372,9 +19720,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageQuickReplies', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageQuickReplies();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageQuickReplies.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageQuickReplies(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageQuickReplies);
     });
@@ -19384,9 +19733,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent);
     });
@@ -19398,9 +19748,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia(od
           as api
               .GoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia);
@@ -19412,9 +19763,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard);
     });
@@ -19425,8 +19777,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard);
     });
@@ -19438,8 +19791,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction(od
           as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction);
     });
@@ -19451,9 +19805,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial);
@@ -19466,9 +19821,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri);
@@ -19481,9 +19837,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation(
           od as api
               .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation);
@@ -19495,8 +19852,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply);
     });
@@ -19506,9 +19864,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion);
     });
@@ -19518,8 +19877,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmText();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmText.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmText(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmText);
     });
@@ -19529,9 +19889,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo);
     });
@@ -19541,9 +19902,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSimpleResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponse(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse);
     });
@@ -19554,9 +19916,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSimpleResponses();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponses.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponses(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponses);
     });
@@ -19566,8 +19929,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageSuggestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSuggestion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageSuggestion.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageSuggestion(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageSuggestion);
     });
@@ -19577,9 +19941,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageSuggestions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSuggestions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSuggestions.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageSuggestions(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageSuggestions);
     });
@@ -19589,8 +19954,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageTableCard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageTableCard();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageTableCard.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTableCard(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageTableCard);
     });
@@ -19600,9 +19966,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageTableCardCell', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageTableCardCell();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTableCardCell.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTableCardCell(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageTableCardCell);
     });
@@ -19612,9 +19979,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentMessageTableCardRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageTableCardRow();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTableCardRow.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTableCardRow(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageTableCardRow);
     });
@@ -19626,8 +19994,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio(od
           as api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio);
     });
@@ -19639,9 +20008,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech(od
           as api
               .GoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech);
@@ -19654,9 +20024,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall(od
           as api
               .GoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall);
@@ -19667,8 +20038,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageText();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageText.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentMessageText(
           od as api.GoogleCloudDialogflowV2beta1IntentMessageText);
     });
@@ -19677,8 +20049,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1IntentParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentParameter();
-      var od =
-          api.GoogleCloudDialogflowV2beta1IntentParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1IntentParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentParameter(
           od as api.GoogleCloudDialogflowV2beta1IntentParameter);
     });
@@ -19688,8 +20061,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentTrainingPhrase();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1IntentTrainingPhrase.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentTrainingPhrase(
           od as api.GoogleCloudDialogflowV2beta1IntentTrainingPhrase);
     });
@@ -19699,9 +20073,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1IntentTrainingPhrasePart();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1IntentTrainingPhrasePart(
           od as api.GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart);
     });
@@ -19710,8 +20085,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1KnowledgeAnswers', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1KnowledgeAnswers();
-      var od =
-          api.GoogleCloudDialogflowV2beta1KnowledgeAnswers.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1KnowledgeAnswers.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1KnowledgeAnswers(
           od as api.GoogleCloudDialogflowV2beta1KnowledgeAnswers);
     });
@@ -19721,8 +20097,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer(
           od as api.GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer);
     });
@@ -19732,9 +20109,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1KnowledgeOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1KnowledgeOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1KnowledgeOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1KnowledgeOperationMetadata(
           od as api.GoogleCloudDialogflowV2beta1KnowledgeOperationMetadata);
     });
@@ -19744,9 +20122,10 @@
       'obj-schema-GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1OriginalDetectIntentRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1OriginalDetectIntentRequest(
           od as api.GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest);
     });
@@ -19755,7 +20134,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1QueryResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1QueryResult();
-      var od = api.GoogleCloudDialogflowV2beta1QueryResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1QueryResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1QueryResult(
           od as api.GoogleCloudDialogflowV2beta1QueryResult);
     });
@@ -19764,7 +20145,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1Sentiment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1Sentiment();
-      var od = api.GoogleCloudDialogflowV2beta1Sentiment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1Sentiment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1Sentiment(
           od as api.GoogleCloudDialogflowV2beta1Sentiment);
     });
@@ -19774,8 +20157,9 @@
       'obj-schema-GoogleCloudDialogflowV2beta1SentimentAnalysisResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1SentimentAnalysisResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1SentimentAnalysisResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1SentimentAnalysisResult(
           od as api.GoogleCloudDialogflowV2beta1SentimentAnalysisResult);
     });
@@ -19785,8 +20169,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1SessionEntityType();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV2beta1SessionEntityType.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1SessionEntityType(
           od as api.GoogleCloudDialogflowV2beta1SessionEntityType);
     });
@@ -19795,8 +20180,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1WebhookRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1WebhookRequest();
-      var od =
-          api.GoogleCloudDialogflowV2beta1WebhookRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1WebhookRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1WebhookRequest(
           od as api.GoogleCloudDialogflowV2beta1WebhookRequest);
     });
@@ -19805,8 +20191,9 @@
   unittest.group('obj-schema-GoogleCloudDialogflowV2beta1WebhookResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV2beta1WebhookResponse();
-      var od =
-          api.GoogleCloudDialogflowV2beta1WebhookResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDialogflowV2beta1WebhookResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV2beta1WebhookResponse(
           od as api.GoogleCloudDialogflowV2beta1WebhookResponse);
     });
@@ -19818,8 +20205,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1CreateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV3alpha1CreateDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1CreateDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowV3alpha1CreateDocumentOperationMetadata);
     });
@@ -19831,8 +20219,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1DeleteDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV3alpha1DeleteDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1DeleteDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowV3alpha1DeleteDocumentOperationMetadata);
     });
@@ -19844,9 +20233,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1GenericKnowledgeOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV3alpha1GenericKnowledgeOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1GenericKnowledgeOperationMetadata(od
           as api
               .GoogleCloudDialogflowV3alpha1GenericKnowledgeOperationMetadata);
@@ -19859,8 +20249,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1ImportDocumentsOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV3alpha1ImportDocumentsOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1ImportDocumentsOperationMetadata(od
           as api.GoogleCloudDialogflowV3alpha1ImportDocumentsOperationMetadata);
     });
@@ -19870,9 +20261,10 @@
       'obj-schema-GoogleCloudDialogflowV3alpha1ImportDocumentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDialogflowV3alpha1ImportDocumentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDialogflowV3alpha1ImportDocumentsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1ImportDocumentsResponse(
           od as api.GoogleCloudDialogflowV3alpha1ImportDocumentsResponse);
     });
@@ -19884,8 +20276,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1ReloadDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV3alpha1ReloadDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1ReloadDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowV3alpha1ReloadDocumentOperationMetadata);
     });
@@ -19897,8 +20290,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDialogflowV3alpha1UpdateDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDialogflowV3alpha1UpdateDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDialogflowV3alpha1UpdateDocumentOperationMetadata(od
           as api.GoogleCloudDialogflowV3alpha1UpdateDocumentOperationMetadata);
     });
@@ -19907,7 +20301,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -19916,7 +20312,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -19924,7 +20322,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -19932,7 +20332,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
@@ -19940,7 +20342,9 @@
   unittest.group('obj-schema-GoogleTypeLatLng', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeLatLng();
-      var od = api.GoogleTypeLatLng.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeLatLng.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeLatLng(od as api.GoogleTypeLatLng);
     });
   });
diff --git a/generated/googleapis/test/digitalassetlinks/v1_test.dart b/generated/googleapis/test/digitalassetlinks/v1_test.dart
index ec6c676..5524305 100644
--- a/generated/googleapis/test/digitalassetlinks/v1_test.dart
+++ b/generated/googleapis/test/digitalassetlinks/v1_test.dart
@@ -259,7 +259,9 @@
   unittest.group('obj-schema-AndroidAppAsset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidAppAsset();
-      var od = api.AndroidAppAsset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidAppAsset.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidAppAsset(od as api.AndroidAppAsset);
     });
   });
@@ -267,7 +269,8 @@
   unittest.group('obj-schema-Asset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsset();
-      var od = api.Asset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Asset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAsset(od as api.Asset);
     });
   });
@@ -275,7 +278,9 @@
   unittest.group('obj-schema-CertificateInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCertificateInfo();
-      var od = api.CertificateInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CertificateInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCertificateInfo(od as api.CertificateInfo);
     });
   });
@@ -283,7 +288,9 @@
   unittest.group('obj-schema-CheckResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckResponse();
-      var od = api.CheckResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckResponse(od as api.CheckResponse);
     });
   });
@@ -291,7 +298,9 @@
   unittest.group('obj-schema-ListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListResponse();
-      var od = api.ListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListResponse(od as api.ListResponse);
     });
   });
@@ -299,7 +308,9 @@
   unittest.group('obj-schema-Statement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatement();
-      var od = api.Statement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Statement.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatement(od as api.Statement);
     });
   });
@@ -307,7 +318,9 @@
   unittest.group('obj-schema-WebAsset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebAsset();
-      var od = api.WebAsset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebAsset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebAsset(od as api.WebAsset);
     });
   });
diff --git a/generated/googleapis/test/discovery/v1_test.dart b/generated/googleapis/test/discovery/v1_test.dart
index 26367ae..c5daa97 100644
--- a/generated/googleapis/test/discovery/v1_test.dart
+++ b/generated/googleapis/test/discovery/v1_test.dart
@@ -1087,7 +1087,9 @@
   unittest.group('obj-schema-DirectoryListItemsIcons', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectoryListItemsIcons();
-      var od = api.DirectoryListItemsIcons.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectoryListItemsIcons.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectoryListItemsIcons(od as api.DirectoryListItemsIcons);
     });
   });
@@ -1095,7 +1097,9 @@
   unittest.group('obj-schema-DirectoryListItems', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectoryListItems();
-      var od = api.DirectoryListItems.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectoryListItems.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectoryListItems(od as api.DirectoryListItems);
     });
   });
@@ -1103,7 +1107,9 @@
   unittest.group('obj-schema-DirectoryList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDirectoryList();
-      var od = api.DirectoryList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DirectoryList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDirectoryList(od as api.DirectoryList);
     });
   });
@@ -1111,7 +1117,9 @@
   unittest.group('obj-schema-JsonSchemaAnnotations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJsonSchemaAnnotations();
-      var od = api.JsonSchemaAnnotations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JsonSchemaAnnotations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJsonSchemaAnnotations(od as api.JsonSchemaAnnotations);
     });
   });
@@ -1119,7 +1127,9 @@
   unittest.group('obj-schema-JsonSchemaVariantMap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJsonSchemaVariantMap();
-      var od = api.JsonSchemaVariantMap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JsonSchemaVariantMap.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJsonSchemaVariantMap(od as api.JsonSchemaVariantMap);
     });
   });
@@ -1127,7 +1137,9 @@
   unittest.group('obj-schema-JsonSchemaVariant', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJsonSchemaVariant();
-      var od = api.JsonSchemaVariant.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JsonSchemaVariant.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJsonSchemaVariant(od as api.JsonSchemaVariant);
     });
   });
@@ -1135,7 +1147,9 @@
   unittest.group('obj-schema-JsonSchema', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJsonSchema();
-      var od = api.JsonSchema.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JsonSchema.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJsonSchema(od as api.JsonSchema);
     });
   });
@@ -1143,7 +1157,9 @@
   unittest.group('obj-schema-RestDescriptionAuthOauth2ScopesValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestDescriptionAuthOauth2ScopesValue();
-      var od = api.RestDescriptionAuthOauth2ScopesValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestDescriptionAuthOauth2ScopesValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestDescriptionAuthOauth2ScopesValue(
           od as api.RestDescriptionAuthOauth2ScopesValue);
     });
@@ -1152,7 +1168,9 @@
   unittest.group('obj-schema-RestDescriptionAuthOauth2', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestDescriptionAuthOauth2();
-      var od = api.RestDescriptionAuthOauth2.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestDescriptionAuthOauth2.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestDescriptionAuthOauth2(od as api.RestDescriptionAuthOauth2);
     });
   });
@@ -1160,7 +1178,9 @@
   unittest.group('obj-schema-RestDescriptionAuth', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestDescriptionAuth();
-      var od = api.RestDescriptionAuth.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestDescriptionAuth.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestDescriptionAuth(od as api.RestDescriptionAuth);
     });
   });
@@ -1168,7 +1188,9 @@
   unittest.group('obj-schema-RestDescriptionIcons', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestDescriptionIcons();
-      var od = api.RestDescriptionIcons.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestDescriptionIcons.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestDescriptionIcons(od as api.RestDescriptionIcons);
     });
   });
@@ -1176,7 +1198,9 @@
   unittest.group('obj-schema-RestDescription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestDescription();
-      var od = api.RestDescription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestDescription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestDescription(od as api.RestDescription);
     });
   });
@@ -1184,7 +1208,9 @@
   unittest.group('obj-schema-RestMethodMediaUploadProtocolsResumable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestMethodMediaUploadProtocolsResumable();
-      var od = api.RestMethodMediaUploadProtocolsResumable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestMethodMediaUploadProtocolsResumable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestMethodMediaUploadProtocolsResumable(
           od as api.RestMethodMediaUploadProtocolsResumable);
     });
@@ -1193,7 +1219,9 @@
   unittest.group('obj-schema-RestMethodMediaUploadProtocolsSimple', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestMethodMediaUploadProtocolsSimple();
-      var od = api.RestMethodMediaUploadProtocolsSimple.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestMethodMediaUploadProtocolsSimple.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestMethodMediaUploadProtocolsSimple(
           od as api.RestMethodMediaUploadProtocolsSimple);
     });
@@ -1202,7 +1230,9 @@
   unittest.group('obj-schema-RestMethodMediaUploadProtocols', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestMethodMediaUploadProtocols();
-      var od = api.RestMethodMediaUploadProtocols.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestMethodMediaUploadProtocols.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestMethodMediaUploadProtocols(
           od as api.RestMethodMediaUploadProtocols);
     });
@@ -1211,7 +1241,9 @@
   unittest.group('obj-schema-RestMethodMediaUpload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestMethodMediaUpload();
-      var od = api.RestMethodMediaUpload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestMethodMediaUpload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestMethodMediaUpload(od as api.RestMethodMediaUpload);
     });
   });
@@ -1219,7 +1251,9 @@
   unittest.group('obj-schema-RestMethodRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestMethodRequest();
-      var od = api.RestMethodRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestMethodRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestMethodRequest(od as api.RestMethodRequest);
     });
   });
@@ -1227,7 +1261,9 @@
   unittest.group('obj-schema-RestMethodResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestMethodResponse();
-      var od = api.RestMethodResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestMethodResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestMethodResponse(od as api.RestMethodResponse);
     });
   });
@@ -1235,7 +1271,9 @@
   unittest.group('obj-schema-RestMethod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestMethod();
-      var od = api.RestMethod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RestMethod.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRestMethod(od as api.RestMethod);
     });
   });
@@ -1243,7 +1281,9 @@
   unittest.group('obj-schema-RestResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestResource();
-      var od = api.RestResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestResource(od as api.RestResource);
     });
   });
diff --git a/generated/googleapis/test/displayvideo/v1_test.dart b/generated/googleapis/test/displayvideo/v1_test.dart
index 8079ae9..2587ba7 100644
--- a/generated/googleapis/test/displayvideo/v1_test.dart
+++ b/generated/googleapis/test/displayvideo/v1_test.dart
@@ -8810,7 +8810,9 @@
   unittest.group('obj-schema-ActivateManualTriggerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivateManualTriggerRequest();
-      var od = api.ActivateManualTriggerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivateManualTriggerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivateManualTriggerRequest(od as api.ActivateManualTriggerRequest);
     });
   });
@@ -8818,7 +8820,9 @@
   unittest.group('obj-schema-ActiveViewVideoViewabilityMetricConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActiveViewVideoViewabilityMetricConfig();
-      var od = api.ActiveViewVideoViewabilityMetricConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActiveViewVideoViewabilityMetricConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActiveViewVideoViewabilityMetricConfig(
           od as api.ActiveViewVideoViewabilityMetricConfig);
     });
@@ -8827,7 +8831,9 @@
   unittest.group('obj-schema-Adloox', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdloox();
-      var od = api.Adloox.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Adloox.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdloox(od as api.Adloox);
     });
   });
@@ -8835,7 +8841,9 @@
   unittest.group('obj-schema-Advertiser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiser();
-      var od = api.Advertiser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Advertiser.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiser(od as api.Advertiser);
     });
   });
@@ -8843,7 +8851,9 @@
   unittest.group('obj-schema-AdvertiserAdServerConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiserAdServerConfig();
-      var od = api.AdvertiserAdServerConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertiserAdServerConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiserAdServerConfig(od as api.AdvertiserAdServerConfig);
     });
   });
@@ -8851,7 +8861,9 @@
   unittest.group('obj-schema-AdvertiserCreativeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiserCreativeConfig();
-      var od = api.AdvertiserCreativeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertiserCreativeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiserCreativeConfig(od as api.AdvertiserCreativeConfig);
     });
   });
@@ -8859,7 +8871,9 @@
   unittest.group('obj-schema-AdvertiserDataAccessConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiserDataAccessConfig();
-      var od = api.AdvertiserDataAccessConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertiserDataAccessConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiserDataAccessConfig(od as api.AdvertiserDataAccessConfig);
     });
   });
@@ -8867,7 +8881,9 @@
   unittest.group('obj-schema-AdvertiserGeneralConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiserGeneralConfig();
-      var od = api.AdvertiserGeneralConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertiserGeneralConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiserGeneralConfig(od as api.AdvertiserGeneralConfig);
     });
   });
@@ -8875,7 +8891,9 @@
   unittest.group('obj-schema-AdvertiserSdfConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiserSdfConfig();
-      var od = api.AdvertiserSdfConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertiserSdfConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiserSdfConfig(od as api.AdvertiserSdfConfig);
     });
   });
@@ -8883,7 +8901,9 @@
   unittest.group('obj-schema-AdvertiserTargetingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiserTargetingConfig();
-      var od = api.AdvertiserTargetingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertiserTargetingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiserTargetingConfig(od as api.AdvertiserTargetingConfig);
     });
   });
@@ -8891,7 +8911,9 @@
   unittest.group('obj-schema-AgeRangeAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAgeRangeAssignedTargetingOptionDetails();
-      var od = api.AgeRangeAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AgeRangeAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAgeRangeAssignedTargetingOptionDetails(
           od as api.AgeRangeAssignedTargetingOptionDetails);
     });
@@ -8900,7 +8922,9 @@
   unittest.group('obj-schema-AgeRangeTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAgeRangeTargetingOptionDetails();
-      var od = api.AgeRangeTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AgeRangeTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAgeRangeTargetingOptionDetails(
           od as api.AgeRangeTargetingOptionDetails);
     });
@@ -8909,7 +8933,9 @@
   unittest.group('obj-schema-AppAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppAssignedTargetingOptionDetails();
-      var od = api.AppAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppAssignedTargetingOptionDetails(
           od as api.AppAssignedTargetingOptionDetails);
     });
@@ -8918,8 +8944,9 @@
   unittest.group('obj-schema-AppCategoryAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppCategoryAssignedTargetingOptionDetails();
-      var od =
-          api.AppCategoryAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppCategoryAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppCategoryAssignedTargetingOptionDetails(
           od as api.AppCategoryAssignedTargetingOptionDetails);
     });
@@ -8928,7 +8955,9 @@
   unittest.group('obj-schema-AppCategoryTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppCategoryTargetingOptionDetails();
-      var od = api.AppCategoryTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppCategoryTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppCategoryTargetingOptionDetails(
           od as api.AppCategoryTargetingOptionDetails);
     });
@@ -8937,7 +8966,8 @@
   unittest.group('obj-schema-Asset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsset();
-      var od = api.Asset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Asset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAsset(od as api.Asset);
     });
   });
@@ -8945,7 +8975,9 @@
   unittest.group('obj-schema-AssetAssociation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssetAssociation();
-      var od = api.AssetAssociation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AssetAssociation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAssetAssociation(od as api.AssetAssociation);
     });
   });
@@ -8953,7 +8985,9 @@
   unittest.group('obj-schema-AssignedInventorySource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssignedInventorySource();
-      var od = api.AssignedInventorySource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AssignedInventorySource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAssignedInventorySource(od as api.AssignedInventorySource);
     });
   });
@@ -8961,7 +8995,9 @@
   unittest.group('obj-schema-AssignedLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssignedLocation();
-      var od = api.AssignedLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AssignedLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAssignedLocation(od as api.AssignedLocation);
     });
   });
@@ -8969,7 +9005,9 @@
   unittest.group('obj-schema-AssignedTargetingOption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssignedTargetingOption();
-      var od = api.AssignedTargetingOption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AssignedTargetingOption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAssignedTargetingOption(od as api.AssignedTargetingOption);
     });
   });
@@ -8977,7 +9015,9 @@
   unittest.group('obj-schema-AssignedUserRole', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssignedUserRole();
-      var od = api.AssignedUserRole.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AssignedUserRole.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAssignedUserRole(od as api.AssignedUserRole);
     });
   });
@@ -8985,8 +9025,9 @@
   unittest.group('obj-schema-AudienceGroupAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAudienceGroupAssignedTargetingOptionDetails();
-      var od =
-          api.AudienceGroupAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AudienceGroupAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAudienceGroupAssignedTargetingOptionDetails(
           od as api.AudienceGroupAssignedTargetingOptionDetails);
     });
@@ -8995,7 +9036,9 @@
   unittest.group('obj-schema-AudioVideoOffset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAudioVideoOffset();
-      var od = api.AudioVideoOffset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AudioVideoOffset.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAudioVideoOffset(od as api.AudioVideoOffset);
     });
   });
@@ -9003,7 +9046,9 @@
   unittest.group('obj-schema-AuditAdvertiserResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditAdvertiserResponse();
-      var od = api.AuditAdvertiserResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditAdvertiserResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditAdvertiserResponse(od as api.AuditAdvertiserResponse);
     });
   });
@@ -9012,9 +9057,10 @@
       'obj-schema-AuthorizedSellerStatusAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizedSellerStatusAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.AuthorizedSellerStatusAssignedTargetingOptionDetails.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizedSellerStatusAssignedTargetingOptionDetails(
           od as api.AuthorizedSellerStatusAssignedTargetingOptionDetails);
     });
@@ -9023,8 +9069,9 @@
   unittest.group('obj-schema-AuthorizedSellerStatusTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizedSellerStatusTargetingOptionDetails();
-      var od =
-          api.AuthorizedSellerStatusTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizedSellerStatusTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizedSellerStatusTargetingOptionDetails(
           od as api.AuthorizedSellerStatusTargetingOptionDetails);
     });
@@ -9033,7 +9080,9 @@
   unittest.group('obj-schema-BiddingStrategy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBiddingStrategy();
-      var od = api.BiddingStrategy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BiddingStrategy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBiddingStrategy(od as api.BiddingStrategy);
     });
   });
@@ -9041,7 +9090,9 @@
   unittest.group('obj-schema-BrowserAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBrowserAssignedTargetingOptionDetails();
-      var od = api.BrowserAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BrowserAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBrowserAssignedTargetingOptionDetails(
           od as api.BrowserAssignedTargetingOptionDetails);
     });
@@ -9050,7 +9101,9 @@
   unittest.group('obj-schema-BrowserTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBrowserTargetingOptionDetails();
-      var od = api.BrowserTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BrowserTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBrowserTargetingOptionDetails(
           od as api.BrowserTargetingOptionDetails);
     });
@@ -9060,8 +9113,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditAdvertiserAssignedTargetingOptionsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BulkEditAdvertiserAssignedTargetingOptionsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditAdvertiserAssignedTargetingOptionsRequest(
           od as api.BulkEditAdvertiserAssignedTargetingOptionsRequest);
     });
@@ -9071,8 +9125,9 @@
       'obj-schema-BulkEditAdvertiserAssignedTargetingOptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditAdvertiserAssignedTargetingOptionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BulkEditAdvertiserAssignedTargetingOptionsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditAdvertiserAssignedTargetingOptionsResponse(
           od as api.BulkEditAdvertiserAssignedTargetingOptionsResponse);
     });
@@ -9081,7 +9136,9 @@
   unittest.group('obj-schema-BulkEditAssignedInventorySourcesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditAssignedInventorySourcesRequest();
-      var od = api.BulkEditAssignedInventorySourcesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkEditAssignedInventorySourcesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditAssignedInventorySourcesRequest(
           od as api.BulkEditAssignedInventorySourcesRequest);
     });
@@ -9090,8 +9147,9 @@
   unittest.group('obj-schema-BulkEditAssignedInventorySourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditAssignedInventorySourcesResponse();
-      var od =
-          api.BulkEditAssignedInventorySourcesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkEditAssignedInventorySourcesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditAssignedInventorySourcesResponse(
           od as api.BulkEditAssignedInventorySourcesResponse);
     });
@@ -9100,7 +9158,9 @@
   unittest.group('obj-schema-BulkEditAssignedLocationsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditAssignedLocationsRequest();
-      var od = api.BulkEditAssignedLocationsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkEditAssignedLocationsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditAssignedLocationsRequest(
           od as api.BulkEditAssignedLocationsRequest);
     });
@@ -9109,7 +9169,9 @@
   unittest.group('obj-schema-BulkEditAssignedLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditAssignedLocationsResponse();
-      var od = api.BulkEditAssignedLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkEditAssignedLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditAssignedLocationsResponse(
           od as api.BulkEditAssignedLocationsResponse);
     });
@@ -9118,7 +9180,9 @@
   unittest.group('obj-schema-BulkEditAssignedUserRolesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditAssignedUserRolesRequest();
-      var od = api.BulkEditAssignedUserRolesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkEditAssignedUserRolesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditAssignedUserRolesRequest(
           od as api.BulkEditAssignedUserRolesRequest);
     });
@@ -9127,7 +9191,9 @@
   unittest.group('obj-schema-BulkEditAssignedUserRolesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditAssignedUserRolesResponse();
-      var od = api.BulkEditAssignedUserRolesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkEditAssignedUserRolesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditAssignedUserRolesResponse(
           od as api.BulkEditAssignedUserRolesResponse);
     });
@@ -9137,8 +9203,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditLineItemAssignedTargetingOptionsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BulkEditLineItemAssignedTargetingOptionsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditLineItemAssignedTargetingOptionsRequest(
           od as api.BulkEditLineItemAssignedTargetingOptionsRequest);
     });
@@ -9148,8 +9215,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditLineItemAssignedTargetingOptionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BulkEditLineItemAssignedTargetingOptionsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditLineItemAssignedTargetingOptionsResponse(
           od as api.BulkEditLineItemAssignedTargetingOptionsResponse);
     });
@@ -9158,7 +9226,9 @@
   unittest.group('obj-schema-BulkEditNegativeKeywordsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditNegativeKeywordsRequest();
-      var od = api.BulkEditNegativeKeywordsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkEditNegativeKeywordsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditNegativeKeywordsRequest(
           od as api.BulkEditNegativeKeywordsRequest);
     });
@@ -9167,7 +9237,9 @@
   unittest.group('obj-schema-BulkEditNegativeKeywordsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditNegativeKeywordsResponse();
-      var od = api.BulkEditNegativeKeywordsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkEditNegativeKeywordsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditNegativeKeywordsResponse(
           od as api.BulkEditNegativeKeywordsResponse);
     });
@@ -9177,8 +9249,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditPartnerAssignedTargetingOptionsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BulkEditPartnerAssignedTargetingOptionsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditPartnerAssignedTargetingOptionsRequest(
           od as api.BulkEditPartnerAssignedTargetingOptionsRequest);
     });
@@ -9188,8 +9261,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditPartnerAssignedTargetingOptionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BulkEditPartnerAssignedTargetingOptionsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditPartnerAssignedTargetingOptionsResponse(
           od as api.BulkEditPartnerAssignedTargetingOptionsResponse);
     });
@@ -9198,7 +9272,9 @@
   unittest.group('obj-schema-BulkEditSitesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditSitesRequest();
-      var od = api.BulkEditSitesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkEditSitesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditSitesRequest(od as api.BulkEditSitesRequest);
     });
   });
@@ -9206,7 +9282,9 @@
   unittest.group('obj-schema-BulkEditSitesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkEditSitesResponse();
-      var od = api.BulkEditSitesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulkEditSitesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkEditSitesResponse(od as api.BulkEditSitesResponse);
     });
   });
@@ -9215,8 +9293,9 @@
       'obj-schema-BulkListAdvertiserAssignedTargetingOptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkListAdvertiserAssignedTargetingOptionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BulkListAdvertiserAssignedTargetingOptionsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkListAdvertiserAssignedTargetingOptionsResponse(
           od as api.BulkListAdvertiserAssignedTargetingOptionsResponse);
     });
@@ -9226,9 +9305,10 @@
       'obj-schema-BulkListInsertionOrderAssignedTargetingOptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkListInsertionOrderAssignedTargetingOptionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.BulkListInsertionOrderAssignedTargetingOptionsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkBulkListInsertionOrderAssignedTargetingOptionsResponse(
           od as api.BulkListInsertionOrderAssignedTargetingOptionsResponse);
     });
@@ -9238,8 +9318,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulkListLineItemAssignedTargetingOptionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BulkListLineItemAssignedTargetingOptionsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulkListLineItemAssignedTargetingOptionsResponse(
           od as api.BulkListLineItemAssignedTargetingOptionsResponse);
     });
@@ -9248,7 +9329,9 @@
   unittest.group('obj-schema-Campaign', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCampaign();
-      var od = api.Campaign.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Campaign.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCampaign(od as api.Campaign);
     });
   });
@@ -9256,7 +9339,9 @@
   unittest.group('obj-schema-CampaignFlight', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCampaignFlight();
-      var od = api.CampaignFlight.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CampaignFlight.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCampaignFlight(od as api.CampaignFlight);
     });
   });
@@ -9264,7 +9349,9 @@
   unittest.group('obj-schema-CampaignGoal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCampaignGoal();
-      var od = api.CampaignGoal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CampaignGoal.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCampaignGoal(od as api.CampaignGoal);
     });
   });
@@ -9272,8 +9359,9 @@
   unittest.group('obj-schema-CarrierAndIspAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCarrierAndIspAssignedTargetingOptionDetails();
-      var od =
-          api.CarrierAndIspAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CarrierAndIspAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCarrierAndIspAssignedTargetingOptionDetails(
           od as api.CarrierAndIspAssignedTargetingOptionDetails);
     });
@@ -9282,7 +9370,9 @@
   unittest.group('obj-schema-CarrierAndIspTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCarrierAndIspTargetingOptionDetails();
-      var od = api.CarrierAndIspTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CarrierAndIspTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCarrierAndIspTargetingOptionDetails(
           od as api.CarrierAndIspTargetingOptionDetails);
     });
@@ -9291,7 +9381,9 @@
   unittest.group('obj-schema-CategoryAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategoryAssignedTargetingOptionDetails();
-      var od = api.CategoryAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CategoryAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCategoryAssignedTargetingOptionDetails(
           od as api.CategoryAssignedTargetingOptionDetails);
     });
@@ -9300,7 +9392,9 @@
   unittest.group('obj-schema-CategoryTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategoryTargetingOptionDetails();
-      var od = api.CategoryTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CategoryTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCategoryTargetingOptionDetails(
           od as api.CategoryTargetingOptionDetails);
     });
@@ -9309,7 +9403,9 @@
   unittest.group('obj-schema-Channel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannel();
-      var od = api.Channel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Channel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChannel(od as api.Channel);
     });
   });
@@ -9317,7 +9413,9 @@
   unittest.group('obj-schema-ChannelAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelAssignedTargetingOptionDetails();
-      var od = api.ChannelAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelAssignedTargetingOptionDetails(
           od as api.ChannelAssignedTargetingOptionDetails);
     });
@@ -9326,7 +9424,9 @@
   unittest.group('obj-schema-CmHybridConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCmHybridConfig();
-      var od = api.CmHybridConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CmHybridConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCmHybridConfig(od as api.CmHybridConfig);
     });
   });
@@ -9334,7 +9434,9 @@
   unittest.group('obj-schema-CmTrackingAd', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCmTrackingAd();
-      var od = api.CmTrackingAd.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CmTrackingAd.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCmTrackingAd(od as api.CmTrackingAd);
     });
   });
@@ -9342,7 +9444,9 @@
   unittest.group('obj-schema-CombinedAudience', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCombinedAudience();
-      var od = api.CombinedAudience.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CombinedAudience.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCombinedAudience(od as api.CombinedAudience);
     });
   });
@@ -9350,7 +9454,9 @@
   unittest.group('obj-schema-CombinedAudienceGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCombinedAudienceGroup();
-      var od = api.CombinedAudienceGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CombinedAudienceGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCombinedAudienceGroup(od as api.CombinedAudienceGroup);
     });
   });
@@ -9358,7 +9464,9 @@
   unittest.group('obj-schema-CombinedAudienceTargetingSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCombinedAudienceTargetingSetting();
-      var od = api.CombinedAudienceTargetingSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CombinedAudienceTargetingSetting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCombinedAudienceTargetingSetting(
           od as api.CombinedAudienceTargetingSetting);
     });
@@ -9368,9 +9476,10 @@
       'obj-schema-ContentInstreamPositionAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContentInstreamPositionAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.ContentInstreamPositionAssignedTargetingOptionDetails.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkContentInstreamPositionAssignedTargetingOptionDetails(
           od as api.ContentInstreamPositionAssignedTargetingOptionDetails);
     });
@@ -9380,8 +9489,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildContentInstreamPositionTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ContentInstreamPositionTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkContentInstreamPositionTargetingOptionDetails(
           od as api.ContentInstreamPositionTargetingOptionDetails);
     });
@@ -9391,9 +9501,10 @@
       'obj-schema-ContentOutstreamPositionAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContentOutstreamPositionAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.ContentOutstreamPositionAssignedTargetingOptionDetails.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkContentOutstreamPositionAssignedTargetingOptionDetails(
           od as api.ContentOutstreamPositionAssignedTargetingOptionDetails);
     });
@@ -9403,8 +9514,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildContentOutstreamPositionTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ContentOutstreamPositionTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkContentOutstreamPositionTargetingOptionDetails(
           od as api.ContentOutstreamPositionTargetingOptionDetails);
     });
@@ -9413,7 +9525,9 @@
   unittest.group('obj-schema-ConversionCountingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConversionCountingConfig();
-      var od = api.ConversionCountingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConversionCountingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConversionCountingConfig(od as api.ConversionCountingConfig);
     });
   });
@@ -9421,7 +9535,9 @@
   unittest.group('obj-schema-CounterEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCounterEvent();
-      var od = api.CounterEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CounterEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCounterEvent(od as api.CounterEvent);
     });
   });
@@ -9429,7 +9545,9 @@
   unittest.group('obj-schema-CreateAssetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateAssetRequest();
-      var od = api.CreateAssetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateAssetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateAssetRequest(od as api.CreateAssetRequest);
     });
   });
@@ -9437,7 +9555,9 @@
   unittest.group('obj-schema-CreateAssetResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateAssetResponse();
-      var od = api.CreateAssetResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateAssetResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateAssetResponse(od as api.CreateAssetResponse);
     });
   });
@@ -9445,7 +9565,9 @@
   unittest.group('obj-schema-CreateAssignedTargetingOptionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateAssignedTargetingOptionsRequest();
-      var od = api.CreateAssignedTargetingOptionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateAssignedTargetingOptionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateAssignedTargetingOptionsRequest(
           od as api.CreateAssignedTargetingOptionsRequest);
     });
@@ -9454,7 +9576,9 @@
   unittest.group('obj-schema-CreateSdfDownloadTaskRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateSdfDownloadTaskRequest();
-      var od = api.CreateSdfDownloadTaskRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateSdfDownloadTaskRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateSdfDownloadTaskRequest(od as api.CreateSdfDownloadTaskRequest);
     });
   });
@@ -9462,7 +9586,9 @@
   unittest.group('obj-schema-Creative', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreative();
-      var od = api.Creative.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Creative.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCreative(od as api.Creative);
     });
   });
@@ -9470,7 +9596,9 @@
   unittest.group('obj-schema-CreativeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeConfig();
-      var od = api.CreativeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeConfig(od as api.CreativeConfig);
     });
   });
@@ -9478,7 +9606,9 @@
   unittest.group('obj-schema-CustomBiddingAlgorithm', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomBiddingAlgorithm();
-      var od = api.CustomBiddingAlgorithm.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomBiddingAlgorithm.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomBiddingAlgorithm(od as api.CustomBiddingAlgorithm);
     });
   });
@@ -9486,7 +9616,9 @@
   unittest.group('obj-schema-CustomList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomList();
-      var od = api.CustomList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CustomList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCustomList(od as api.CustomList);
     });
   });
@@ -9494,7 +9626,9 @@
   unittest.group('obj-schema-CustomListGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomListGroup();
-      var od = api.CustomListGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomListGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomListGroup(od as api.CustomListGroup);
     });
   });
@@ -9502,7 +9636,9 @@
   unittest.group('obj-schema-CustomListTargetingSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomListTargetingSetting();
-      var od = api.CustomListTargetingSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomListTargetingSetting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomListTargetingSetting(od as api.CustomListTargetingSetting);
     });
   });
@@ -9510,7 +9646,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -9518,7 +9655,9 @@
   unittest.group('obj-schema-DateRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateRange();
-      var od = api.DateRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DateRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDateRange(od as api.DateRange);
     });
   });
@@ -9526,8 +9665,9 @@
   unittest.group('obj-schema-DayAndTimeAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDayAndTimeAssignedTargetingOptionDetails();
-      var od =
-          api.DayAndTimeAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DayAndTimeAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDayAndTimeAssignedTargetingOptionDetails(
           od as api.DayAndTimeAssignedTargetingOptionDetails);
     });
@@ -9536,7 +9676,9 @@
   unittest.group('obj-schema-DeactivateManualTriggerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeactivateManualTriggerRequest();
-      var od = api.DeactivateManualTriggerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeactivateManualTriggerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeactivateManualTriggerRequest(
           od as api.DeactivateManualTriggerRequest);
     });
@@ -9545,7 +9687,9 @@
   unittest.group('obj-schema-DeleteAssignedTargetingOptionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteAssignedTargetingOptionsRequest();
-      var od = api.DeleteAssignedTargetingOptionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteAssignedTargetingOptionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteAssignedTargetingOptionsRequest(
           od as api.DeleteAssignedTargetingOptionsRequest);
     });
@@ -9555,8 +9699,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceMakeModelAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.DeviceMakeModelAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceMakeModelAssignedTargetingOptionDetails(
           od as api.DeviceMakeModelAssignedTargetingOptionDetails);
     });
@@ -9565,7 +9710,9 @@
   unittest.group('obj-schema-DeviceMakeModelTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceMakeModelTargetingOptionDetails();
-      var od = api.DeviceMakeModelTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceMakeModelTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceMakeModelTargetingOptionDetails(
           od as api.DeviceMakeModelTargetingOptionDetails);
     });
@@ -9574,8 +9721,9 @@
   unittest.group('obj-schema-DeviceTypeAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceTypeAssignedTargetingOptionDetails();
-      var od =
-          api.DeviceTypeAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceTypeAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceTypeAssignedTargetingOptionDetails(
           od as api.DeviceTypeAssignedTargetingOptionDetails);
     });
@@ -9584,7 +9732,9 @@
   unittest.group('obj-schema-DeviceTypeTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceTypeTargetingOptionDetails();
-      var od = api.DeviceTypeTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceTypeTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceTypeTargetingOptionDetails(
           od as api.DeviceTypeTargetingOptionDetails);
     });
@@ -9594,8 +9744,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildDigitalContentLabelAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.DigitalContentLabelAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkDigitalContentLabelAssignedTargetingOptionDetails(
           od as api.DigitalContentLabelAssignedTargetingOptionDetails);
     });
@@ -9604,8 +9755,9 @@
   unittest.group('obj-schema-DigitalContentLabelTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDigitalContentLabelTargetingOptionDetails();
-      var od =
-          api.DigitalContentLabelTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DigitalContentLabelTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDigitalContentLabelTargetingOptionDetails(
           od as api.DigitalContentLabelTargetingOptionDetails);
     });
@@ -9614,7 +9766,9 @@
   unittest.group('obj-schema-Dimensions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensions();
-      var od = api.Dimensions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Dimensions.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDimensions(od as api.Dimensions);
     });
   });
@@ -9622,7 +9776,9 @@
   unittest.group('obj-schema-DoubleVerify', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoubleVerify();
-      var od = api.DoubleVerify.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoubleVerify.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoubleVerify(od as api.DoubleVerify);
     });
   });
@@ -9630,7 +9786,9 @@
   unittest.group('obj-schema-DoubleVerifyAppStarRating', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoubleVerifyAppStarRating();
-      var od = api.DoubleVerifyAppStarRating.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoubleVerifyAppStarRating.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoubleVerifyAppStarRating(od as api.DoubleVerifyAppStarRating);
     });
   });
@@ -9638,7 +9796,9 @@
   unittest.group('obj-schema-DoubleVerifyBrandSafetyCategories', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoubleVerifyBrandSafetyCategories();
-      var od = api.DoubleVerifyBrandSafetyCategories.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoubleVerifyBrandSafetyCategories.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoubleVerifyBrandSafetyCategories(
           od as api.DoubleVerifyBrandSafetyCategories);
     });
@@ -9647,7 +9807,9 @@
   unittest.group('obj-schema-DoubleVerifyDisplayViewability', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoubleVerifyDisplayViewability();
-      var od = api.DoubleVerifyDisplayViewability.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoubleVerifyDisplayViewability.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoubleVerifyDisplayViewability(
           od as api.DoubleVerifyDisplayViewability);
     });
@@ -9656,7 +9818,9 @@
   unittest.group('obj-schema-DoubleVerifyFraudInvalidTraffic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoubleVerifyFraudInvalidTraffic();
-      var od = api.DoubleVerifyFraudInvalidTraffic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoubleVerifyFraudInvalidTraffic.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoubleVerifyFraudInvalidTraffic(
           od as api.DoubleVerifyFraudInvalidTraffic);
     });
@@ -9665,7 +9829,9 @@
   unittest.group('obj-schema-DoubleVerifyVideoViewability', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoubleVerifyVideoViewability();
-      var od = api.DoubleVerifyVideoViewability.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoubleVerifyVideoViewability.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoubleVerifyVideoViewability(od as api.DoubleVerifyVideoViewability);
     });
   });
@@ -9673,7 +9839,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -9681,8 +9848,9 @@
   unittest.group('obj-schema-EnvironmentAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironmentAssignedTargetingOptionDetails();
-      var od =
-          api.EnvironmentAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnvironmentAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironmentAssignedTargetingOptionDetails(
           od as api.EnvironmentAssignedTargetingOptionDetails);
     });
@@ -9691,7 +9859,9 @@
   unittest.group('obj-schema-EnvironmentTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironmentTargetingOptionDetails();
-      var od = api.EnvironmentTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnvironmentTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironmentTargetingOptionDetails(
           od as api.EnvironmentTargetingOptionDetails);
     });
@@ -9700,7 +9870,9 @@
   unittest.group('obj-schema-ExchangeAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExchangeAssignedTargetingOptionDetails();
-      var od = api.ExchangeAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExchangeAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExchangeAssignedTargetingOptionDetails(
           od as api.ExchangeAssignedTargetingOptionDetails);
     });
@@ -9709,7 +9881,9 @@
   unittest.group('obj-schema-ExchangeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExchangeConfig();
-      var od = api.ExchangeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExchangeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExchangeConfig(od as api.ExchangeConfig);
     });
   });
@@ -9717,7 +9891,9 @@
   unittest.group('obj-schema-ExchangeConfigEnabledExchange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExchangeConfigEnabledExchange();
-      var od = api.ExchangeConfigEnabledExchange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExchangeConfigEnabledExchange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExchangeConfigEnabledExchange(
           od as api.ExchangeConfigEnabledExchange);
     });
@@ -9726,7 +9902,9 @@
   unittest.group('obj-schema-ExchangeReviewStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExchangeReviewStatus();
-      var od = api.ExchangeReviewStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExchangeReviewStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExchangeReviewStatus(od as api.ExchangeReviewStatus);
     });
   });
@@ -9734,7 +9912,9 @@
   unittest.group('obj-schema-ExchangeTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExchangeTargetingOptionDetails();
-      var od = api.ExchangeTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExchangeTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExchangeTargetingOptionDetails(
           od as api.ExchangeTargetingOptionDetails);
     });
@@ -9743,7 +9923,9 @@
   unittest.group('obj-schema-ExitEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExitEvent();
-      var od = api.ExitEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ExitEvent.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExitEvent(od as api.ExitEvent);
     });
   });
@@ -9751,7 +9933,9 @@
   unittest.group('obj-schema-FirstAndThirdPartyAudience', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirstAndThirdPartyAudience();
-      var od = api.FirstAndThirdPartyAudience.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirstAndThirdPartyAudience.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirstAndThirdPartyAudience(od as api.FirstAndThirdPartyAudience);
     });
   });
@@ -9759,7 +9943,9 @@
   unittest.group('obj-schema-FirstAndThirdPartyAudienceGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirstAndThirdPartyAudienceGroup();
-      var od = api.FirstAndThirdPartyAudienceGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirstAndThirdPartyAudienceGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirstAndThirdPartyAudienceGroup(
           od as api.FirstAndThirdPartyAudienceGroup);
     });
@@ -9768,8 +9954,9 @@
   unittest.group('obj-schema-FirstAndThirdPartyAudienceTargetingSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirstAndThirdPartyAudienceTargetingSetting();
-      var od =
-          api.FirstAndThirdPartyAudienceTargetingSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirstAndThirdPartyAudienceTargetingSetting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirstAndThirdPartyAudienceTargetingSetting(
           od as api.FirstAndThirdPartyAudienceTargetingSetting);
     });
@@ -9778,7 +9965,9 @@
   unittest.group('obj-schema-FixedBidStrategy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFixedBidStrategy();
-      var od = api.FixedBidStrategy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FixedBidStrategy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFixedBidStrategy(od as api.FixedBidStrategy);
     });
   });
@@ -9786,7 +9975,9 @@
   unittest.group('obj-schema-FloodlightGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloodlightGroup();
-      var od = api.FloodlightGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloodlightGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloodlightGroup(od as api.FloodlightGroup);
     });
   });
@@ -9794,7 +9985,9 @@
   unittest.group('obj-schema-FrequencyCap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFrequencyCap();
-      var od = api.FrequencyCap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FrequencyCap.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFrequencyCap(od as api.FrequencyCap);
     });
   });
@@ -9802,7 +9995,9 @@
   unittest.group('obj-schema-GenderAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenderAssignedTargetingOptionDetails();
-      var od = api.GenderAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenderAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenderAssignedTargetingOptionDetails(
           od as api.GenderAssignedTargetingOptionDetails);
     });
@@ -9811,7 +10006,9 @@
   unittest.group('obj-schema-GenderTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenderTargetingOptionDetails();
-      var od = api.GenderTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenderTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenderTargetingOptionDetails(od as api.GenderTargetingOptionDetails);
     });
   });
@@ -9819,7 +10016,9 @@
   unittest.group('obj-schema-GeoRegionAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeoRegionAssignedTargetingOptionDetails();
-      var od = api.GeoRegionAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeoRegionAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeoRegionAssignedTargetingOptionDetails(
           od as api.GeoRegionAssignedTargetingOptionDetails);
     });
@@ -9828,7 +10027,9 @@
   unittest.group('obj-schema-GeoRegionSearchTerms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeoRegionSearchTerms();
-      var od = api.GeoRegionSearchTerms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeoRegionSearchTerms.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeoRegionSearchTerms(od as api.GeoRegionSearchTerms);
     });
   });
@@ -9836,7 +10037,9 @@
   unittest.group('obj-schema-GeoRegionTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeoRegionTargetingOptionDetails();
-      var od = api.GeoRegionTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeoRegionTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeoRegionTargetingOptionDetails(
           od as api.GeoRegionTargetingOptionDetails);
     });
@@ -9845,7 +10048,9 @@
   unittest.group('obj-schema-GoogleAudience', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAudience();
-      var od = api.GoogleAudience.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAudience.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAudience(od as api.GoogleAudience);
     });
   });
@@ -9853,7 +10058,9 @@
   unittest.group('obj-schema-GoogleAudienceGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAudienceGroup();
-      var od = api.GoogleAudienceGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAudienceGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAudienceGroup(od as api.GoogleAudienceGroup);
     });
   });
@@ -9861,7 +10068,9 @@
   unittest.group('obj-schema-GoogleAudienceTargetingSetting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAudienceTargetingSetting();
-      var od = api.GoogleAudienceTargetingSetting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAudienceTargetingSetting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAudienceTargetingSetting(
           od as api.GoogleAudienceTargetingSetting);
     });
@@ -9870,7 +10079,9 @@
   unittest.group('obj-schema-GoogleBytestreamMedia', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleBytestreamMedia();
-      var od = api.GoogleBytestreamMedia.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleBytestreamMedia.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleBytestreamMedia(od as api.GoogleBytestreamMedia);
     });
   });
@@ -9879,8 +10090,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildHouseholdIncomeAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.HouseholdIncomeAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkHouseholdIncomeAssignedTargetingOptionDetails(
           od as api.HouseholdIncomeAssignedTargetingOptionDetails);
     });
@@ -9889,7 +10101,9 @@
   unittest.group('obj-schema-HouseholdIncomeTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHouseholdIncomeTargetingOptionDetails();
-      var od = api.HouseholdIncomeTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HouseholdIncomeTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHouseholdIncomeTargetingOptionDetails(
           od as api.HouseholdIncomeTargetingOptionDetails);
     });
@@ -9898,7 +10112,9 @@
   unittest.group('obj-schema-IdFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdFilter();
-      var od = api.IdFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IdFilter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIdFilter(od as api.IdFilter);
     });
   });
@@ -9906,7 +10122,9 @@
   unittest.group('obj-schema-InsertionOrder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertionOrder();
-      var od = api.InsertionOrder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertionOrder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertionOrder(od as api.InsertionOrder);
     });
   });
@@ -9914,7 +10132,9 @@
   unittest.group('obj-schema-InsertionOrderBudget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertionOrderBudget();
-      var od = api.InsertionOrderBudget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertionOrderBudget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertionOrderBudget(od as api.InsertionOrderBudget);
     });
   });
@@ -9922,7 +10142,9 @@
   unittest.group('obj-schema-InsertionOrderBudgetSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertionOrderBudgetSegment();
-      var od = api.InsertionOrderBudgetSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertionOrderBudgetSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertionOrderBudgetSegment(od as api.InsertionOrderBudgetSegment);
     });
   });
@@ -9930,7 +10152,9 @@
   unittest.group('obj-schema-IntegralAdScience', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntegralAdScience();
-      var od = api.IntegralAdScience.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntegralAdScience.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntegralAdScience(od as api.IntegralAdScience);
     });
   });
@@ -9938,7 +10162,9 @@
   unittest.group('obj-schema-IntegrationDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntegrationDetails();
-      var od = api.IntegrationDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntegrationDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntegrationDetails(od as api.IntegrationDetails);
     });
   });
@@ -9946,7 +10172,9 @@
   unittest.group('obj-schema-InventorySource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventorySource();
-      var od = api.InventorySource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventorySource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventorySource(od as api.InventorySource);
     });
   });
@@ -9955,8 +10183,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventorySourceAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InventorySourceAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventorySourceAssignedTargetingOptionDetails(
           od as api.InventorySourceAssignedTargetingOptionDetails);
     });
@@ -9965,7 +10194,9 @@
   unittest.group('obj-schema-InventorySourceDisplayCreativeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventorySourceDisplayCreativeConfig();
-      var od = api.InventorySourceDisplayCreativeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventorySourceDisplayCreativeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventorySourceDisplayCreativeConfig(
           od as api.InventorySourceDisplayCreativeConfig);
     });
@@ -9974,7 +10205,9 @@
   unittest.group('obj-schema-InventorySourceFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventorySourceFilter();
-      var od = api.InventorySourceFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventorySourceFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventorySourceFilter(od as api.InventorySourceFilter);
     });
   });
@@ -9982,7 +10215,9 @@
   unittest.group('obj-schema-InventorySourceGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventorySourceGroup();
-      var od = api.InventorySourceGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventorySourceGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventorySourceGroup(od as api.InventorySourceGroup);
     });
   });
@@ -9991,8 +10226,9 @@
       'obj-schema-InventorySourceGroupAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventorySourceGroupAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InventorySourceGroupAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventorySourceGroupAssignedTargetingOptionDetails(
           od as api.InventorySourceGroupAssignedTargetingOptionDetails);
     });
@@ -10001,7 +10237,9 @@
   unittest.group('obj-schema-InventorySourceStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventorySourceStatus();
-      var od = api.InventorySourceStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventorySourceStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventorySourceStatus(od as api.InventorySourceStatus);
     });
   });
@@ -10009,7 +10247,9 @@
   unittest.group('obj-schema-InventorySourceVideoCreativeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventorySourceVideoCreativeConfig();
-      var od = api.InventorySourceVideoCreativeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventorySourceVideoCreativeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventorySourceVideoCreativeConfig(
           od as api.InventorySourceVideoCreativeConfig);
     });
@@ -10018,7 +10258,9 @@
   unittest.group('obj-schema-KeywordAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeywordAssignedTargetingOptionDetails();
-      var od = api.KeywordAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeywordAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKeywordAssignedTargetingOptionDetails(
           od as api.KeywordAssignedTargetingOptionDetails);
     });
@@ -10027,7 +10269,9 @@
   unittest.group('obj-schema-LanguageAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLanguageAssignedTargetingOptionDetails();
-      var od = api.LanguageAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LanguageAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLanguageAssignedTargetingOptionDetails(
           od as api.LanguageAssignedTargetingOptionDetails);
     });
@@ -10036,7 +10280,9 @@
   unittest.group('obj-schema-LanguageTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLanguageTargetingOptionDetails();
-      var od = api.LanguageTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LanguageTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLanguageTargetingOptionDetails(
           od as api.LanguageTargetingOptionDetails);
     });
@@ -10045,7 +10291,9 @@
   unittest.group('obj-schema-LineItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLineItem();
-      var od = api.LineItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LineItem.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLineItem(od as api.LineItem);
     });
   });
@@ -10053,7 +10301,9 @@
   unittest.group('obj-schema-LineItemBudget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLineItemBudget();
-      var od = api.LineItemBudget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LineItemBudget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLineItemBudget(od as api.LineItemBudget);
     });
   });
@@ -10061,7 +10311,9 @@
   unittest.group('obj-schema-LineItemFlight', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLineItemFlight();
-      var od = api.LineItemFlight.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LineItemFlight.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLineItemFlight(od as api.LineItemFlight);
     });
   });
@@ -10070,8 +10322,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAdvertiserAssignedTargetingOptionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ListAdvertiserAssignedTargetingOptionsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAdvertiserAssignedTargetingOptionsResponse(
           od as api.ListAdvertiserAssignedTargetingOptionsResponse);
     });
@@ -10080,7 +10333,9 @@
   unittest.group('obj-schema-ListAdvertisersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAdvertisersResponse();
-      var od = api.ListAdvertisersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAdvertisersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAdvertisersResponse(od as api.ListAdvertisersResponse);
     });
   });
@@ -10088,7 +10343,9 @@
   unittest.group('obj-schema-ListAssignedInventorySourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAssignedInventorySourcesResponse();
-      var od = api.ListAssignedInventorySourcesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAssignedInventorySourcesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAssignedInventorySourcesResponse(
           od as api.ListAssignedInventorySourcesResponse);
     });
@@ -10097,7 +10354,9 @@
   unittest.group('obj-schema-ListAssignedLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAssignedLocationsResponse();
-      var od = api.ListAssignedLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAssignedLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAssignedLocationsResponse(
           od as api.ListAssignedLocationsResponse);
     });
@@ -10106,7 +10365,9 @@
   unittest.group('obj-schema-ListCampaignsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCampaignsResponse();
-      var od = api.ListCampaignsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCampaignsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCampaignsResponse(od as api.ListCampaignsResponse);
     });
   });
@@ -10114,7 +10375,9 @@
   unittest.group('obj-schema-ListChannelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListChannelsResponse();
-      var od = api.ListChannelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListChannelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListChannelsResponse(od as api.ListChannelsResponse);
     });
   });
@@ -10122,7 +10385,9 @@
   unittest.group('obj-schema-ListCombinedAudiencesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCombinedAudiencesResponse();
-      var od = api.ListCombinedAudiencesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCombinedAudiencesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCombinedAudiencesResponse(
           od as api.ListCombinedAudiencesResponse);
     });
@@ -10131,7 +10396,9 @@
   unittest.group('obj-schema-ListCreativesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCreativesResponse();
-      var od = api.ListCreativesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCreativesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCreativesResponse(od as api.ListCreativesResponse);
     });
   });
@@ -10139,7 +10406,9 @@
   unittest.group('obj-schema-ListCustomBiddingAlgorithmsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCustomBiddingAlgorithmsResponse();
-      var od = api.ListCustomBiddingAlgorithmsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCustomBiddingAlgorithmsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCustomBiddingAlgorithmsResponse(
           od as api.ListCustomBiddingAlgorithmsResponse);
     });
@@ -10148,7 +10417,9 @@
   unittest.group('obj-schema-ListCustomListsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCustomListsResponse();
-      var od = api.ListCustomListsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCustomListsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCustomListsResponse(od as api.ListCustomListsResponse);
     });
   });
@@ -10156,7 +10427,9 @@
   unittest.group('obj-schema-ListFirstAndThirdPartyAudiencesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFirstAndThirdPartyAudiencesResponse();
-      var od = api.ListFirstAndThirdPartyAudiencesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFirstAndThirdPartyAudiencesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFirstAndThirdPartyAudiencesResponse(
           od as api.ListFirstAndThirdPartyAudiencesResponse);
     });
@@ -10165,7 +10438,9 @@
   unittest.group('obj-schema-ListGoogleAudiencesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGoogleAudiencesResponse();
-      var od = api.ListGoogleAudiencesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGoogleAudiencesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGoogleAudiencesResponse(od as api.ListGoogleAudiencesResponse);
     });
   });
@@ -10174,8 +10449,9 @@
       'obj-schema-ListInsertionOrderAssignedTargetingOptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInsertionOrderAssignedTargetingOptionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ListInsertionOrderAssignedTargetingOptionsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInsertionOrderAssignedTargetingOptionsResponse(
           od as api.ListInsertionOrderAssignedTargetingOptionsResponse);
     });
@@ -10184,7 +10460,9 @@
   unittest.group('obj-schema-ListInsertionOrdersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInsertionOrdersResponse();
-      var od = api.ListInsertionOrdersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInsertionOrdersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInsertionOrdersResponse(od as api.ListInsertionOrdersResponse);
     });
   });
@@ -10192,7 +10470,9 @@
   unittest.group('obj-schema-ListInventorySourceGroupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInventorySourceGroupsResponse();
-      var od = api.ListInventorySourceGroupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInventorySourceGroupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInventorySourceGroupsResponse(
           od as api.ListInventorySourceGroupsResponse);
     });
@@ -10201,7 +10481,9 @@
   unittest.group('obj-schema-ListInventorySourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInventorySourcesResponse();
-      var od = api.ListInventorySourcesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInventorySourcesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInventorySourcesResponse(od as api.ListInventorySourcesResponse);
     });
   });
@@ -10209,8 +10491,9 @@
   unittest.group('obj-schema-ListLineItemAssignedTargetingOptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLineItemAssignedTargetingOptionsResponse();
-      var od =
-          api.ListLineItemAssignedTargetingOptionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLineItemAssignedTargetingOptionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLineItemAssignedTargetingOptionsResponse(
           od as api.ListLineItemAssignedTargetingOptionsResponse);
     });
@@ -10219,7 +10502,9 @@
   unittest.group('obj-schema-ListLineItemsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLineItemsResponse();
-      var od = api.ListLineItemsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLineItemsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLineItemsResponse(od as api.ListLineItemsResponse);
     });
   });
@@ -10227,7 +10512,9 @@
   unittest.group('obj-schema-ListLocationListsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationListsResponse();
-      var od = api.ListLocationListsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationListsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationListsResponse(od as api.ListLocationListsResponse);
     });
   });
@@ -10235,7 +10522,9 @@
   unittest.group('obj-schema-ListManualTriggersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListManualTriggersResponse();
-      var od = api.ListManualTriggersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListManualTriggersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListManualTriggersResponse(od as api.ListManualTriggersResponse);
     });
   });
@@ -10243,7 +10532,9 @@
   unittest.group('obj-schema-ListNegativeKeywordListsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNegativeKeywordListsResponse();
-      var od = api.ListNegativeKeywordListsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNegativeKeywordListsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNegativeKeywordListsResponse(
           od as api.ListNegativeKeywordListsResponse);
     });
@@ -10252,7 +10543,9 @@
   unittest.group('obj-schema-ListNegativeKeywordsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNegativeKeywordsResponse();
-      var od = api.ListNegativeKeywordsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNegativeKeywordsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNegativeKeywordsResponse(od as api.ListNegativeKeywordsResponse);
     });
   });
@@ -10260,8 +10553,9 @@
   unittest.group('obj-schema-ListPartnerAssignedTargetingOptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPartnerAssignedTargetingOptionsResponse();
-      var od =
-          api.ListPartnerAssignedTargetingOptionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPartnerAssignedTargetingOptionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPartnerAssignedTargetingOptionsResponse(
           od as api.ListPartnerAssignedTargetingOptionsResponse);
     });
@@ -10270,7 +10564,9 @@
   unittest.group('obj-schema-ListPartnersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPartnersResponse();
-      var od = api.ListPartnersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPartnersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPartnersResponse(od as api.ListPartnersResponse);
     });
   });
@@ -10278,7 +10574,9 @@
   unittest.group('obj-schema-ListSitesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSitesResponse();
-      var od = api.ListSitesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSitesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSitesResponse(od as api.ListSitesResponse);
     });
   });
@@ -10286,7 +10584,9 @@
   unittest.group('obj-schema-ListTargetingOptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTargetingOptionsResponse();
-      var od = api.ListTargetingOptionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTargetingOptionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTargetingOptionsResponse(od as api.ListTargetingOptionsResponse);
     });
   });
@@ -10294,7 +10594,9 @@
   unittest.group('obj-schema-ListUsersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListUsersResponse();
-      var od = api.ListUsersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListUsersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListUsersResponse(od as api.ListUsersResponse);
     });
   });
@@ -10302,7 +10604,9 @@
   unittest.group('obj-schema-LocationList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationList();
-      var od = api.LocationList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationList(od as api.LocationList);
     });
   });
@@ -10310,7 +10614,9 @@
   unittest.group('obj-schema-LookbackWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLookbackWindow();
-      var od = api.LookbackWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LookbackWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLookbackWindow(od as api.LookbackWindow);
     });
   });
@@ -10318,7 +10624,9 @@
   unittest.group('obj-schema-ManualTrigger', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManualTrigger();
-      var od = api.ManualTrigger.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManualTrigger.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManualTrigger(od as api.ManualTrigger);
     });
   });
@@ -10326,7 +10634,9 @@
   unittest.group('obj-schema-MaximizeSpendBidStrategy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaximizeSpendBidStrategy();
-      var od = api.MaximizeSpendBidStrategy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaximizeSpendBidStrategy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaximizeSpendBidStrategy(od as api.MaximizeSpendBidStrategy);
     });
   });
@@ -10334,7 +10644,9 @@
   unittest.group('obj-schema-MeasurementConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMeasurementConfig();
-      var od = api.MeasurementConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MeasurementConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMeasurementConfig(od as api.MeasurementConfig);
     });
   });
@@ -10342,7 +10654,9 @@
   unittest.group('obj-schema-MobileApp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileApp();
-      var od = api.MobileApp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MobileApp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMobileApp(od as api.MobileApp);
     });
   });
@@ -10350,7 +10664,8 @@
   unittest.group('obj-schema-Money', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoney();
-      var od = api.Money.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Money.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMoney(od as api.Money);
     });
   });
@@ -10358,7 +10673,9 @@
   unittest.group('obj-schema-NegativeKeyword', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNegativeKeyword();
-      var od = api.NegativeKeyword.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NegativeKeyword.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNegativeKeyword(od as api.NegativeKeyword);
     });
   });
@@ -10366,7 +10683,9 @@
   unittest.group('obj-schema-NegativeKeywordList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNegativeKeywordList();
-      var od = api.NegativeKeywordList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NegativeKeywordList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNegativeKeywordList(od as api.NegativeKeywordList);
     });
   });
@@ -10375,8 +10694,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildNegativeKeywordListAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.NegativeKeywordListAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkNegativeKeywordListAssignedTargetingOptionDetails(
           od as api.NegativeKeywordListAssignedTargetingOptionDetails);
     });
@@ -10385,7 +10705,9 @@
   unittest.group('obj-schema-ObaIcon', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObaIcon();
-      var od = api.ObaIcon.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ObaIcon.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkObaIcon(od as api.ObaIcon);
     });
   });
@@ -10394,8 +10716,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildOnScreenPositionAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.OnScreenPositionAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkOnScreenPositionAssignedTargetingOptionDetails(
           od as api.OnScreenPositionAssignedTargetingOptionDetails);
     });
@@ -10404,7 +10727,9 @@
   unittest.group('obj-schema-OnScreenPositionTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOnScreenPositionTargetingOptionDetails();
-      var od = api.OnScreenPositionTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OnScreenPositionTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOnScreenPositionTargetingOptionDetails(
           od as api.OnScreenPositionTargetingOptionDetails);
     });
@@ -10414,8 +10739,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperatingSystemAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.OperatingSystemAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperatingSystemAssignedTargetingOptionDetails(
           od as api.OperatingSystemAssignedTargetingOptionDetails);
     });
@@ -10424,7 +10750,9 @@
   unittest.group('obj-schema-OperatingSystemTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperatingSystemTargetingOptionDetails();
-      var od = api.OperatingSystemTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperatingSystemTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperatingSystemTargetingOptionDetails(
           od as api.OperatingSystemTargetingOptionDetails);
     });
@@ -10433,7 +10761,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -10441,7 +10771,9 @@
   unittest.group('obj-schema-Pacing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPacing();
-      var od = api.Pacing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Pacing.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPacing(od as api.Pacing);
     });
   });
@@ -10449,7 +10781,9 @@
   unittest.group('obj-schema-ParentEntityFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParentEntityFilter();
-      var od = api.ParentEntityFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParentEntityFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParentEntityFilter(od as api.ParentEntityFilter);
     });
   });
@@ -10457,8 +10791,9 @@
   unittest.group('obj-schema-ParentalStatusAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParentalStatusAssignedTargetingOptionDetails();
-      var od =
-          api.ParentalStatusAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParentalStatusAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParentalStatusAssignedTargetingOptionDetails(
           od as api.ParentalStatusAssignedTargetingOptionDetails);
     });
@@ -10467,7 +10802,9 @@
   unittest.group('obj-schema-ParentalStatusTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParentalStatusTargetingOptionDetails();
-      var od = api.ParentalStatusTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParentalStatusTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParentalStatusTargetingOptionDetails(
           od as api.ParentalStatusTargetingOptionDetails);
     });
@@ -10476,7 +10813,9 @@
   unittest.group('obj-schema-Partner', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartner();
-      var od = api.Partner.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Partner.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPartner(od as api.Partner);
     });
   });
@@ -10484,7 +10823,9 @@
   unittest.group('obj-schema-PartnerAdServerConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartnerAdServerConfig();
-      var od = api.PartnerAdServerConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartnerAdServerConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartnerAdServerConfig(od as api.PartnerAdServerConfig);
     });
   });
@@ -10492,7 +10833,9 @@
   unittest.group('obj-schema-PartnerCost', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartnerCost();
-      var od = api.PartnerCost.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartnerCost.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartnerCost(od as api.PartnerCost);
     });
   });
@@ -10500,7 +10843,9 @@
   unittest.group('obj-schema-PartnerDataAccessConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartnerDataAccessConfig();
-      var od = api.PartnerDataAccessConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartnerDataAccessConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartnerDataAccessConfig(od as api.PartnerDataAccessConfig);
     });
   });
@@ -10508,7 +10853,9 @@
   unittest.group('obj-schema-PartnerGeneralConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartnerGeneralConfig();
-      var od = api.PartnerGeneralConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartnerGeneralConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartnerGeneralConfig(od as api.PartnerGeneralConfig);
     });
   });
@@ -10516,7 +10863,9 @@
   unittest.group('obj-schema-PartnerRevenueModel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartnerRevenueModel();
-      var od = api.PartnerRevenueModel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartnerRevenueModel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartnerRevenueModel(od as api.PartnerRevenueModel);
     });
   });
@@ -10524,7 +10873,9 @@
   unittest.group('obj-schema-PerformanceGoal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerformanceGoal();
-      var od = api.PerformanceGoal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerformanceGoal.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerformanceGoal(od as api.PerformanceGoal);
     });
   });
@@ -10532,7 +10883,9 @@
   unittest.group('obj-schema-PerformanceGoalBidStrategy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerformanceGoalBidStrategy();
-      var od = api.PerformanceGoalBidStrategy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerformanceGoalBidStrategy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerformanceGoalBidStrategy(od as api.PerformanceGoalBidStrategy);
     });
   });
@@ -10541,8 +10894,9 @@
       'obj-schema-ProximityLocationListAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProximityLocationListAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ProximityLocationListAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkProximityLocationListAssignedTargetingOptionDetails(
           od as api.ProximityLocationListAssignedTargetingOptionDetails);
     });
@@ -10551,7 +10905,9 @@
   unittest.group('obj-schema-PublisherReviewStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublisherReviewStatus();
-      var od = api.PublisherReviewStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublisherReviewStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublisherReviewStatus(od as api.PublisherReviewStatus);
     });
   });
@@ -10559,7 +10915,9 @@
   unittest.group('obj-schema-RateDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRateDetails();
-      var od = api.RateDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RateDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRateDetails(od as api.RateDetails);
     });
   });
@@ -10568,8 +10926,9 @@
       'obj-schema-RegionalLocationListAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionalLocationListAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.RegionalLocationListAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionalLocationListAssignedTargetingOptionDetails(
           od as api.RegionalLocationListAssignedTargetingOptionDetails);
     });
@@ -10578,7 +10937,9 @@
   unittest.group('obj-schema-ReviewStatusInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReviewStatusInfo();
-      var od = api.ReviewStatusInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReviewStatusInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReviewStatusInfo(od as api.ReviewStatusInfo);
     });
   });
@@ -10586,7 +10947,9 @@
   unittest.group('obj-schema-SdfConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSdfConfig();
-      var od = api.SdfConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SdfConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSdfConfig(od as api.SdfConfig);
     });
   });
@@ -10594,7 +10957,9 @@
   unittest.group('obj-schema-SdfDownloadTask', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSdfDownloadTask();
-      var od = api.SdfDownloadTask.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SdfDownloadTask.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSdfDownloadTask(od as api.SdfDownloadTask);
     });
   });
@@ -10602,7 +10967,9 @@
   unittest.group('obj-schema-SdfDownloadTaskMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSdfDownloadTaskMetadata();
-      var od = api.SdfDownloadTaskMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SdfDownloadTaskMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSdfDownloadTaskMetadata(od as api.SdfDownloadTaskMetadata);
     });
   });
@@ -10610,7 +10977,9 @@
   unittest.group('obj-schema-SearchTargetingOptionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchTargetingOptionsRequest();
-      var od = api.SearchTargetingOptionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchTargetingOptionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchTargetingOptionsRequest(
           od as api.SearchTargetingOptionsRequest);
     });
@@ -10619,7 +10988,9 @@
   unittest.group('obj-schema-SearchTargetingOptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchTargetingOptionsResponse();
-      var od = api.SearchTargetingOptionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchTargetingOptionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchTargetingOptionsResponse(
           od as api.SearchTargetingOptionsResponse);
     });
@@ -10629,8 +11000,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildSensitiveCategoryAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.SensitiveCategoryAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkSensitiveCategoryAssignedTargetingOptionDetails(
           od as api.SensitiveCategoryAssignedTargetingOptionDetails);
     });
@@ -10639,7 +11011,9 @@
   unittest.group('obj-schema-SensitiveCategoryTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSensitiveCategoryTargetingOptionDetails();
-      var od = api.SensitiveCategoryTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SensitiveCategoryTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSensitiveCategoryTargetingOptionDetails(
           od as api.SensitiveCategoryTargetingOptionDetails);
     });
@@ -10648,7 +11022,8 @@
   unittest.group('obj-schema-Site', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSite();
-      var od = api.Site.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Site.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSite(od as api.Site);
     });
   });
@@ -10656,7 +11031,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -10664,8 +11041,9 @@
   unittest.group('obj-schema-SubExchangeAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubExchangeAssignedTargetingOptionDetails();
-      var od =
-          api.SubExchangeAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubExchangeAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubExchangeAssignedTargetingOptionDetails(
           od as api.SubExchangeAssignedTargetingOptionDetails);
     });
@@ -10674,7 +11052,9 @@
   unittest.group('obj-schema-SubExchangeTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubExchangeTargetingOptionDetails();
-      var od = api.SubExchangeTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubExchangeTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubExchangeTargetingOptionDetails(
           od as api.SubExchangeTargetingOptionDetails);
     });
@@ -10683,7 +11063,9 @@
   unittest.group('obj-schema-TargetingExpansionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingExpansionConfig();
-      var od = api.TargetingExpansionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingExpansionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingExpansionConfig(od as api.TargetingExpansionConfig);
     });
   });
@@ -10691,7 +11073,9 @@
   unittest.group('obj-schema-TargetingOption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingOption();
-      var od = api.TargetingOption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingOption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingOption(od as api.TargetingOption);
     });
   });
@@ -10699,7 +11083,9 @@
   unittest.group('obj-schema-ThirdPartyOnlyConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThirdPartyOnlyConfig();
-      var od = api.ThirdPartyOnlyConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThirdPartyOnlyConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThirdPartyOnlyConfig(od as api.ThirdPartyOnlyConfig);
     });
   });
@@ -10707,7 +11093,9 @@
   unittest.group('obj-schema-ThirdPartyUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThirdPartyUrl();
-      var od = api.ThirdPartyUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThirdPartyUrl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThirdPartyUrl(od as api.ThirdPartyUrl);
     });
   });
@@ -10716,8 +11104,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildThirdPartyVerifierAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ThirdPartyVerifierAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkThirdPartyVerifierAssignedTargetingOptionDetails(
           od as api.ThirdPartyVerifierAssignedTargetingOptionDetails);
     });
@@ -10726,7 +11115,9 @@
   unittest.group('obj-schema-TimeRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeRange();
-      var od = api.TimeRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeRange(od as api.TimeRange);
     });
   });
@@ -10734,7 +11125,9 @@
   unittest.group('obj-schema-TimerEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimerEvent();
-      var od = api.TimerEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimerEvent.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimerEvent(od as api.TimerEvent);
     });
   });
@@ -10742,7 +11135,9 @@
   unittest.group('obj-schema-TrackingFloodlightActivityConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrackingFloodlightActivityConfig();
-      var od = api.TrackingFloodlightActivityConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrackingFloodlightActivityConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrackingFloodlightActivityConfig(
           od as api.TrackingFloodlightActivityConfig);
     });
@@ -10751,7 +11146,9 @@
   unittest.group('obj-schema-Transcode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTranscode();
-      var od = api.Transcode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Transcode.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTranscode(od as api.Transcode);
     });
   });
@@ -10759,7 +11156,9 @@
   unittest.group('obj-schema-UniversalAdId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUniversalAdId();
-      var od = api.UniversalAdId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UniversalAdId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUniversalAdId(od as api.UniversalAdId);
     });
   });
@@ -10767,7 +11166,9 @@
   unittest.group('obj-schema-UrlAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlAssignedTargetingOptionDetails();
-      var od = api.UrlAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlAssignedTargetingOptionDetails(
           od as api.UrlAssignedTargetingOptionDetails);
     });
@@ -10776,7 +11177,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
@@ -10785,8 +11187,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserRewardedContentAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.UserRewardedContentAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserRewardedContentAssignedTargetingOptionDetails(
           od as api.UserRewardedContentAssignedTargetingOptionDetails);
     });
@@ -10795,8 +11198,9 @@
   unittest.group('obj-schema-UserRewardedContentTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserRewardedContentTargetingOptionDetails();
-      var od =
-          api.UserRewardedContentTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserRewardedContentTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserRewardedContentTargetingOptionDetails(
           od as api.UserRewardedContentTargetingOptionDetails);
     });
@@ -10806,8 +11210,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoPlayerSizeAssignedTargetingOptionDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.VideoPlayerSizeAssignedTargetingOptionDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoPlayerSizeAssignedTargetingOptionDetails(
           od as api.VideoPlayerSizeAssignedTargetingOptionDetails);
     });
@@ -10816,7 +11221,9 @@
   unittest.group('obj-schema-VideoPlayerSizeTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoPlayerSizeTargetingOptionDetails();
-      var od = api.VideoPlayerSizeTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoPlayerSizeTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoPlayerSizeTargetingOptionDetails(
           od as api.VideoPlayerSizeTargetingOptionDetails);
     });
@@ -10825,8 +11232,9 @@
   unittest.group('obj-schema-ViewabilityAssignedTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildViewabilityAssignedTargetingOptionDetails();
-      var od =
-          api.ViewabilityAssignedTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ViewabilityAssignedTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkViewabilityAssignedTargetingOptionDetails(
           od as api.ViewabilityAssignedTargetingOptionDetails);
     });
@@ -10835,7 +11243,9 @@
   unittest.group('obj-schema-ViewabilityTargetingOptionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildViewabilityTargetingOptionDetails();
-      var od = api.ViewabilityTargetingOptionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ViewabilityTargetingOptionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkViewabilityTargetingOptionDetails(
           od as api.ViewabilityTargetingOptionDetails);
     });
diff --git a/generated/googleapis/test/dlp/v2_test.dart b/generated/googleapis/test/dlp/v2_test.dart
index bfcfcac..afe6b1d 100644
--- a/generated/googleapis/test/dlp/v2_test.dart
+++ b/generated/googleapis/test/dlp/v2_test.dart
@@ -6707,7 +6707,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Action', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Action();
-      var od = api.GooglePrivacyDlpV2Action.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Action.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Action(od as api.GooglePrivacyDlpV2Action);
     });
   });
@@ -6715,8 +6717,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ActivateJobTriggerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ActivateJobTriggerRequest();
-      var od =
-          api.GooglePrivacyDlpV2ActivateJobTriggerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ActivateJobTriggerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ActivateJobTriggerRequest(
           od as api.GooglePrivacyDlpV2ActivateJobTriggerRequest);
     });
@@ -6726,8 +6729,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2AnalyzeDataSourceRiskDetails();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2AnalyzeDataSourceRiskDetails.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2AnalyzeDataSourceRiskDetails(
           od as api.GooglePrivacyDlpV2AnalyzeDataSourceRiskDetails);
     });
@@ -6736,7 +6740,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2AuxiliaryTable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2AuxiliaryTable();
-      var od = api.GooglePrivacyDlpV2AuxiliaryTable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2AuxiliaryTable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2AuxiliaryTable(
           od as api.GooglePrivacyDlpV2AuxiliaryTable);
     });
@@ -6745,7 +6751,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2BigQueryField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2BigQueryField();
-      var od = api.GooglePrivacyDlpV2BigQueryField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2BigQueryField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2BigQueryField(
           od as api.GooglePrivacyDlpV2BigQueryField);
     });
@@ -6754,7 +6762,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2BigQueryKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2BigQueryKey();
-      var od = api.GooglePrivacyDlpV2BigQueryKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2BigQueryKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2BigQueryKey(
           od as api.GooglePrivacyDlpV2BigQueryKey);
     });
@@ -6763,7 +6773,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2BigQueryOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2BigQueryOptions();
-      var od = api.GooglePrivacyDlpV2BigQueryOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2BigQueryOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2BigQueryOptions(
           od as api.GooglePrivacyDlpV2BigQueryOptions);
     });
@@ -6772,7 +6784,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2BigQueryTable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2BigQueryTable();
-      var od = api.GooglePrivacyDlpV2BigQueryTable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2BigQueryTable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2BigQueryTable(
           od as api.GooglePrivacyDlpV2BigQueryTable);
     });
@@ -6781,7 +6795,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2BoundingBox', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2BoundingBox();
-      var od = api.GooglePrivacyDlpV2BoundingBox.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2BoundingBox.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2BoundingBox(
           od as api.GooglePrivacyDlpV2BoundingBox);
     });
@@ -6790,7 +6806,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Bucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Bucket();
-      var od = api.GooglePrivacyDlpV2Bucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Bucket.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Bucket(od as api.GooglePrivacyDlpV2Bucket);
     });
   });
@@ -6798,7 +6816,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2BucketingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2BucketingConfig();
-      var od = api.GooglePrivacyDlpV2BucketingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2BucketingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2BucketingConfig(
           od as api.GooglePrivacyDlpV2BucketingConfig);
     });
@@ -6807,7 +6827,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ByteContentItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ByteContentItem();
-      var od = api.GooglePrivacyDlpV2ByteContentItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ByteContentItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ByteContentItem(
           od as api.GooglePrivacyDlpV2ByteContentItem);
     });
@@ -6816,7 +6838,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CancelDlpJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CancelDlpJobRequest();
-      var od = api.GooglePrivacyDlpV2CancelDlpJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CancelDlpJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CancelDlpJobRequest(
           od as api.GooglePrivacyDlpV2CancelDlpJobRequest);
     });
@@ -6825,8 +6849,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CategoricalStatsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CategoricalStatsConfig();
-      var od =
-          api.GooglePrivacyDlpV2CategoricalStatsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CategoricalStatsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CategoricalStatsConfig(
           od as api.GooglePrivacyDlpV2CategoricalStatsConfig);
     });
@@ -6836,8 +6861,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CategoricalStatsHistogramBucket();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2CategoricalStatsHistogramBucket.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CategoricalStatsHistogramBucket(
           od as api.GooglePrivacyDlpV2CategoricalStatsHistogramBucket);
     });
@@ -6846,8 +6872,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CategoricalStatsResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CategoricalStatsResult();
-      var od =
-          api.GooglePrivacyDlpV2CategoricalStatsResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CategoricalStatsResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CategoricalStatsResult(
           od as api.GooglePrivacyDlpV2CategoricalStatsResult);
     });
@@ -6856,7 +6883,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CharacterMaskConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CharacterMaskConfig();
-      var od = api.GooglePrivacyDlpV2CharacterMaskConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CharacterMaskConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CharacterMaskConfig(
           od as api.GooglePrivacyDlpV2CharacterMaskConfig);
     });
@@ -6865,7 +6894,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CharsToIgnore', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CharsToIgnore();
-      var od = api.GooglePrivacyDlpV2CharsToIgnore.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CharsToIgnore.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CharsToIgnore(
           od as api.GooglePrivacyDlpV2CharsToIgnore);
     });
@@ -6874,7 +6905,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CloudStorageFileSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CloudStorageFileSet();
-      var od = api.GooglePrivacyDlpV2CloudStorageFileSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CloudStorageFileSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CloudStorageFileSet(
           od as api.GooglePrivacyDlpV2CloudStorageFileSet);
     });
@@ -6883,7 +6916,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CloudStorageOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CloudStorageOptions();
-      var od = api.GooglePrivacyDlpV2CloudStorageOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CloudStorageOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CloudStorageOptions(
           od as api.GooglePrivacyDlpV2CloudStorageOptions);
     });
@@ -6892,7 +6927,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CloudStoragePath', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CloudStoragePath();
-      var od = api.GooglePrivacyDlpV2CloudStoragePath.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CloudStoragePath.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CloudStoragePath(
           od as api.GooglePrivacyDlpV2CloudStoragePath);
     });
@@ -6901,8 +6938,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CloudStorageRegexFileSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CloudStorageRegexFileSet();
-      var od =
-          api.GooglePrivacyDlpV2CloudStorageRegexFileSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CloudStorageRegexFileSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CloudStorageRegexFileSet(
           od as api.GooglePrivacyDlpV2CloudStorageRegexFileSet);
     });
@@ -6911,7 +6949,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Color', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Color();
-      var od = api.GooglePrivacyDlpV2Color.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Color.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Color(od as api.GooglePrivacyDlpV2Color);
     });
   });
@@ -6919,7 +6959,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Condition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Condition();
-      var od = api.GooglePrivacyDlpV2Condition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Condition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Condition(od as api.GooglePrivacyDlpV2Condition);
     });
   });
@@ -6927,7 +6969,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Conditions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Conditions();
-      var od = api.GooglePrivacyDlpV2Conditions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Conditions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Conditions(od as api.GooglePrivacyDlpV2Conditions);
     });
   });
@@ -6935,7 +6979,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Container', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Container();
-      var od = api.GooglePrivacyDlpV2Container.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Container.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Container(od as api.GooglePrivacyDlpV2Container);
     });
   });
@@ -6943,7 +6989,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ContentItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ContentItem();
-      var od = api.GooglePrivacyDlpV2ContentItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ContentItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ContentItem(
           od as api.GooglePrivacyDlpV2ContentItem);
     });
@@ -6952,7 +7000,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ContentLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ContentLocation();
-      var od = api.GooglePrivacyDlpV2ContentLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ContentLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ContentLocation(
           od as api.GooglePrivacyDlpV2ContentLocation);
     });
@@ -6962,8 +7012,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CreateDeidentifyTemplateRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(
           od as api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest);
     });
@@ -6972,7 +7023,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CreateDlpJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CreateDlpJobRequest();
-      var od = api.GooglePrivacyDlpV2CreateDlpJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CreateDlpJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CreateDlpJobRequest(
           od as api.GooglePrivacyDlpV2CreateDlpJobRequest);
     });
@@ -6982,8 +7035,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CreateInspectTemplateRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CreateInspectTemplateRequest(
           od as api.GooglePrivacyDlpV2CreateInspectTemplateRequest);
     });
@@ -6992,8 +7046,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CreateJobTriggerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CreateJobTriggerRequest();
-      var od =
-          api.GooglePrivacyDlpV2CreateJobTriggerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CreateJobTriggerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CreateJobTriggerRequest(
           od as api.GooglePrivacyDlpV2CreateJobTriggerRequest);
     });
@@ -7003,8 +7058,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CreateStoredInfoTypeRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(
           od as api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest);
     });
@@ -7013,8 +7069,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CryptoDeterministicConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CryptoDeterministicConfig();
-      var od =
-          api.GooglePrivacyDlpV2CryptoDeterministicConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CryptoDeterministicConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CryptoDeterministicConfig(
           od as api.GooglePrivacyDlpV2CryptoDeterministicConfig);
     });
@@ -7023,7 +7080,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CryptoHashConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CryptoHashConfig();
-      var od = api.GooglePrivacyDlpV2CryptoHashConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CryptoHashConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CryptoHashConfig(
           od as api.GooglePrivacyDlpV2CryptoHashConfig);
     });
@@ -7032,7 +7091,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CryptoKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CryptoKey();
-      var od = api.GooglePrivacyDlpV2CryptoKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CryptoKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CryptoKey(od as api.GooglePrivacyDlpV2CryptoKey);
     });
   });
@@ -7040,8 +7101,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CryptoReplaceFfxFpeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CryptoReplaceFfxFpeConfig();
-      var od =
-          api.GooglePrivacyDlpV2CryptoReplaceFfxFpeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CryptoReplaceFfxFpeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CryptoReplaceFfxFpeConfig(
           od as api.GooglePrivacyDlpV2CryptoReplaceFfxFpeConfig);
     });
@@ -7050,7 +7112,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2CustomInfoType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2CustomInfoType();
-      var od = api.GooglePrivacyDlpV2CustomInfoType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2CustomInfoType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2CustomInfoType(
           od as api.GooglePrivacyDlpV2CustomInfoType);
     });
@@ -7059,7 +7123,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DatastoreKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DatastoreKey();
-      var od = api.GooglePrivacyDlpV2DatastoreKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DatastoreKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DatastoreKey(
           od as api.GooglePrivacyDlpV2DatastoreKey);
     });
@@ -7068,7 +7134,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DatastoreOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DatastoreOptions();
-      var od = api.GooglePrivacyDlpV2DatastoreOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DatastoreOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DatastoreOptions(
           od as api.GooglePrivacyDlpV2DatastoreOptions);
     });
@@ -7077,7 +7145,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DateShiftConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DateShiftConfig();
-      var od = api.GooglePrivacyDlpV2DateShiftConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DateShiftConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DateShiftConfig(
           od as api.GooglePrivacyDlpV2DateShiftConfig);
     });
@@ -7086,7 +7156,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DateTime', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DateTime();
-      var od = api.GooglePrivacyDlpV2DateTime.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DateTime.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DateTime(od as api.GooglePrivacyDlpV2DateTime);
     });
   });
@@ -7094,7 +7166,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DeidentifyConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DeidentifyConfig();
-      var od = api.GooglePrivacyDlpV2DeidentifyConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DeidentifyConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DeidentifyConfig(
           od as api.GooglePrivacyDlpV2DeidentifyConfig);
     });
@@ -7103,8 +7177,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DeidentifyContentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DeidentifyContentRequest();
-      var od =
-          api.GooglePrivacyDlpV2DeidentifyContentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DeidentifyContentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DeidentifyContentRequest(
           od as api.GooglePrivacyDlpV2DeidentifyContentRequest);
     });
@@ -7113,8 +7188,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DeidentifyContentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DeidentifyContentResponse();
-      var od =
-          api.GooglePrivacyDlpV2DeidentifyContentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DeidentifyContentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DeidentifyContentResponse(
           od as api.GooglePrivacyDlpV2DeidentifyContentResponse);
     });
@@ -7123,7 +7199,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DeidentifyTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DeidentifyTemplate();
-      var od = api.GooglePrivacyDlpV2DeidentifyTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DeidentifyTemplate(
           od as api.GooglePrivacyDlpV2DeidentifyTemplate);
     });
@@ -7133,8 +7211,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DeltaPresenceEstimationConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2DeltaPresenceEstimationConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DeltaPresenceEstimationConfig(
           od as api.GooglePrivacyDlpV2DeltaPresenceEstimationConfig);
     });
@@ -7145,9 +7224,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket(
           od as api.GooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket);
     });
@@ -7157,9 +7237,10 @@
       'obj-schema-GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues(
           od as api.GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues);
     });
@@ -7169,8 +7250,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DeltaPresenceEstimationResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2DeltaPresenceEstimationResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DeltaPresenceEstimationResult(
           od as api.GooglePrivacyDlpV2DeltaPresenceEstimationResult);
     });
@@ -7179,7 +7261,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DetectionRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DetectionRule();
-      var od = api.GooglePrivacyDlpV2DetectionRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DetectionRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DetectionRule(
           od as api.GooglePrivacyDlpV2DetectionRule);
     });
@@ -7188,7 +7272,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Dictionary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Dictionary();
-      var od = api.GooglePrivacyDlpV2Dictionary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Dictionary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Dictionary(od as api.GooglePrivacyDlpV2Dictionary);
     });
   });
@@ -7196,7 +7282,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DlpJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DlpJob();
-      var od = api.GooglePrivacyDlpV2DlpJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DlpJob.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DlpJob(od as api.GooglePrivacyDlpV2DlpJob);
     });
   });
@@ -7204,7 +7292,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2DocumentLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2DocumentLocation();
-      var od = api.GooglePrivacyDlpV2DocumentLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2DocumentLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2DocumentLocation(
           od as api.GooglePrivacyDlpV2DocumentLocation);
     });
@@ -7213,7 +7303,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2EntityId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2EntityId();
-      var od = api.GooglePrivacyDlpV2EntityId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2EntityId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2EntityId(od as api.GooglePrivacyDlpV2EntityId);
     });
   });
@@ -7221,7 +7313,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Error', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Error();
-      var od = api.GooglePrivacyDlpV2Error.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Error.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Error(od as api.GooglePrivacyDlpV2Error);
     });
   });
@@ -7229,7 +7323,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ExcludeInfoTypes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ExcludeInfoTypes();
-      var od = api.GooglePrivacyDlpV2ExcludeInfoTypes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ExcludeInfoTypes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ExcludeInfoTypes(
           od as api.GooglePrivacyDlpV2ExcludeInfoTypes);
     });
@@ -7238,7 +7334,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ExclusionRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ExclusionRule();
-      var od = api.GooglePrivacyDlpV2ExclusionRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ExclusionRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ExclusionRule(
           od as api.GooglePrivacyDlpV2ExclusionRule);
     });
@@ -7247,7 +7345,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Expressions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Expressions();
-      var od = api.GooglePrivacyDlpV2Expressions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Expressions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Expressions(
           od as api.GooglePrivacyDlpV2Expressions);
     });
@@ -7256,7 +7356,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2FieldId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2FieldId();
-      var od = api.GooglePrivacyDlpV2FieldId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2FieldId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2FieldId(od as api.GooglePrivacyDlpV2FieldId);
     });
   });
@@ -7264,7 +7366,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2FieldTransformation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2FieldTransformation();
-      var od = api.GooglePrivacyDlpV2FieldTransformation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2FieldTransformation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2FieldTransformation(
           od as api.GooglePrivacyDlpV2FieldTransformation);
     });
@@ -7273,7 +7377,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2FileSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2FileSet();
-      var od = api.GooglePrivacyDlpV2FileSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2FileSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2FileSet(od as api.GooglePrivacyDlpV2FileSet);
     });
   });
@@ -7281,7 +7387,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Finding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Finding();
-      var od = api.GooglePrivacyDlpV2Finding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Finding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Finding(od as api.GooglePrivacyDlpV2Finding);
     });
   });
@@ -7289,7 +7397,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2FindingLimits', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2FindingLimits();
-      var od = api.GooglePrivacyDlpV2FindingLimits.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2FindingLimits.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2FindingLimits(
           od as api.GooglePrivacyDlpV2FindingLimits);
     });
@@ -7298,7 +7408,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2FinishDlpJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2FinishDlpJobRequest();
-      var od = api.GooglePrivacyDlpV2FinishDlpJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2FinishDlpJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2FinishDlpJobRequest(
           od as api.GooglePrivacyDlpV2FinishDlpJobRequest);
     });
@@ -7307,8 +7419,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2FixedSizeBucketingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2FixedSizeBucketingConfig();
-      var od =
-          api.GooglePrivacyDlpV2FixedSizeBucketingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2FixedSizeBucketingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2FixedSizeBucketingConfig(
           od as api.GooglePrivacyDlpV2FixedSizeBucketingConfig);
     });
@@ -7317,7 +7430,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2HotwordRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2HotwordRule();
-      var od = api.GooglePrivacyDlpV2HotwordRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2HotwordRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2HotwordRule(
           od as api.GooglePrivacyDlpV2HotwordRule);
     });
@@ -7326,7 +7441,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2HybridContentItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2HybridContentItem();
-      var od = api.GooglePrivacyDlpV2HybridContentItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2HybridContentItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2HybridContentItem(
           od as api.GooglePrivacyDlpV2HybridContentItem);
     });
@@ -7335,7 +7452,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2HybridFindingDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2HybridFindingDetails();
-      var od = api.GooglePrivacyDlpV2HybridFindingDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2HybridFindingDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2HybridFindingDetails(
           od as api.GooglePrivacyDlpV2HybridFindingDetails);
     });
@@ -7344,8 +7463,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2HybridInspectDlpJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2HybridInspectDlpJobRequest();
-      var od =
-          api.GooglePrivacyDlpV2HybridInspectDlpJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2HybridInspectDlpJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2HybridInspectDlpJobRequest(
           od as api.GooglePrivacyDlpV2HybridInspectDlpJobRequest);
     });
@@ -7355,8 +7475,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2HybridInspectJobTriggerRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2HybridInspectJobTriggerRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2HybridInspectJobTriggerRequest(
           od as api.GooglePrivacyDlpV2HybridInspectJobTriggerRequest);
     });
@@ -7365,7 +7486,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2HybridInspectResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2HybridInspectResponse();
-      var od = api.GooglePrivacyDlpV2HybridInspectResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2HybridInspectResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2HybridInspectResponse(
           od as api.GooglePrivacyDlpV2HybridInspectResponse);
     });
@@ -7374,8 +7497,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2HybridInspectStatistics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2HybridInspectStatistics();
-      var od =
-          api.GooglePrivacyDlpV2HybridInspectStatistics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2HybridInspectStatistics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2HybridInspectStatistics(
           od as api.GooglePrivacyDlpV2HybridInspectStatistics);
     });
@@ -7384,7 +7508,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2HybridOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2HybridOptions();
-      var od = api.GooglePrivacyDlpV2HybridOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2HybridOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2HybridOptions(
           od as api.GooglePrivacyDlpV2HybridOptions);
     });
@@ -7393,7 +7519,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ImageLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ImageLocation();
-      var od = api.GooglePrivacyDlpV2ImageLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ImageLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ImageLocation(
           od as api.GooglePrivacyDlpV2ImageLocation);
     });
@@ -7402,7 +7530,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ImageRedactionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ImageRedactionConfig();
-      var od = api.GooglePrivacyDlpV2ImageRedactionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ImageRedactionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ImageRedactionConfig(
           od as api.GooglePrivacyDlpV2ImageRedactionConfig);
     });
@@ -7411,7 +7541,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InfoType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InfoType();
-      var od = api.GooglePrivacyDlpV2InfoType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InfoType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InfoType(od as api.GooglePrivacyDlpV2InfoType);
     });
   });
@@ -7419,7 +7551,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InfoTypeDescription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InfoTypeDescription();
-      var od = api.GooglePrivacyDlpV2InfoTypeDescription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InfoTypeDescription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InfoTypeDescription(
           od as api.GooglePrivacyDlpV2InfoTypeDescription);
     });
@@ -7428,7 +7562,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InfoTypeLimit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InfoTypeLimit();
-      var od = api.GooglePrivacyDlpV2InfoTypeLimit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InfoTypeLimit.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InfoTypeLimit(
           od as api.GooglePrivacyDlpV2InfoTypeLimit);
     });
@@ -7437,7 +7573,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InfoTypeStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InfoTypeStats();
-      var od = api.GooglePrivacyDlpV2InfoTypeStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InfoTypeStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InfoTypeStats(
           od as api.GooglePrivacyDlpV2InfoTypeStats);
     });
@@ -7446,8 +7584,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InfoTypeTransformation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InfoTypeTransformation();
-      var od =
-          api.GooglePrivacyDlpV2InfoTypeTransformation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InfoTypeTransformation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InfoTypeTransformation(
           od as api.GooglePrivacyDlpV2InfoTypeTransformation);
     });
@@ -7456,8 +7595,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InfoTypeTransformations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InfoTypeTransformations();
-      var od =
-          api.GooglePrivacyDlpV2InfoTypeTransformations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InfoTypeTransformations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InfoTypeTransformations(
           od as api.GooglePrivacyDlpV2InfoTypeTransformations);
     });
@@ -7466,7 +7606,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InspectConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InspectConfig();
-      var od = api.GooglePrivacyDlpV2InspectConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InspectConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InspectConfig(
           od as api.GooglePrivacyDlpV2InspectConfig);
     });
@@ -7475,7 +7617,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InspectContentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InspectContentRequest();
-      var od = api.GooglePrivacyDlpV2InspectContentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InspectContentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InspectContentRequest(
           od as api.GooglePrivacyDlpV2InspectContentRequest);
     });
@@ -7484,8 +7628,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InspectContentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InspectContentResponse();
-      var od =
-          api.GooglePrivacyDlpV2InspectContentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InspectContentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InspectContentResponse(
           od as api.GooglePrivacyDlpV2InspectContentResponse);
     });
@@ -7494,8 +7639,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InspectDataSourceDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InspectDataSourceDetails();
-      var od =
-          api.GooglePrivacyDlpV2InspectDataSourceDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InspectDataSourceDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InspectDataSourceDetails(
           od as api.GooglePrivacyDlpV2InspectDataSourceDetails);
     });
@@ -7504,7 +7650,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InspectJobConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InspectJobConfig();
-      var od = api.GooglePrivacyDlpV2InspectJobConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InspectJobConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InspectJobConfig(
           od as api.GooglePrivacyDlpV2InspectJobConfig);
     });
@@ -7513,7 +7661,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InspectResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InspectResult();
-      var od = api.GooglePrivacyDlpV2InspectResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InspectResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InspectResult(
           od as api.GooglePrivacyDlpV2InspectResult);
     });
@@ -7522,7 +7672,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InspectTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InspectTemplate();
-      var od = api.GooglePrivacyDlpV2InspectTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InspectTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InspectTemplate(
           od as api.GooglePrivacyDlpV2InspectTemplate);
     });
@@ -7531,7 +7683,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InspectionRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InspectionRule();
-      var od = api.GooglePrivacyDlpV2InspectionRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InspectionRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InspectionRule(
           od as api.GooglePrivacyDlpV2InspectionRule);
     });
@@ -7540,7 +7694,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2InspectionRuleSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2InspectionRuleSet();
-      var od = api.GooglePrivacyDlpV2InspectionRuleSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2InspectionRuleSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2InspectionRuleSet(
           od as api.GooglePrivacyDlpV2InspectionRuleSet);
     });
@@ -7549,7 +7705,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2JobNotificationEmails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2JobNotificationEmails();
-      var od = api.GooglePrivacyDlpV2JobNotificationEmails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2JobNotificationEmails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2JobNotificationEmails(
           od as api.GooglePrivacyDlpV2JobNotificationEmails);
     });
@@ -7558,7 +7716,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2JobTrigger', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2JobTrigger();
-      var od = api.GooglePrivacyDlpV2JobTrigger.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2JobTrigger.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2JobTrigger(od as api.GooglePrivacyDlpV2JobTrigger);
     });
   });
@@ -7566,7 +7726,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2KAnonymityConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2KAnonymityConfig();
-      var od = api.GooglePrivacyDlpV2KAnonymityConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2KAnonymityConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2KAnonymityConfig(
           od as api.GooglePrivacyDlpV2KAnonymityConfig);
     });
@@ -7575,8 +7737,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2KAnonymityEquivalenceClass', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2KAnonymityEquivalenceClass();
-      var od =
-          api.GooglePrivacyDlpV2KAnonymityEquivalenceClass.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2KAnonymityEquivalenceClass.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2KAnonymityEquivalenceClass(
           od as api.GooglePrivacyDlpV2KAnonymityEquivalenceClass);
     });
@@ -7585,8 +7748,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2KAnonymityHistogramBucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2KAnonymityHistogramBucket();
-      var od =
-          api.GooglePrivacyDlpV2KAnonymityHistogramBucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2KAnonymityHistogramBucket.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2KAnonymityHistogramBucket(
           od as api.GooglePrivacyDlpV2KAnonymityHistogramBucket);
     });
@@ -7595,7 +7759,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2KAnonymityResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2KAnonymityResult();
-      var od = api.GooglePrivacyDlpV2KAnonymityResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2KAnonymityResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2KAnonymityResult(
           od as api.GooglePrivacyDlpV2KAnonymityResult);
     });
@@ -7604,7 +7770,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2KMapEstimationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2KMapEstimationConfig();
-      var od = api.GooglePrivacyDlpV2KMapEstimationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2KMapEstimationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2KMapEstimationConfig(
           od as api.GooglePrivacyDlpV2KMapEstimationConfig);
     });
@@ -7614,8 +7782,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2KMapEstimationHistogramBucket();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2KMapEstimationHistogramBucket.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2KMapEstimationHistogramBucket(
           od as api.GooglePrivacyDlpV2KMapEstimationHistogramBucket);
     });
@@ -7625,8 +7794,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2KMapEstimationQuasiIdValues();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2KMapEstimationQuasiIdValues.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2KMapEstimationQuasiIdValues(
           od as api.GooglePrivacyDlpV2KMapEstimationQuasiIdValues);
     });
@@ -7635,7 +7805,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2KMapEstimationResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2KMapEstimationResult();
-      var od = api.GooglePrivacyDlpV2KMapEstimationResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2KMapEstimationResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2KMapEstimationResult(
           od as api.GooglePrivacyDlpV2KMapEstimationResult);
     });
@@ -7644,7 +7816,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Key', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Key();
-      var od = api.GooglePrivacyDlpV2Key.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Key.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Key(od as api.GooglePrivacyDlpV2Key);
     });
   });
@@ -7652,7 +7826,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2KindExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2KindExpression();
-      var od = api.GooglePrivacyDlpV2KindExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2KindExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2KindExpression(
           od as api.GooglePrivacyDlpV2KindExpression);
     });
@@ -7661,7 +7837,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2KmsWrappedCryptoKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2KmsWrappedCryptoKey();
-      var od = api.GooglePrivacyDlpV2KmsWrappedCryptoKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2KmsWrappedCryptoKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2KmsWrappedCryptoKey(
           od as api.GooglePrivacyDlpV2KmsWrappedCryptoKey);
     });
@@ -7670,7 +7848,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2LDiversityConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2LDiversityConfig();
-      var od = api.GooglePrivacyDlpV2LDiversityConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2LDiversityConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2LDiversityConfig(
           od as api.GooglePrivacyDlpV2LDiversityConfig);
     });
@@ -7679,8 +7859,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2LDiversityEquivalenceClass', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2LDiversityEquivalenceClass();
-      var od =
-          api.GooglePrivacyDlpV2LDiversityEquivalenceClass.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2LDiversityEquivalenceClass.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2LDiversityEquivalenceClass(
           od as api.GooglePrivacyDlpV2LDiversityEquivalenceClass);
     });
@@ -7689,8 +7870,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2LDiversityHistogramBucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2LDiversityHistogramBucket();
-      var od =
-          api.GooglePrivacyDlpV2LDiversityHistogramBucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2LDiversityHistogramBucket.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2LDiversityHistogramBucket(
           od as api.GooglePrivacyDlpV2LDiversityHistogramBucket);
     });
@@ -7699,7 +7881,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2LDiversityResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2LDiversityResult();
-      var od = api.GooglePrivacyDlpV2LDiversityResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2LDiversityResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2LDiversityResult(
           od as api.GooglePrivacyDlpV2LDiversityResult);
     });
@@ -7709,8 +7893,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2LargeCustomDictionaryConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2LargeCustomDictionaryConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2LargeCustomDictionaryConfig(
           od as api.GooglePrivacyDlpV2LargeCustomDictionaryConfig);
     });
@@ -7719,8 +7904,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2LargeCustomDictionaryStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2LargeCustomDictionaryStats();
-      var od =
-          api.GooglePrivacyDlpV2LargeCustomDictionaryStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2LargeCustomDictionaryStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2LargeCustomDictionaryStats(
           od as api.GooglePrivacyDlpV2LargeCustomDictionaryStats);
     });
@@ -7729,7 +7915,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2LeaveUntransformed', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2LeaveUntransformed();
-      var od = api.GooglePrivacyDlpV2LeaveUntransformed.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2LeaveUntransformed.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2LeaveUntransformed(
           od as api.GooglePrivacyDlpV2LeaveUntransformed);
     });
@@ -7738,7 +7926,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2LikelihoodAdjustment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2LikelihoodAdjustment();
-      var od = api.GooglePrivacyDlpV2LikelihoodAdjustment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2LikelihoodAdjustment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2LikelihoodAdjustment(
           od as api.GooglePrivacyDlpV2LikelihoodAdjustment);
     });
@@ -7748,8 +7938,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ListDeidentifyTemplatesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(
           od as api.GooglePrivacyDlpV2ListDeidentifyTemplatesResponse);
     });
@@ -7758,7 +7949,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ListDlpJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ListDlpJobsResponse();
-      var od = api.GooglePrivacyDlpV2ListDlpJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ListDlpJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ListDlpJobsResponse(
           od as api.GooglePrivacyDlpV2ListDlpJobsResponse);
     });
@@ -7767,7 +7960,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ListInfoTypesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ListInfoTypesResponse();
-      var od = api.GooglePrivacyDlpV2ListInfoTypesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ListInfoTypesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ListInfoTypesResponse(
           od as api.GooglePrivacyDlpV2ListInfoTypesResponse);
     });
@@ -7777,8 +7972,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ListInspectTemplatesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ListInspectTemplatesResponse(
           od as api.GooglePrivacyDlpV2ListInspectTemplatesResponse);
     });
@@ -7787,8 +7983,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ListJobTriggersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ListJobTriggersResponse();
-      var od =
-          api.GooglePrivacyDlpV2ListJobTriggersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ListJobTriggersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ListJobTriggersResponse(
           od as api.GooglePrivacyDlpV2ListJobTriggersResponse);
     });
@@ -7798,8 +7995,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ListStoredInfoTypesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2ListStoredInfoTypesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(
           od as api.GooglePrivacyDlpV2ListStoredInfoTypesResponse);
     });
@@ -7808,7 +8006,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Location();
-      var od = api.GooglePrivacyDlpV2Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Location.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Location(od as api.GooglePrivacyDlpV2Location);
     });
   });
@@ -7816,7 +8016,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Manual', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Manual();
-      var od = api.GooglePrivacyDlpV2Manual.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Manual.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Manual(od as api.GooglePrivacyDlpV2Manual);
     });
   });
@@ -7824,7 +8026,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2MetadataLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2MetadataLocation();
-      var od = api.GooglePrivacyDlpV2MetadataLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2MetadataLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2MetadataLocation(
           od as api.GooglePrivacyDlpV2MetadataLocation);
     });
@@ -7833,7 +8037,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2NumericalStatsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2NumericalStatsConfig();
-      var od = api.GooglePrivacyDlpV2NumericalStatsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2NumericalStatsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2NumericalStatsConfig(
           od as api.GooglePrivacyDlpV2NumericalStatsConfig);
     });
@@ -7842,7 +8048,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2NumericalStatsResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2NumericalStatsResult();
-      var od = api.GooglePrivacyDlpV2NumericalStatsResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2NumericalStatsResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2NumericalStatsResult(
           od as api.GooglePrivacyDlpV2NumericalStatsResult);
     });
@@ -7851,7 +8059,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2OutputStorageConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2OutputStorageConfig();
-      var od = api.GooglePrivacyDlpV2OutputStorageConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2OutputStorageConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2OutputStorageConfig(
           od as api.GooglePrivacyDlpV2OutputStorageConfig);
     });
@@ -7860,7 +8070,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2PartitionId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2PartitionId();
-      var od = api.GooglePrivacyDlpV2PartitionId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2PartitionId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2PartitionId(
           od as api.GooglePrivacyDlpV2PartitionId);
     });
@@ -7869,7 +8081,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2PathElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2PathElement();
-      var od = api.GooglePrivacyDlpV2PathElement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2PathElement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2PathElement(
           od as api.GooglePrivacyDlpV2PathElement);
     });
@@ -7878,8 +8092,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2PrimitiveTransformation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2PrimitiveTransformation();
-      var od =
-          api.GooglePrivacyDlpV2PrimitiveTransformation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2PrimitiveTransformation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2PrimitiveTransformation(
           od as api.GooglePrivacyDlpV2PrimitiveTransformation);
     });
@@ -7888,7 +8103,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2PrivacyMetric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2PrivacyMetric();
-      var od = api.GooglePrivacyDlpV2PrivacyMetric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2PrivacyMetric.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2PrivacyMetric(
           od as api.GooglePrivacyDlpV2PrivacyMetric);
     });
@@ -7897,7 +8114,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Proximity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Proximity();
-      var od = api.GooglePrivacyDlpV2Proximity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Proximity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Proximity(od as api.GooglePrivacyDlpV2Proximity);
     });
   });
@@ -7906,8 +8125,9 @@
       'obj-schema-GooglePrivacyDlpV2PublishFindingsToCloudDataCatalog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2PublishFindingsToCloudDataCatalog();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2PublishFindingsToCloudDataCatalog.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2PublishFindingsToCloudDataCatalog(
           od as api.GooglePrivacyDlpV2PublishFindingsToCloudDataCatalog);
     });
@@ -7916,7 +8136,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2PublishSummaryToCscc', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2PublishSummaryToCscc();
-      var od = api.GooglePrivacyDlpV2PublishSummaryToCscc.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2PublishSummaryToCscc.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2PublishSummaryToCscc(
           od as api.GooglePrivacyDlpV2PublishSummaryToCscc);
     });
@@ -7925,7 +8147,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2PublishToPubSub', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2PublishToPubSub();
-      var od = api.GooglePrivacyDlpV2PublishToPubSub.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2PublishToPubSub.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2PublishToPubSub(
           od as api.GooglePrivacyDlpV2PublishToPubSub);
     });
@@ -7934,7 +8158,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2PublishToStackdriver', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2PublishToStackdriver();
-      var od = api.GooglePrivacyDlpV2PublishToStackdriver.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2PublishToStackdriver.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2PublishToStackdriver(
           od as api.GooglePrivacyDlpV2PublishToStackdriver);
     });
@@ -7943,7 +8169,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2QuasiId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2QuasiId();
-      var od = api.GooglePrivacyDlpV2QuasiId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2QuasiId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2QuasiId(od as api.GooglePrivacyDlpV2QuasiId);
     });
   });
@@ -7951,7 +8179,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2QuasiIdField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2QuasiIdField();
-      var od = api.GooglePrivacyDlpV2QuasiIdField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2QuasiIdField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2QuasiIdField(
           od as api.GooglePrivacyDlpV2QuasiIdField);
     });
@@ -7960,7 +8190,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2QuasiIdentifierField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2QuasiIdentifierField();
-      var od = api.GooglePrivacyDlpV2QuasiIdentifierField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2QuasiIdentifierField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2QuasiIdentifierField(
           od as api.GooglePrivacyDlpV2QuasiIdentifierField);
     });
@@ -7969,7 +8201,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2QuoteInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2QuoteInfo();
-      var od = api.GooglePrivacyDlpV2QuoteInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2QuoteInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2QuoteInfo(od as api.GooglePrivacyDlpV2QuoteInfo);
     });
   });
@@ -7977,7 +8211,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Range', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Range();
-      var od = api.GooglePrivacyDlpV2Range.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Range.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Range(od as api.GooglePrivacyDlpV2Range);
     });
   });
@@ -7985,7 +8221,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2RecordCondition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RecordCondition();
-      var od = api.GooglePrivacyDlpV2RecordCondition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2RecordCondition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RecordCondition(
           od as api.GooglePrivacyDlpV2RecordCondition);
     });
@@ -7994,7 +8232,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2RecordKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RecordKey();
-      var od = api.GooglePrivacyDlpV2RecordKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2RecordKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RecordKey(od as api.GooglePrivacyDlpV2RecordKey);
     });
   });
@@ -8002,7 +8242,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2RecordLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RecordLocation();
-      var od = api.GooglePrivacyDlpV2RecordLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2RecordLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RecordLocation(
           od as api.GooglePrivacyDlpV2RecordLocation);
     });
@@ -8011,7 +8253,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2RecordSuppression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RecordSuppression();
-      var od = api.GooglePrivacyDlpV2RecordSuppression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2RecordSuppression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RecordSuppression(
           od as api.GooglePrivacyDlpV2RecordSuppression);
     });
@@ -8020,7 +8264,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2RecordTransformations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RecordTransformations();
-      var od = api.GooglePrivacyDlpV2RecordTransformations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2RecordTransformations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RecordTransformations(
           od as api.GooglePrivacyDlpV2RecordTransformations);
     });
@@ -8029,7 +8275,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2RedactConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RedactConfig();
-      var od = api.GooglePrivacyDlpV2RedactConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2RedactConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RedactConfig(
           od as api.GooglePrivacyDlpV2RedactConfig);
     });
@@ -8038,7 +8286,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2RedactImageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RedactImageRequest();
-      var od = api.GooglePrivacyDlpV2RedactImageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2RedactImageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RedactImageRequest(
           od as api.GooglePrivacyDlpV2RedactImageRequest);
     });
@@ -8047,7 +8297,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2RedactImageResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RedactImageResponse();
-      var od = api.GooglePrivacyDlpV2RedactImageResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2RedactImageResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RedactImageResponse(
           od as api.GooglePrivacyDlpV2RedactImageResponse);
     });
@@ -8056,7 +8308,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Regex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Regex();
-      var od = api.GooglePrivacyDlpV2Regex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Regex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Regex(od as api.GooglePrivacyDlpV2Regex);
     });
   });
@@ -8064,8 +8318,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ReidentifyContentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ReidentifyContentRequest();
-      var od =
-          api.GooglePrivacyDlpV2ReidentifyContentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ReidentifyContentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ReidentifyContentRequest(
           od as api.GooglePrivacyDlpV2ReidentifyContentRequest);
     });
@@ -8074,8 +8329,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ReidentifyContentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ReidentifyContentResponse();
-      var od =
-          api.GooglePrivacyDlpV2ReidentifyContentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ReidentifyContentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ReidentifyContentResponse(
           od as api.GooglePrivacyDlpV2ReidentifyContentResponse);
     });
@@ -8084,7 +8340,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ReplaceValueConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ReplaceValueConfig();
-      var od = api.GooglePrivacyDlpV2ReplaceValueConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ReplaceValueConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ReplaceValueConfig(
           od as api.GooglePrivacyDlpV2ReplaceValueConfig);
     });
@@ -8093,8 +8351,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ReplaceWithInfoTypeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ReplaceWithInfoTypeConfig();
-      var od =
-          api.GooglePrivacyDlpV2ReplaceWithInfoTypeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ReplaceWithInfoTypeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ReplaceWithInfoTypeConfig(
           od as api.GooglePrivacyDlpV2ReplaceWithInfoTypeConfig);
     });
@@ -8103,7 +8362,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2RequestedOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RequestedOptions();
-      var od = api.GooglePrivacyDlpV2RequestedOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2RequestedOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RequestedOptions(
           od as api.GooglePrivacyDlpV2RequestedOptions);
     });
@@ -8113,8 +8374,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RequestedRiskAnalysisOptions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2RequestedRiskAnalysisOptions.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RequestedRiskAnalysisOptions(
           od as api.GooglePrivacyDlpV2RequestedRiskAnalysisOptions);
     });
@@ -8123,7 +8385,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Result', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Result();
-      var od = api.GooglePrivacyDlpV2Result.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Result.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Result(od as api.GooglePrivacyDlpV2Result);
     });
   });
@@ -8131,7 +8395,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2RiskAnalysisJobConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2RiskAnalysisJobConfig();
-      var od = api.GooglePrivacyDlpV2RiskAnalysisJobConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2RiskAnalysisJobConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2RiskAnalysisJobConfig(
           od as api.GooglePrivacyDlpV2RiskAnalysisJobConfig);
     });
@@ -8140,7 +8406,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Row', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Row();
-      var od = api.GooglePrivacyDlpV2Row.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Row.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Row(od as api.GooglePrivacyDlpV2Row);
     });
   });
@@ -8148,7 +8416,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2SaveFindings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2SaveFindings();
-      var od = api.GooglePrivacyDlpV2SaveFindings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2SaveFindings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2SaveFindings(
           od as api.GooglePrivacyDlpV2SaveFindings);
     });
@@ -8157,7 +8427,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Schedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Schedule();
-      var od = api.GooglePrivacyDlpV2Schedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Schedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Schedule(od as api.GooglePrivacyDlpV2Schedule);
     });
   });
@@ -8165,7 +8437,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2StatisticalTable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2StatisticalTable();
-      var od = api.GooglePrivacyDlpV2StatisticalTable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2StatisticalTable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2StatisticalTable(
           od as api.GooglePrivacyDlpV2StatisticalTable);
     });
@@ -8174,7 +8448,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2StorageConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2StorageConfig();
-      var od = api.GooglePrivacyDlpV2StorageConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2StorageConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2StorageConfig(
           od as api.GooglePrivacyDlpV2StorageConfig);
     });
@@ -8183,7 +8459,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2StorageMetadataLabel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2StorageMetadataLabel();
-      var od = api.GooglePrivacyDlpV2StorageMetadataLabel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2StorageMetadataLabel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2StorageMetadataLabel(
           od as api.GooglePrivacyDlpV2StorageMetadataLabel);
     });
@@ -8192,7 +8470,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2StoredInfoType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2StoredInfoType();
-      var od = api.GooglePrivacyDlpV2StoredInfoType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2StoredInfoType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2StoredInfoType(
           od as api.GooglePrivacyDlpV2StoredInfoType);
     });
@@ -8201,7 +8481,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2StoredInfoTypeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2StoredInfoTypeConfig();
-      var od = api.GooglePrivacyDlpV2StoredInfoTypeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2StoredInfoTypeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2StoredInfoTypeConfig(
           od as api.GooglePrivacyDlpV2StoredInfoTypeConfig);
     });
@@ -8210,7 +8492,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2StoredInfoTypeStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2StoredInfoTypeStats();
-      var od = api.GooglePrivacyDlpV2StoredInfoTypeStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2StoredInfoTypeStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2StoredInfoTypeStats(
           od as api.GooglePrivacyDlpV2StoredInfoTypeStats);
     });
@@ -8219,7 +8503,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2StoredInfoTypeVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2StoredInfoTypeVersion();
-      var od = api.GooglePrivacyDlpV2StoredInfoTypeVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2StoredInfoTypeVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2StoredInfoTypeVersion(
           od as api.GooglePrivacyDlpV2StoredInfoTypeVersion);
     });
@@ -8228,7 +8514,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2StoredType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2StoredType();
-      var od = api.GooglePrivacyDlpV2StoredType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2StoredType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2StoredType(od as api.GooglePrivacyDlpV2StoredType);
     });
   });
@@ -8236,7 +8524,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2SummaryResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2SummaryResult();
-      var od = api.GooglePrivacyDlpV2SummaryResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2SummaryResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2SummaryResult(
           od as api.GooglePrivacyDlpV2SummaryResult);
     });
@@ -8245,7 +8535,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2SurrogateType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2SurrogateType();
-      var od = api.GooglePrivacyDlpV2SurrogateType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2SurrogateType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2SurrogateType(
           od as api.GooglePrivacyDlpV2SurrogateType);
     });
@@ -8254,7 +8546,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Table', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Table();
-      var od = api.GooglePrivacyDlpV2Table.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Table.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Table(od as api.GooglePrivacyDlpV2Table);
     });
   });
@@ -8262,7 +8556,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2TableLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2TableLocation();
-      var od = api.GooglePrivacyDlpV2TableLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2TableLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2TableLocation(
           od as api.GooglePrivacyDlpV2TableLocation);
     });
@@ -8271,7 +8567,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2TableOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2TableOptions();
-      var od = api.GooglePrivacyDlpV2TableOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2TableOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2TableOptions(
           od as api.GooglePrivacyDlpV2TableOptions);
     });
@@ -8280,7 +8578,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2TaggedField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2TaggedField();
-      var od = api.GooglePrivacyDlpV2TaggedField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2TaggedField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2TaggedField(
           od as api.GooglePrivacyDlpV2TaggedField);
     });
@@ -8289,7 +8589,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ThrowError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ThrowError();
-      var od = api.GooglePrivacyDlpV2ThrowError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ThrowError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ThrowError(od as api.GooglePrivacyDlpV2ThrowError);
     });
   });
@@ -8297,7 +8599,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2TimePartConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2TimePartConfig();
-      var od = api.GooglePrivacyDlpV2TimePartConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2TimePartConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2TimePartConfig(
           od as api.GooglePrivacyDlpV2TimePartConfig);
     });
@@ -8306,7 +8610,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2TimeZone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2TimeZone();
-      var od = api.GooglePrivacyDlpV2TimeZone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2TimeZone.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2TimeZone(od as api.GooglePrivacyDlpV2TimeZone);
     });
   });
@@ -8314,7 +8620,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2TimespanConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2TimespanConfig();
-      var od = api.GooglePrivacyDlpV2TimespanConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2TimespanConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2TimespanConfig(
           od as api.GooglePrivacyDlpV2TimespanConfig);
     });
@@ -8324,8 +8632,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2TransformationErrorHandling();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2TransformationErrorHandling.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2TransformationErrorHandling(
           od as api.GooglePrivacyDlpV2TransformationErrorHandling);
     });
@@ -8334,8 +8643,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2TransformationOverview', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2TransformationOverview();
-      var od =
-          api.GooglePrivacyDlpV2TransformationOverview.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2TransformationOverview.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2TransformationOverview(
           od as api.GooglePrivacyDlpV2TransformationOverview);
     });
@@ -8344,7 +8654,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2TransformationSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2TransformationSummary();
-      var od = api.GooglePrivacyDlpV2TransformationSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2TransformationSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2TransformationSummary(
           od as api.GooglePrivacyDlpV2TransformationSummary);
     });
@@ -8353,7 +8665,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2TransientCryptoKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2TransientCryptoKey();
-      var od = api.GooglePrivacyDlpV2TransientCryptoKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2TransientCryptoKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2TransientCryptoKey(
           od as api.GooglePrivacyDlpV2TransientCryptoKey);
     });
@@ -8362,7 +8676,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Trigger', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Trigger();
-      var od = api.GooglePrivacyDlpV2Trigger.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Trigger.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Trigger(od as api.GooglePrivacyDlpV2Trigger);
     });
   });
@@ -8370,7 +8686,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2UnwrappedCryptoKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2UnwrappedCryptoKey();
-      var od = api.GooglePrivacyDlpV2UnwrappedCryptoKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2UnwrappedCryptoKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2UnwrappedCryptoKey(
           od as api.GooglePrivacyDlpV2UnwrappedCryptoKey);
     });
@@ -8380,8 +8698,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(
           od as api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest);
     });
@@ -8391,8 +8710,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2UpdateInspectTemplateRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(
           od as api.GooglePrivacyDlpV2UpdateInspectTemplateRequest);
     });
@@ -8401,8 +8721,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2UpdateJobTriggerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2UpdateJobTriggerRequest();
-      var od =
-          api.GooglePrivacyDlpV2UpdateJobTriggerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2UpdateJobTriggerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2UpdateJobTriggerRequest(
           od as api.GooglePrivacyDlpV2UpdateJobTriggerRequest);
     });
@@ -8412,8 +8733,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2UpdateStoredInfoTypeRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(
           od as api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest);
     });
@@ -8422,7 +8744,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2Value', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2Value();
-      var od = api.GooglePrivacyDlpV2Value.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2Value.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2Value(od as api.GooglePrivacyDlpV2Value);
     });
   });
@@ -8430,7 +8754,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2ValueFrequency', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2ValueFrequency();
-      var od = api.GooglePrivacyDlpV2ValueFrequency.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2ValueFrequency.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2ValueFrequency(
           od as api.GooglePrivacyDlpV2ValueFrequency);
     });
@@ -8439,7 +8765,9 @@
   unittest.group('obj-schema-GooglePrivacyDlpV2WordList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePrivacyDlpV2WordList();
-      var od = api.GooglePrivacyDlpV2WordList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePrivacyDlpV2WordList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePrivacyDlpV2WordList(od as api.GooglePrivacyDlpV2WordList);
     });
   });
@@ -8447,7 +8775,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -8455,7 +8785,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
@@ -8463,7 +8795,9 @@
   unittest.group('obj-schema-GoogleTypeDate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeDate();
-      var od = api.GoogleTypeDate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeDate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeDate(od as api.GoogleTypeDate);
     });
   });
@@ -8471,7 +8805,9 @@
   unittest.group('obj-schema-GoogleTypeTimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeTimeOfDay();
-      var od = api.GoogleTypeTimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeTimeOfDay.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeTimeOfDay(od as api.GoogleTypeTimeOfDay);
     });
   });
diff --git a/generated/googleapis/test/dns/v1_test.dart b/generated/googleapis/test/dns/v1_test.dart
index 6efbc13..b2b9697 100644
--- a/generated/googleapis/test/dns/v1_test.dart
+++ b/generated/googleapis/test/dns/v1_test.dart
@@ -1493,7 +1493,9 @@
   unittest.group('obj-schema-Change', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChange();
-      var od = api.Change.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Change.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChange(od as api.Change);
     });
   });
@@ -1501,7 +1503,9 @@
   unittest.group('obj-schema-ChangesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChangesListResponse();
-      var od = api.ChangesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChangesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChangesListResponse(od as api.ChangesListResponse);
     });
   });
@@ -1509,7 +1513,9 @@
   unittest.group('obj-schema-DnsKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDnsKey();
-      var od = api.DnsKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DnsKey.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDnsKey(od as api.DnsKey);
     });
   });
@@ -1517,7 +1523,9 @@
   unittest.group('obj-schema-DnsKeyDigest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDnsKeyDigest();
-      var od = api.DnsKeyDigest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DnsKeyDigest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDnsKeyDigest(od as api.DnsKeyDigest);
     });
   });
@@ -1525,7 +1533,9 @@
   unittest.group('obj-schema-DnsKeySpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDnsKeySpec();
-      var od = api.DnsKeySpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DnsKeySpec.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDnsKeySpec(od as api.DnsKeySpec);
     });
   });
@@ -1533,7 +1543,9 @@
   unittest.group('obj-schema-DnsKeysListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDnsKeysListResponse();
-      var od = api.DnsKeysListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DnsKeysListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDnsKeysListResponse(od as api.DnsKeysListResponse);
     });
   });
@@ -1541,7 +1553,9 @@
   unittest.group('obj-schema-ManagedZone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZone();
-      var od = api.ManagedZone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZone.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZone(od as api.ManagedZone);
     });
   });
@@ -1549,7 +1563,9 @@
   unittest.group('obj-schema-ManagedZoneDnsSecConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZoneDnsSecConfig();
-      var od = api.ManagedZoneDnsSecConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZoneDnsSecConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZoneDnsSecConfig(od as api.ManagedZoneDnsSecConfig);
     });
   });
@@ -1557,7 +1573,9 @@
   unittest.group('obj-schema-ManagedZoneForwardingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZoneForwardingConfig();
-      var od = api.ManagedZoneForwardingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZoneForwardingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZoneForwardingConfig(od as api.ManagedZoneForwardingConfig);
     });
   });
@@ -1565,8 +1583,9 @@
   unittest.group('obj-schema-ManagedZoneForwardingConfigNameServerTarget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZoneForwardingConfigNameServerTarget();
-      var od =
-          api.ManagedZoneForwardingConfigNameServerTarget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZoneForwardingConfigNameServerTarget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZoneForwardingConfigNameServerTarget(
           od as api.ManagedZoneForwardingConfigNameServerTarget);
     });
@@ -1575,7 +1594,9 @@
   unittest.group('obj-schema-ManagedZoneOperationsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZoneOperationsListResponse();
-      var od = api.ManagedZoneOperationsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZoneOperationsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZoneOperationsListResponse(
           od as api.ManagedZoneOperationsListResponse);
     });
@@ -1584,7 +1605,9 @@
   unittest.group('obj-schema-ManagedZonePeeringConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZonePeeringConfig();
-      var od = api.ManagedZonePeeringConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZonePeeringConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZonePeeringConfig(od as api.ManagedZonePeeringConfig);
     });
   });
@@ -1592,7 +1615,9 @@
   unittest.group('obj-schema-ManagedZonePeeringConfigTargetNetwork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZonePeeringConfigTargetNetwork();
-      var od = api.ManagedZonePeeringConfigTargetNetwork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZonePeeringConfigTargetNetwork.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZonePeeringConfigTargetNetwork(
           od as api.ManagedZonePeeringConfigTargetNetwork);
     });
@@ -1601,7 +1626,9 @@
   unittest.group('obj-schema-ManagedZonePrivateVisibilityConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZonePrivateVisibilityConfig();
-      var od = api.ManagedZonePrivateVisibilityConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZonePrivateVisibilityConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZonePrivateVisibilityConfig(
           od as api.ManagedZonePrivateVisibilityConfig);
     });
@@ -1610,8 +1637,9 @@
   unittest.group('obj-schema-ManagedZonePrivateVisibilityConfigNetwork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZonePrivateVisibilityConfigNetwork();
-      var od =
-          api.ManagedZonePrivateVisibilityConfigNetwork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZonePrivateVisibilityConfigNetwork.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZonePrivateVisibilityConfigNetwork(
           od as api.ManagedZonePrivateVisibilityConfigNetwork);
     });
@@ -1620,7 +1648,9 @@
   unittest.group('obj-schema-ManagedZoneReverseLookupConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZoneReverseLookupConfig();
-      var od = api.ManagedZoneReverseLookupConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZoneReverseLookupConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZoneReverseLookupConfig(
           od as api.ManagedZoneReverseLookupConfig);
     });
@@ -1629,7 +1659,9 @@
   unittest.group('obj-schema-ManagedZoneServiceDirectoryConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZoneServiceDirectoryConfig();
-      var od = api.ManagedZoneServiceDirectoryConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZoneServiceDirectoryConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZoneServiceDirectoryConfig(
           od as api.ManagedZoneServiceDirectoryConfig);
     });
@@ -1638,8 +1670,9 @@
   unittest.group('obj-schema-ManagedZoneServiceDirectoryConfigNamespace', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZoneServiceDirectoryConfigNamespace();
-      var od =
-          api.ManagedZoneServiceDirectoryConfigNamespace.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZoneServiceDirectoryConfigNamespace.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZoneServiceDirectoryConfigNamespace(
           od as api.ManagedZoneServiceDirectoryConfigNamespace);
     });
@@ -1648,7 +1681,9 @@
   unittest.group('obj-schema-ManagedZonesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedZonesListResponse();
-      var od = api.ManagedZonesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedZonesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedZonesListResponse(od as api.ManagedZonesListResponse);
     });
   });
@@ -1656,7 +1691,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1664,7 +1701,9 @@
   unittest.group('obj-schema-OperationDnsKeyContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationDnsKeyContext();
-      var od = api.OperationDnsKeyContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationDnsKeyContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationDnsKeyContext(od as api.OperationDnsKeyContext);
     });
   });
@@ -1672,7 +1711,9 @@
   unittest.group('obj-schema-OperationManagedZoneContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationManagedZoneContext();
-      var od = api.OperationManagedZoneContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationManagedZoneContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationManagedZoneContext(od as api.OperationManagedZoneContext);
     });
   });
@@ -1680,7 +1721,9 @@
   unittest.group('obj-schema-PoliciesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPoliciesListResponse();
-      var od = api.PoliciesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PoliciesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPoliciesListResponse(od as api.PoliciesListResponse);
     });
   });
@@ -1688,7 +1731,9 @@
   unittest.group('obj-schema-PoliciesPatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPoliciesPatchResponse();
-      var od = api.PoliciesPatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PoliciesPatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPoliciesPatchResponse(od as api.PoliciesPatchResponse);
     });
   });
@@ -1696,7 +1741,9 @@
   unittest.group('obj-schema-PoliciesUpdateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPoliciesUpdateResponse();
-      var od = api.PoliciesUpdateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PoliciesUpdateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPoliciesUpdateResponse(od as api.PoliciesUpdateResponse);
     });
   });
@@ -1704,7 +1751,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1712,7 +1761,9 @@
   unittest.group('obj-schema-PolicyAlternativeNameServerConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyAlternativeNameServerConfig();
-      var od = api.PolicyAlternativeNameServerConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyAlternativeNameServerConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyAlternativeNameServerConfig(
           od as api.PolicyAlternativeNameServerConfig);
     });
@@ -1722,8 +1773,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyAlternativeNameServerConfigTargetNameServer();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.PolicyAlternativeNameServerConfigTargetNameServer.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyAlternativeNameServerConfigTargetNameServer(
           od as api.PolicyAlternativeNameServerConfigTargetNameServer);
     });
@@ -1732,7 +1784,9 @@
   unittest.group('obj-schema-PolicyNetwork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyNetwork();
-      var od = api.PolicyNetwork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyNetwork.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyNetwork(od as api.PolicyNetwork);
     });
   });
@@ -1740,7 +1794,9 @@
   unittest.group('obj-schema-Project', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProject();
-      var od = api.Project.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Project.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProject(od as api.Project);
     });
   });
@@ -1748,7 +1804,8 @@
   unittest.group('obj-schema-Quota', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuota();
-      var od = api.Quota.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Quota.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuota(od as api.Quota);
     });
   });
@@ -1756,7 +1813,9 @@
   unittest.group('obj-schema-ResourceRecordSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceRecordSet();
-      var od = api.ResourceRecordSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceRecordSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceRecordSet(od as api.ResourceRecordSet);
     });
   });
@@ -1764,7 +1823,9 @@
   unittest.group('obj-schema-ResourceRecordSetsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceRecordSetsListResponse();
-      var od = api.ResourceRecordSetsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceRecordSetsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceRecordSetsListResponse(
           od as api.ResourceRecordSetsListResponse);
     });
@@ -1773,7 +1834,9 @@
   unittest.group('obj-schema-ResponseHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResponseHeader();
-      var od = api.ResponseHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResponseHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResponseHeader(od as api.ResponseHeader);
     });
   });
diff --git a/generated/googleapis/test/docs/v1_test.dart b/generated/googleapis/test/docs/v1_test.dart
index ba59c55..67ec05a 100644
--- a/generated/googleapis/test/docs/v1_test.dart
+++ b/generated/googleapis/test/docs/v1_test.dart
@@ -5393,7 +5393,9 @@
   unittest.group('obj-schema-AutoText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoText();
-      var od = api.AutoText.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AutoText.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAutoText(od as api.AutoText);
     });
   });
@@ -5401,7 +5403,9 @@
   unittest.group('obj-schema-Background', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackground();
-      var od = api.Background.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Background.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackground(od as api.Background);
     });
   });
@@ -5409,7 +5413,9 @@
   unittest.group('obj-schema-BackgroundSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackgroundSuggestionState();
-      var od = api.BackgroundSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackgroundSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackgroundSuggestionState(od as api.BackgroundSuggestionState);
     });
   });
@@ -5417,7 +5423,9 @@
   unittest.group('obj-schema-BatchUpdateDocumentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateDocumentRequest();
-      var od = api.BatchUpdateDocumentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateDocumentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateDocumentRequest(od as api.BatchUpdateDocumentRequest);
     });
   });
@@ -5425,7 +5433,9 @@
   unittest.group('obj-schema-BatchUpdateDocumentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateDocumentResponse();
-      var od = api.BatchUpdateDocumentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateDocumentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateDocumentResponse(od as api.BatchUpdateDocumentResponse);
     });
   });
@@ -5433,7 +5443,8 @@
   unittest.group('obj-schema-Body', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBody();
-      var od = api.Body.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Body.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBody(od as api.Body);
     });
   });
@@ -5441,7 +5452,9 @@
   unittest.group('obj-schema-Bullet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBullet();
-      var od = api.Bullet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Bullet.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBullet(od as api.Bullet);
     });
   });
@@ -5449,7 +5462,9 @@
   unittest.group('obj-schema-BulletSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBulletSuggestionState();
-      var od = api.BulletSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BulletSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBulletSuggestionState(od as api.BulletSuggestionState);
     });
   });
@@ -5457,7 +5472,8 @@
   unittest.group('obj-schema-Color', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColor();
-      var od = api.Color.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Color.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColor(od as api.Color);
     });
   });
@@ -5465,7 +5481,9 @@
   unittest.group('obj-schema-ColumnBreak', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColumnBreak();
-      var od = api.ColumnBreak.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ColumnBreak.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkColumnBreak(od as api.ColumnBreak);
     });
   });
@@ -5473,7 +5491,9 @@
   unittest.group('obj-schema-CreateFooterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateFooterRequest();
-      var od = api.CreateFooterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateFooterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateFooterRequest(od as api.CreateFooterRequest);
     });
   });
@@ -5481,7 +5501,9 @@
   unittest.group('obj-schema-CreateFooterResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateFooterResponse();
-      var od = api.CreateFooterResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateFooterResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateFooterResponse(od as api.CreateFooterResponse);
     });
   });
@@ -5489,7 +5511,9 @@
   unittest.group('obj-schema-CreateFootnoteRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateFootnoteRequest();
-      var od = api.CreateFootnoteRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateFootnoteRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateFootnoteRequest(od as api.CreateFootnoteRequest);
     });
   });
@@ -5497,7 +5521,9 @@
   unittest.group('obj-schema-CreateFootnoteResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateFootnoteResponse();
-      var od = api.CreateFootnoteResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateFootnoteResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateFootnoteResponse(od as api.CreateFootnoteResponse);
     });
   });
@@ -5505,7 +5531,9 @@
   unittest.group('obj-schema-CreateHeaderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateHeaderRequest();
-      var od = api.CreateHeaderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateHeaderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateHeaderRequest(od as api.CreateHeaderRequest);
     });
   });
@@ -5513,7 +5541,9 @@
   unittest.group('obj-schema-CreateHeaderResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateHeaderResponse();
-      var od = api.CreateHeaderResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateHeaderResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateHeaderResponse(od as api.CreateHeaderResponse);
     });
   });
@@ -5521,7 +5551,9 @@
   unittest.group('obj-schema-CreateNamedRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateNamedRangeRequest();
-      var od = api.CreateNamedRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateNamedRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateNamedRangeRequest(od as api.CreateNamedRangeRequest);
     });
   });
@@ -5529,7 +5561,9 @@
   unittest.group('obj-schema-CreateNamedRangeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateNamedRangeResponse();
-      var od = api.CreateNamedRangeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateNamedRangeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateNamedRangeResponse(od as api.CreateNamedRangeResponse);
     });
   });
@@ -5537,7 +5571,9 @@
   unittest.group('obj-schema-CreateParagraphBulletsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateParagraphBulletsRequest();
-      var od = api.CreateParagraphBulletsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateParagraphBulletsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateParagraphBulletsRequest(
           od as api.CreateParagraphBulletsRequest);
     });
@@ -5546,7 +5582,9 @@
   unittest.group('obj-schema-CropProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCropProperties();
-      var od = api.CropProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CropProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCropProperties(od as api.CropProperties);
     });
   });
@@ -5554,7 +5592,9 @@
   unittest.group('obj-schema-CropPropertiesSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCropPropertiesSuggestionState();
-      var od = api.CropPropertiesSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CropPropertiesSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCropPropertiesSuggestionState(
           od as api.CropPropertiesSuggestionState);
     });
@@ -5563,7 +5603,9 @@
   unittest.group('obj-schema-DeleteContentRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteContentRangeRequest();
-      var od = api.DeleteContentRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteContentRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteContentRangeRequest(od as api.DeleteContentRangeRequest);
     });
   });
@@ -5571,7 +5613,9 @@
   unittest.group('obj-schema-DeleteFooterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteFooterRequest();
-      var od = api.DeleteFooterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteFooterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteFooterRequest(od as api.DeleteFooterRequest);
     });
   });
@@ -5579,7 +5623,9 @@
   unittest.group('obj-schema-DeleteHeaderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteHeaderRequest();
-      var od = api.DeleteHeaderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteHeaderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteHeaderRequest(od as api.DeleteHeaderRequest);
     });
   });
@@ -5587,7 +5633,9 @@
   unittest.group('obj-schema-DeleteNamedRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteNamedRangeRequest();
-      var od = api.DeleteNamedRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteNamedRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteNamedRangeRequest(od as api.DeleteNamedRangeRequest);
     });
   });
@@ -5595,7 +5643,9 @@
   unittest.group('obj-schema-DeleteParagraphBulletsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteParagraphBulletsRequest();
-      var od = api.DeleteParagraphBulletsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteParagraphBulletsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteParagraphBulletsRequest(
           od as api.DeleteParagraphBulletsRequest);
     });
@@ -5604,7 +5654,9 @@
   unittest.group('obj-schema-DeletePositionedObjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeletePositionedObjectRequest();
-      var od = api.DeletePositionedObjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeletePositionedObjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeletePositionedObjectRequest(
           od as api.DeletePositionedObjectRequest);
     });
@@ -5613,7 +5665,9 @@
   unittest.group('obj-schema-DeleteTableColumnRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTableColumnRequest();
-      var od = api.DeleteTableColumnRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTableColumnRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTableColumnRequest(od as api.DeleteTableColumnRequest);
     });
   });
@@ -5621,7 +5675,9 @@
   unittest.group('obj-schema-DeleteTableRowRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTableRowRequest();
-      var od = api.DeleteTableRowRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTableRowRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTableRowRequest(od as api.DeleteTableRowRequest);
     });
   });
@@ -5629,7 +5685,9 @@
   unittest.group('obj-schema-Dimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimension();
-      var od = api.Dimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Dimension.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDimension(od as api.Dimension);
     });
   });
@@ -5637,7 +5695,9 @@
   unittest.group('obj-schema-Document', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocument();
-      var od = api.Document.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Document.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDocument(od as api.Document);
     });
   });
@@ -5645,7 +5705,9 @@
   unittest.group('obj-schema-DocumentStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentStyle();
-      var od = api.DocumentStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentStyle(od as api.DocumentStyle);
     });
   });
@@ -5653,7 +5715,9 @@
   unittest.group('obj-schema-DocumentStyleSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentStyleSuggestionState();
-      var od = api.DocumentStyleSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentStyleSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentStyleSuggestionState(od as api.DocumentStyleSuggestionState);
     });
   });
@@ -5661,7 +5725,9 @@
   unittest.group('obj-schema-EmbeddedDrawingProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmbeddedDrawingProperties();
-      var od = api.EmbeddedDrawingProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmbeddedDrawingProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmbeddedDrawingProperties(od as api.EmbeddedDrawingProperties);
     });
   });
@@ -5669,8 +5735,9 @@
   unittest.group('obj-schema-EmbeddedDrawingPropertiesSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmbeddedDrawingPropertiesSuggestionState();
-      var od =
-          api.EmbeddedDrawingPropertiesSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmbeddedDrawingPropertiesSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmbeddedDrawingPropertiesSuggestionState(
           od as api.EmbeddedDrawingPropertiesSuggestionState);
     });
@@ -5679,7 +5746,9 @@
   unittest.group('obj-schema-EmbeddedObject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmbeddedObject();
-      var od = api.EmbeddedObject.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmbeddedObject.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmbeddedObject(od as api.EmbeddedObject);
     });
   });
@@ -5687,7 +5756,9 @@
   unittest.group('obj-schema-EmbeddedObjectBorder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmbeddedObjectBorder();
-      var od = api.EmbeddedObjectBorder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmbeddedObjectBorder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmbeddedObjectBorder(od as api.EmbeddedObjectBorder);
     });
   });
@@ -5695,7 +5766,9 @@
   unittest.group('obj-schema-EmbeddedObjectBorderSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmbeddedObjectBorderSuggestionState();
-      var od = api.EmbeddedObjectBorderSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmbeddedObjectBorderSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmbeddedObjectBorderSuggestionState(
           od as api.EmbeddedObjectBorderSuggestionState);
     });
@@ -5704,7 +5777,9 @@
   unittest.group('obj-schema-EmbeddedObjectSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmbeddedObjectSuggestionState();
-      var od = api.EmbeddedObjectSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmbeddedObjectSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmbeddedObjectSuggestionState(
           od as api.EmbeddedObjectSuggestionState);
     });
@@ -5713,7 +5788,9 @@
   unittest.group('obj-schema-EndOfSegmentLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndOfSegmentLocation();
-      var od = api.EndOfSegmentLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EndOfSegmentLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEndOfSegmentLocation(od as api.EndOfSegmentLocation);
     });
   });
@@ -5721,7 +5798,9 @@
   unittest.group('obj-schema-Equation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEquation();
-      var od = api.Equation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Equation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEquation(od as api.Equation);
     });
   });
@@ -5729,7 +5808,9 @@
   unittest.group('obj-schema-Footer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFooter();
-      var od = api.Footer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Footer.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFooter(od as api.Footer);
     });
   });
@@ -5737,7 +5818,9 @@
   unittest.group('obj-schema-Footnote', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFootnote();
-      var od = api.Footnote.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Footnote.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFootnote(od as api.Footnote);
     });
   });
@@ -5745,7 +5828,9 @@
   unittest.group('obj-schema-FootnoteReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFootnoteReference();
-      var od = api.FootnoteReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FootnoteReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFootnoteReference(od as api.FootnoteReference);
     });
   });
@@ -5753,7 +5838,9 @@
   unittest.group('obj-schema-Header', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHeader();
-      var od = api.Header.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Header.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHeader(od as api.Header);
     });
   });
@@ -5761,7 +5848,9 @@
   unittest.group('obj-schema-HorizontalRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHorizontalRule();
-      var od = api.HorizontalRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HorizontalRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHorizontalRule(od as api.HorizontalRule);
     });
   });
@@ -5769,7 +5858,9 @@
   unittest.group('obj-schema-ImageProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageProperties();
-      var od = api.ImageProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageProperties(od as api.ImageProperties);
     });
   });
@@ -5777,7 +5868,9 @@
   unittest.group('obj-schema-ImagePropertiesSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImagePropertiesSuggestionState();
-      var od = api.ImagePropertiesSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImagePropertiesSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImagePropertiesSuggestionState(
           od as api.ImagePropertiesSuggestionState);
     });
@@ -5786,7 +5879,9 @@
   unittest.group('obj-schema-InlineObject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInlineObject();
-      var od = api.InlineObject.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InlineObject.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInlineObject(od as api.InlineObject);
     });
   });
@@ -5794,7 +5889,9 @@
   unittest.group('obj-schema-InlineObjectElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInlineObjectElement();
-      var od = api.InlineObjectElement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InlineObjectElement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInlineObjectElement(od as api.InlineObjectElement);
     });
   });
@@ -5802,7 +5899,9 @@
   unittest.group('obj-schema-InlineObjectProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInlineObjectProperties();
-      var od = api.InlineObjectProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InlineObjectProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInlineObjectProperties(od as api.InlineObjectProperties);
     });
   });
@@ -5810,7 +5909,9 @@
   unittest.group('obj-schema-InlineObjectPropertiesSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInlineObjectPropertiesSuggestionState();
-      var od = api.InlineObjectPropertiesSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InlineObjectPropertiesSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInlineObjectPropertiesSuggestionState(
           od as api.InlineObjectPropertiesSuggestionState);
     });
@@ -5819,7 +5920,9 @@
   unittest.group('obj-schema-InsertInlineImageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertInlineImageRequest();
-      var od = api.InsertInlineImageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertInlineImageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertInlineImageRequest(od as api.InsertInlineImageRequest);
     });
   });
@@ -5827,7 +5930,9 @@
   unittest.group('obj-schema-InsertInlineImageResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertInlineImageResponse();
-      var od = api.InsertInlineImageResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertInlineImageResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertInlineImageResponse(od as api.InsertInlineImageResponse);
     });
   });
@@ -5835,7 +5940,9 @@
   unittest.group('obj-schema-InsertInlineSheetsChartResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertInlineSheetsChartResponse();
-      var od = api.InsertInlineSheetsChartResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertInlineSheetsChartResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertInlineSheetsChartResponse(
           od as api.InsertInlineSheetsChartResponse);
     });
@@ -5844,7 +5951,9 @@
   unittest.group('obj-schema-InsertPageBreakRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertPageBreakRequest();
-      var od = api.InsertPageBreakRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertPageBreakRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertPageBreakRequest(od as api.InsertPageBreakRequest);
     });
   });
@@ -5852,7 +5961,9 @@
   unittest.group('obj-schema-InsertSectionBreakRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertSectionBreakRequest();
-      var od = api.InsertSectionBreakRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertSectionBreakRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertSectionBreakRequest(od as api.InsertSectionBreakRequest);
     });
   });
@@ -5860,7 +5971,9 @@
   unittest.group('obj-schema-InsertTableColumnRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertTableColumnRequest();
-      var od = api.InsertTableColumnRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertTableColumnRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertTableColumnRequest(od as api.InsertTableColumnRequest);
     });
   });
@@ -5868,7 +5981,9 @@
   unittest.group('obj-schema-InsertTableRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertTableRequest();
-      var od = api.InsertTableRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertTableRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertTableRequest(od as api.InsertTableRequest);
     });
   });
@@ -5876,7 +5991,9 @@
   unittest.group('obj-schema-InsertTableRowRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertTableRowRequest();
-      var od = api.InsertTableRowRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertTableRowRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertTableRowRequest(od as api.InsertTableRowRequest);
     });
   });
@@ -5884,7 +6001,9 @@
   unittest.group('obj-schema-InsertTextRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertTextRequest();
-      var od = api.InsertTextRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertTextRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertTextRequest(od as api.InsertTextRequest);
     });
   });
@@ -5892,7 +6011,8 @@
   unittest.group('obj-schema-Link', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLink();
-      var od = api.Link.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Link.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLink(od as api.Link);
     });
   });
@@ -5900,7 +6020,9 @@
   unittest.group('obj-schema-LinkedContentReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinkedContentReference();
-      var od = api.LinkedContentReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LinkedContentReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLinkedContentReference(od as api.LinkedContentReference);
     });
   });
@@ -5908,7 +6030,9 @@
   unittest.group('obj-schema-LinkedContentReferenceSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinkedContentReferenceSuggestionState();
-      var od = api.LinkedContentReferenceSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LinkedContentReferenceSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLinkedContentReferenceSuggestionState(
           od as api.LinkedContentReferenceSuggestionState);
     });
@@ -5917,7 +6041,8 @@
   unittest.group('obj-schema-List', () {
     unittest.test('to-json--from-json', () async {
       var o = buildList();
-      var od = api.List.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.List.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkList(od as api.List);
     });
   });
@@ -5925,7 +6050,9 @@
   unittest.group('obj-schema-ListProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListProperties();
-      var od = api.ListProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListProperties(od as api.ListProperties);
     });
   });
@@ -5933,7 +6060,9 @@
   unittest.group('obj-schema-ListPropertiesSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPropertiesSuggestionState();
-      var od = api.ListPropertiesSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPropertiesSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPropertiesSuggestionState(
           od as api.ListPropertiesSuggestionState);
     });
@@ -5942,7 +6071,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -5950,7 +6081,9 @@
   unittest.group('obj-schema-MergeTableCellsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMergeTableCellsRequest();
-      var od = api.MergeTableCellsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MergeTableCellsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMergeTableCellsRequest(od as api.MergeTableCellsRequest);
     });
   });
@@ -5958,7 +6091,9 @@
   unittest.group('obj-schema-NamedRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamedRange();
-      var od = api.NamedRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NamedRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNamedRange(od as api.NamedRange);
     });
   });
@@ -5966,7 +6101,9 @@
   unittest.group('obj-schema-NamedRanges', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamedRanges();
-      var od = api.NamedRanges.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NamedRanges.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNamedRanges(od as api.NamedRanges);
     });
   });
@@ -5974,7 +6111,9 @@
   unittest.group('obj-schema-NamedStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamedStyle();
-      var od = api.NamedStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NamedStyle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNamedStyle(od as api.NamedStyle);
     });
   });
@@ -5982,7 +6121,9 @@
   unittest.group('obj-schema-NamedStyleSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamedStyleSuggestionState();
-      var od = api.NamedStyleSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NamedStyleSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNamedStyleSuggestionState(od as api.NamedStyleSuggestionState);
     });
   });
@@ -5990,7 +6131,9 @@
   unittest.group('obj-schema-NamedStyles', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamedStyles();
-      var od = api.NamedStyles.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NamedStyles.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNamedStyles(od as api.NamedStyles);
     });
   });
@@ -5998,7 +6141,9 @@
   unittest.group('obj-schema-NamedStylesSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamedStylesSuggestionState();
-      var od = api.NamedStylesSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NamedStylesSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNamedStylesSuggestionState(od as api.NamedStylesSuggestionState);
     });
   });
@@ -6006,7 +6151,9 @@
   unittest.group('obj-schema-NestingLevel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNestingLevel();
-      var od = api.NestingLevel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NestingLevel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNestingLevel(od as api.NestingLevel);
     });
   });
@@ -6014,7 +6161,9 @@
   unittest.group('obj-schema-NestingLevelSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNestingLevelSuggestionState();
-      var od = api.NestingLevelSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NestingLevelSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNestingLevelSuggestionState(od as api.NestingLevelSuggestionState);
     });
   });
@@ -6022,7 +6171,9 @@
   unittest.group('obj-schema-ObjectReferences', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectReferences();
-      var od = api.ObjectReferences.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectReferences.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectReferences(od as api.ObjectReferences);
     });
   });
@@ -6030,7 +6181,9 @@
   unittest.group('obj-schema-OptionalColor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOptionalColor();
-      var od = api.OptionalColor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OptionalColor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOptionalColor(od as api.OptionalColor);
     });
   });
@@ -6038,7 +6191,9 @@
   unittest.group('obj-schema-PageBreak', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageBreak();
-      var od = api.PageBreak.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PageBreak.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPageBreak(od as api.PageBreak);
     });
   });
@@ -6046,7 +6201,9 @@
   unittest.group('obj-schema-Paragraph', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParagraph();
-      var od = api.Paragraph.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Paragraph.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkParagraph(od as api.Paragraph);
     });
   });
@@ -6054,7 +6211,9 @@
   unittest.group('obj-schema-ParagraphBorder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParagraphBorder();
-      var od = api.ParagraphBorder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParagraphBorder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParagraphBorder(od as api.ParagraphBorder);
     });
   });
@@ -6062,7 +6221,9 @@
   unittest.group('obj-schema-ParagraphElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParagraphElement();
-      var od = api.ParagraphElement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParagraphElement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParagraphElement(od as api.ParagraphElement);
     });
   });
@@ -6070,7 +6231,9 @@
   unittest.group('obj-schema-ParagraphStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParagraphStyle();
-      var od = api.ParagraphStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParagraphStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParagraphStyle(od as api.ParagraphStyle);
     });
   });
@@ -6078,7 +6241,9 @@
   unittest.group('obj-schema-ParagraphStyleSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParagraphStyleSuggestionState();
-      var od = api.ParagraphStyleSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParagraphStyleSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParagraphStyleSuggestionState(
           od as api.ParagraphStyleSuggestionState);
     });
@@ -6087,7 +6252,9 @@
   unittest.group('obj-schema-PositionedObject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPositionedObject();
-      var od = api.PositionedObject.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PositionedObject.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPositionedObject(od as api.PositionedObject);
     });
   });
@@ -6095,7 +6262,9 @@
   unittest.group('obj-schema-PositionedObjectPositioning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPositionedObjectPositioning();
-      var od = api.PositionedObjectPositioning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PositionedObjectPositioning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPositionedObjectPositioning(od as api.PositionedObjectPositioning);
     });
   });
@@ -6103,8 +6272,9 @@
   unittest.group('obj-schema-PositionedObjectPositioningSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPositionedObjectPositioningSuggestionState();
-      var od =
-          api.PositionedObjectPositioningSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PositionedObjectPositioningSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPositionedObjectPositioningSuggestionState(
           od as api.PositionedObjectPositioningSuggestionState);
     });
@@ -6113,7 +6283,9 @@
   unittest.group('obj-schema-PositionedObjectProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPositionedObjectProperties();
-      var od = api.PositionedObjectProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PositionedObjectProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPositionedObjectProperties(od as api.PositionedObjectProperties);
     });
   });
@@ -6121,8 +6293,9 @@
   unittest.group('obj-schema-PositionedObjectPropertiesSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPositionedObjectPropertiesSuggestionState();
-      var od =
-          api.PositionedObjectPropertiesSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PositionedObjectPropertiesSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPositionedObjectPropertiesSuggestionState(
           od as api.PositionedObjectPropertiesSuggestionState);
     });
@@ -6131,7 +6304,8 @@
   unittest.group('obj-schema-Range', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRange();
-      var od = api.Range.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Range.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRange(od as api.Range);
     });
   });
@@ -6139,7 +6313,9 @@
   unittest.group('obj-schema-ReplaceAllTextRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceAllTextRequest();
-      var od = api.ReplaceAllTextRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceAllTextRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceAllTextRequest(od as api.ReplaceAllTextRequest);
     });
   });
@@ -6147,7 +6323,9 @@
   unittest.group('obj-schema-ReplaceAllTextResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceAllTextResponse();
-      var od = api.ReplaceAllTextResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceAllTextResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceAllTextResponse(od as api.ReplaceAllTextResponse);
     });
   });
@@ -6155,7 +6333,9 @@
   unittest.group('obj-schema-ReplaceImageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceImageRequest();
-      var od = api.ReplaceImageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceImageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceImageRequest(od as api.ReplaceImageRequest);
     });
   });
@@ -6163,7 +6343,9 @@
   unittest.group('obj-schema-ReplaceNamedRangeContentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceNamedRangeContentRequest();
-      var od = api.ReplaceNamedRangeContentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceNamedRangeContentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceNamedRangeContentRequest(
           od as api.ReplaceNamedRangeContentRequest);
     });
@@ -6172,7 +6354,9 @@
   unittest.group('obj-schema-Request', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequest();
-      var od = api.Request.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Request.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRequest(od as api.Request);
     });
   });
@@ -6180,7 +6364,9 @@
   unittest.group('obj-schema-Response', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResponse();
-      var od = api.Response.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Response.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResponse(od as api.Response);
     });
   });
@@ -6188,7 +6374,9 @@
   unittest.group('obj-schema-RgbColor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRgbColor();
-      var od = api.RgbColor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RgbColor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRgbColor(od as api.RgbColor);
     });
   });
@@ -6196,7 +6384,9 @@
   unittest.group('obj-schema-SectionBreak', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSectionBreak();
-      var od = api.SectionBreak.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SectionBreak.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSectionBreak(od as api.SectionBreak);
     });
   });
@@ -6204,7 +6394,9 @@
   unittest.group('obj-schema-SectionColumnProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSectionColumnProperties();
-      var od = api.SectionColumnProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SectionColumnProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSectionColumnProperties(od as api.SectionColumnProperties);
     });
   });
@@ -6212,7 +6404,9 @@
   unittest.group('obj-schema-SectionStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSectionStyle();
-      var od = api.SectionStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SectionStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSectionStyle(od as api.SectionStyle);
     });
   });
@@ -6220,7 +6414,9 @@
   unittest.group('obj-schema-Shading', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShading();
-      var od = api.Shading.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Shading.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkShading(od as api.Shading);
     });
   });
@@ -6228,7 +6424,9 @@
   unittest.group('obj-schema-ShadingSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShadingSuggestionState();
-      var od = api.ShadingSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShadingSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShadingSuggestionState(od as api.ShadingSuggestionState);
     });
   });
@@ -6236,7 +6434,9 @@
   unittest.group('obj-schema-SheetsChartReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSheetsChartReference();
-      var od = api.SheetsChartReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SheetsChartReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSheetsChartReference(od as api.SheetsChartReference);
     });
   });
@@ -6244,7 +6444,9 @@
   unittest.group('obj-schema-SheetsChartReferenceSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSheetsChartReferenceSuggestionState();
-      var od = api.SheetsChartReferenceSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SheetsChartReferenceSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSheetsChartReferenceSuggestionState(
           od as api.SheetsChartReferenceSuggestionState);
     });
@@ -6253,7 +6455,8 @@
   unittest.group('obj-schema-Size', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSize();
-      var od = api.Size.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Size.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSize(od as api.Size);
     });
   });
@@ -6261,7 +6464,9 @@
   unittest.group('obj-schema-SizeSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSizeSuggestionState();
-      var od = api.SizeSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SizeSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSizeSuggestionState(od as api.SizeSuggestionState);
     });
   });
@@ -6269,7 +6474,9 @@
   unittest.group('obj-schema-StructuralElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStructuralElement();
-      var od = api.StructuralElement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StructuralElement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStructuralElement(od as api.StructuralElement);
     });
   });
@@ -6277,7 +6484,9 @@
   unittest.group('obj-schema-SubstringMatchCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubstringMatchCriteria();
-      var od = api.SubstringMatchCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubstringMatchCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubstringMatchCriteria(od as api.SubstringMatchCriteria);
     });
   });
@@ -6285,7 +6494,9 @@
   unittest.group('obj-schema-SuggestedBullet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestedBullet();
-      var od = api.SuggestedBullet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestedBullet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestedBullet(od as api.SuggestedBullet);
     });
   });
@@ -6293,7 +6504,9 @@
   unittest.group('obj-schema-SuggestedDocumentStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestedDocumentStyle();
-      var od = api.SuggestedDocumentStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestedDocumentStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestedDocumentStyle(od as api.SuggestedDocumentStyle);
     });
   });
@@ -6301,7 +6514,9 @@
   unittest.group('obj-schema-SuggestedInlineObjectProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestedInlineObjectProperties();
-      var od = api.SuggestedInlineObjectProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestedInlineObjectProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestedInlineObjectProperties(
           od as api.SuggestedInlineObjectProperties);
     });
@@ -6310,7 +6525,9 @@
   unittest.group('obj-schema-SuggestedListProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestedListProperties();
-      var od = api.SuggestedListProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestedListProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestedListProperties(od as api.SuggestedListProperties);
     });
   });
@@ -6318,7 +6535,9 @@
   unittest.group('obj-schema-SuggestedNamedStyles', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestedNamedStyles();
-      var od = api.SuggestedNamedStyles.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestedNamedStyles.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestedNamedStyles(od as api.SuggestedNamedStyles);
     });
   });
@@ -6326,7 +6545,9 @@
   unittest.group('obj-schema-SuggestedParagraphStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestedParagraphStyle();
-      var od = api.SuggestedParagraphStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestedParagraphStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestedParagraphStyle(od as api.SuggestedParagraphStyle);
     });
   });
@@ -6334,7 +6555,9 @@
   unittest.group('obj-schema-SuggestedPositionedObjectProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestedPositionedObjectProperties();
-      var od = api.SuggestedPositionedObjectProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestedPositionedObjectProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestedPositionedObjectProperties(
           od as api.SuggestedPositionedObjectProperties);
     });
@@ -6343,7 +6566,9 @@
   unittest.group('obj-schema-SuggestedTableCellStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestedTableCellStyle();
-      var od = api.SuggestedTableCellStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestedTableCellStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestedTableCellStyle(od as api.SuggestedTableCellStyle);
     });
   });
@@ -6351,7 +6576,9 @@
   unittest.group('obj-schema-SuggestedTableRowStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestedTableRowStyle();
-      var od = api.SuggestedTableRowStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestedTableRowStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestedTableRowStyle(od as api.SuggestedTableRowStyle);
     });
   });
@@ -6359,7 +6586,9 @@
   unittest.group('obj-schema-SuggestedTextStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestedTextStyle();
-      var od = api.SuggestedTextStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestedTextStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestedTextStyle(od as api.SuggestedTextStyle);
     });
   });
@@ -6367,7 +6596,9 @@
   unittest.group('obj-schema-TabStop', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTabStop();
-      var od = api.TabStop.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TabStop.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTabStop(od as api.TabStop);
     });
   });
@@ -6375,7 +6606,8 @@
   unittest.group('obj-schema-Table', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTable();
-      var od = api.Table.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Table.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTable(od as api.Table);
     });
   });
@@ -6383,7 +6615,9 @@
   unittest.group('obj-schema-TableCell', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableCell();
-      var od = api.TableCell.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TableCell.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTableCell(od as api.TableCell);
     });
   });
@@ -6391,7 +6625,9 @@
   unittest.group('obj-schema-TableCellBorder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableCellBorder();
-      var od = api.TableCellBorder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableCellBorder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableCellBorder(od as api.TableCellBorder);
     });
   });
@@ -6399,7 +6635,9 @@
   unittest.group('obj-schema-TableCellLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableCellLocation();
-      var od = api.TableCellLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableCellLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableCellLocation(od as api.TableCellLocation);
     });
   });
@@ -6407,7 +6645,9 @@
   unittest.group('obj-schema-TableCellStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableCellStyle();
-      var od = api.TableCellStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableCellStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableCellStyle(od as api.TableCellStyle);
     });
   });
@@ -6415,7 +6655,9 @@
   unittest.group('obj-schema-TableCellStyleSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableCellStyleSuggestionState();
-      var od = api.TableCellStyleSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableCellStyleSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableCellStyleSuggestionState(
           od as api.TableCellStyleSuggestionState);
     });
@@ -6424,7 +6666,9 @@
   unittest.group('obj-schema-TableColumnProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableColumnProperties();
-      var od = api.TableColumnProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableColumnProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableColumnProperties(od as api.TableColumnProperties);
     });
   });
@@ -6432,7 +6676,9 @@
   unittest.group('obj-schema-TableOfContents', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableOfContents();
-      var od = api.TableOfContents.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableOfContents.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableOfContents(od as api.TableOfContents);
     });
   });
@@ -6440,7 +6686,9 @@
   unittest.group('obj-schema-TableRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableRange();
-      var od = api.TableRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TableRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTableRange(od as api.TableRange);
     });
   });
@@ -6448,7 +6696,9 @@
   unittest.group('obj-schema-TableRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableRow();
-      var od = api.TableRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TableRow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTableRow(od as api.TableRow);
     });
   });
@@ -6456,7 +6706,9 @@
   unittest.group('obj-schema-TableRowStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableRowStyle();
-      var od = api.TableRowStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableRowStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableRowStyle(od as api.TableRowStyle);
     });
   });
@@ -6464,7 +6716,9 @@
   unittest.group('obj-schema-TableRowStyleSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableRowStyleSuggestionState();
-      var od = api.TableRowStyleSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableRowStyleSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableRowStyleSuggestionState(od as api.TableRowStyleSuggestionState);
     });
   });
@@ -6472,7 +6726,9 @@
   unittest.group('obj-schema-TableStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableStyle();
-      var od = api.TableStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TableStyle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTableStyle(od as api.TableStyle);
     });
   });
@@ -6480,7 +6736,9 @@
   unittest.group('obj-schema-TextRun', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextRun();
-      var od = api.TextRun.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextRun.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextRun(od as api.TextRun);
     });
   });
@@ -6488,7 +6746,9 @@
   unittest.group('obj-schema-TextStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextStyle();
-      var od = api.TextStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextStyle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextStyle(od as api.TextStyle);
     });
   });
@@ -6496,7 +6756,9 @@
   unittest.group('obj-schema-TextStyleSuggestionState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextStyleSuggestionState();
-      var od = api.TextStyleSuggestionState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextStyleSuggestionState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextStyleSuggestionState(od as api.TextStyleSuggestionState);
     });
   });
@@ -6504,7 +6766,9 @@
   unittest.group('obj-schema-UnmergeTableCellsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnmergeTableCellsRequest();
-      var od = api.UnmergeTableCellsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnmergeTableCellsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnmergeTableCellsRequest(od as api.UnmergeTableCellsRequest);
     });
   });
@@ -6512,7 +6776,9 @@
   unittest.group('obj-schema-UpdateDocumentStyleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDocumentStyleRequest();
-      var od = api.UpdateDocumentStyleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDocumentStyleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDocumentStyleRequest(od as api.UpdateDocumentStyleRequest);
     });
   });
@@ -6520,7 +6786,9 @@
   unittest.group('obj-schema-UpdateParagraphStyleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateParagraphStyleRequest();
-      var od = api.UpdateParagraphStyleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateParagraphStyleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateParagraphStyleRequest(od as api.UpdateParagraphStyleRequest);
     });
   });
@@ -6528,7 +6796,9 @@
   unittest.group('obj-schema-UpdateSectionStyleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateSectionStyleRequest();
-      var od = api.UpdateSectionStyleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateSectionStyleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateSectionStyleRequest(od as api.UpdateSectionStyleRequest);
     });
   });
@@ -6536,7 +6806,9 @@
   unittest.group('obj-schema-UpdateTableCellStyleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTableCellStyleRequest();
-      var od = api.UpdateTableCellStyleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTableCellStyleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTableCellStyleRequest(od as api.UpdateTableCellStyleRequest);
     });
   });
@@ -6544,7 +6816,9 @@
   unittest.group('obj-schema-UpdateTableColumnPropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTableColumnPropertiesRequest();
-      var od = api.UpdateTableColumnPropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTableColumnPropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTableColumnPropertiesRequest(
           od as api.UpdateTableColumnPropertiesRequest);
     });
@@ -6553,7 +6827,9 @@
   unittest.group('obj-schema-UpdateTableRowStyleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTableRowStyleRequest();
-      var od = api.UpdateTableRowStyleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTableRowStyleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTableRowStyleRequest(od as api.UpdateTableRowStyleRequest);
     });
   });
@@ -6561,7 +6837,9 @@
   unittest.group('obj-schema-UpdateTextStyleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTextStyleRequest();
-      var od = api.UpdateTextStyleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTextStyleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTextStyleRequest(od as api.UpdateTextStyleRequest);
     });
   });
@@ -6569,7 +6847,9 @@
   unittest.group('obj-schema-WeightedFontFamily', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWeightedFontFamily();
-      var od = api.WeightedFontFamily.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WeightedFontFamily.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWeightedFontFamily(od as api.WeightedFontFamily);
     });
   });
@@ -6577,7 +6857,9 @@
   unittest.group('obj-schema-WriteControl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWriteControl();
-      var od = api.WriteControl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WriteControl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWriteControl(od as api.WriteControl);
     });
   });
diff --git a/generated/googleapis/test/domainsrdap/v1_test.dart b/generated/googleapis/test/domainsrdap/v1_test.dart
index fe0be08..834b5dc 100644
--- a/generated/googleapis/test/domainsrdap/v1_test.dart
+++ b/generated/googleapis/test/domainsrdap/v1_test.dart
@@ -326,7 +326,9 @@
   unittest.group('obj-schema-HttpBody', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpBody();
-      var od = api.HttpBody.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpBody.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpBody(od as api.HttpBody);
     });
   });
@@ -334,7 +336,8 @@
   unittest.group('obj-schema-Link', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLink();
-      var od = api.Link.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Link.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLink(od as api.Link);
     });
   });
@@ -342,7 +345,9 @@
   unittest.group('obj-schema-Notice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotice();
-      var od = api.Notice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Notice.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNotice(od as api.Notice);
     });
   });
@@ -350,7 +355,9 @@
   unittest.group('obj-schema-RdapResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRdapResponse();
-      var od = api.RdapResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RdapResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRdapResponse(od as api.RdapResponse);
     });
   });
diff --git a/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart b/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart
index d5b13d4..f897fdf 100644
--- a/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart
+++ b/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart
@@ -1194,7 +1194,9 @@
   unittest.group('obj-schema-ChannelGrouping', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelGrouping();
-      var od = api.ChannelGrouping.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelGrouping.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelGrouping(od as api.ChannelGrouping);
     });
   });
@@ -1202,7 +1204,9 @@
   unittest.group('obj-schema-DisjunctiveMatchStatement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisjunctiveMatchStatement();
-      var od = api.DisjunctiveMatchStatement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisjunctiveMatchStatement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisjunctiveMatchStatement(od as api.DisjunctiveMatchStatement);
     });
   });
@@ -1210,7 +1214,9 @@
   unittest.group('obj-schema-DownloadLineItemsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDownloadLineItemsRequest();
-      var od = api.DownloadLineItemsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DownloadLineItemsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDownloadLineItemsRequest(od as api.DownloadLineItemsRequest);
     });
   });
@@ -1218,7 +1224,9 @@
   unittest.group('obj-schema-DownloadLineItemsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDownloadLineItemsResponse();
-      var od = api.DownloadLineItemsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DownloadLineItemsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDownloadLineItemsResponse(od as api.DownloadLineItemsResponse);
     });
   });
@@ -1226,7 +1234,9 @@
   unittest.group('obj-schema-DownloadRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDownloadRequest();
-      var od = api.DownloadRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DownloadRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDownloadRequest(od as api.DownloadRequest);
     });
   });
@@ -1234,7 +1244,9 @@
   unittest.group('obj-schema-DownloadResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDownloadResponse();
-      var od = api.DownloadResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DownloadResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDownloadResponse(od as api.DownloadResponse);
     });
   });
@@ -1242,7 +1254,9 @@
   unittest.group('obj-schema-EventFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventFilter();
-      var od = api.EventFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventFilter(od as api.EventFilter);
     });
   });
@@ -1250,7 +1264,9 @@
   unittest.group('obj-schema-FilterPair', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterPair();
-      var od = api.FilterPair.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FilterPair.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilterPair(od as api.FilterPair);
     });
   });
@@ -1258,7 +1274,9 @@
   unittest.group('obj-schema-ListQueriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListQueriesResponse();
-      var od = api.ListQueriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListQueriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListQueriesResponse(od as api.ListQueriesResponse);
     });
   });
@@ -1266,7 +1284,9 @@
   unittest.group('obj-schema-ListReportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListReportsResponse();
-      var od = api.ListReportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListReportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListReportsResponse(od as api.ListReportsResponse);
     });
   });
@@ -1274,7 +1294,9 @@
   unittest.group('obj-schema-Options', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOptions();
-      var od = api.Options.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Options.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOptions(od as api.Options);
     });
   });
@@ -1282,7 +1304,9 @@
   unittest.group('obj-schema-Parameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParameters();
-      var od = api.Parameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Parameters.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkParameters(od as api.Parameters);
     });
   });
@@ -1290,7 +1314,9 @@
   unittest.group('obj-schema-PathFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathFilter();
-      var od = api.PathFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PathFilter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPathFilter(od as api.PathFilter);
     });
   });
@@ -1298,7 +1324,9 @@
   unittest.group('obj-schema-PathQueryOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathQueryOptions();
-      var od = api.PathQueryOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PathQueryOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPathQueryOptions(od as api.PathQueryOptions);
     });
   });
@@ -1306,7 +1334,9 @@
   unittest.group('obj-schema-PathQueryOptionsFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathQueryOptionsFilter();
-      var od = api.PathQueryOptionsFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PathQueryOptionsFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPathQueryOptionsFilter(od as api.PathQueryOptionsFilter);
     });
   });
@@ -1314,7 +1344,8 @@
   unittest.group('obj-schema-Query', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuery();
-      var od = api.Query.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Query.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuery(od as api.Query);
     });
   });
@@ -1322,7 +1353,9 @@
   unittest.group('obj-schema-QueryMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryMetadata();
-      var od = api.QueryMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryMetadata(od as api.QueryMetadata);
     });
   });
@@ -1330,7 +1363,9 @@
   unittest.group('obj-schema-QuerySchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuerySchedule();
-      var od = api.QuerySchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QuerySchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQuerySchedule(od as api.QuerySchedule);
     });
   });
@@ -1338,7 +1373,9 @@
   unittest.group('obj-schema-Report', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReport();
-      var od = api.Report.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Report.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReport(od as api.Report);
     });
   });
@@ -1346,7 +1383,9 @@
   unittest.group('obj-schema-ReportFailure', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportFailure();
-      var od = api.ReportFailure.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportFailure.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportFailure(od as api.ReportFailure);
     });
   });
@@ -1354,7 +1393,9 @@
   unittest.group('obj-schema-ReportKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportKey();
-      var od = api.ReportKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReportKey.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReportKey(od as api.ReportKey);
     });
   });
@@ -1362,7 +1403,9 @@
   unittest.group('obj-schema-ReportMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportMetadata();
-      var od = api.ReportMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportMetadata(od as api.ReportMetadata);
     });
   });
@@ -1370,7 +1413,9 @@
   unittest.group('obj-schema-ReportStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportStatus();
-      var od = api.ReportStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportStatus(od as api.ReportStatus);
     });
   });
@@ -1378,7 +1423,9 @@
   unittest.group('obj-schema-RowStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRowStatus();
-      var od = api.RowStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RowStatus.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRowStatus(od as api.RowStatus);
     });
   });
@@ -1386,7 +1433,8 @@
   unittest.group('obj-schema-Rule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRule();
-      var od = api.Rule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Rule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRule(od as api.Rule);
     });
   });
@@ -1394,7 +1442,9 @@
   unittest.group('obj-schema-RunQueryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunQueryRequest();
-      var od = api.RunQueryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunQueryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunQueryRequest(od as api.RunQueryRequest);
     });
   });
@@ -1402,7 +1452,9 @@
   unittest.group('obj-schema-UploadLineItemsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUploadLineItemsRequest();
-      var od = api.UploadLineItemsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UploadLineItemsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUploadLineItemsRequest(od as api.UploadLineItemsRequest);
     });
   });
@@ -1410,7 +1462,9 @@
   unittest.group('obj-schema-UploadLineItemsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUploadLineItemsResponse();
-      var od = api.UploadLineItemsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UploadLineItemsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUploadLineItemsResponse(od as api.UploadLineItemsResponse);
     });
   });
@@ -1418,7 +1472,9 @@
   unittest.group('obj-schema-UploadStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUploadStatus();
-      var od = api.UploadStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UploadStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUploadStatus(od as api.UploadStatus);
     });
   });
diff --git a/generated/googleapis/test/doubleclicksearch/v2_test.dart b/generated/googleapis/test/doubleclicksearch/v2_test.dart
index bc3a595..1ff95fe 100644
--- a/generated/googleapis/test/doubleclicksearch/v2_test.dart
+++ b/generated/googleapis/test/doubleclicksearch/v2_test.dart
@@ -1007,7 +1007,9 @@
   unittest.group('obj-schema-Availability', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAvailability();
-      var od = api.Availability.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Availability.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAvailability(od as api.Availability);
     });
   });
@@ -1015,7 +1017,9 @@
   unittest.group('obj-schema-Conversion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConversion();
-      var od = api.Conversion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Conversion.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkConversion(od as api.Conversion);
     });
   });
@@ -1023,7 +1027,9 @@
   unittest.group('obj-schema-ConversionList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConversionList();
-      var od = api.ConversionList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConversionList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConversionList(od as api.ConversionList);
     });
   });
@@ -1031,7 +1037,9 @@
   unittest.group('obj-schema-CustomDimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomDimension();
-      var od = api.CustomDimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomDimension.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomDimension(od as api.CustomDimension);
     });
   });
@@ -1039,7 +1047,9 @@
   unittest.group('obj-schema-CustomMetric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomMetric();
-      var od = api.CustomMetric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomMetric.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomMetric(od as api.CustomMetric);
     });
   });
@@ -1047,7 +1057,9 @@
   unittest.group('obj-schema-ReportFiles', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportFiles();
-      var od = api.ReportFiles.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportFiles.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportFiles(od as api.ReportFiles);
     });
   });
@@ -1055,7 +1067,9 @@
   unittest.group('obj-schema-Report', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReport();
-      var od = api.Report.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Report.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReport(od as api.Report);
     });
   });
@@ -1063,7 +1077,9 @@
   unittest.group('obj-schema-ReportApiColumnSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportApiColumnSpec();
-      var od = api.ReportApiColumnSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportApiColumnSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportApiColumnSpec(od as api.ReportApiColumnSpec);
     });
   });
@@ -1071,7 +1087,9 @@
   unittest.group('obj-schema-ReportRequestFilters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRequestFilters();
-      var od = api.ReportRequestFilters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRequestFilters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRequestFilters(od as api.ReportRequestFilters);
     });
   });
@@ -1079,7 +1097,9 @@
   unittest.group('obj-schema-ReportRequestOrderBy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRequestOrderBy();
-      var od = api.ReportRequestOrderBy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRequestOrderBy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRequestOrderBy(od as api.ReportRequestOrderBy);
     });
   });
@@ -1087,7 +1107,9 @@
   unittest.group('obj-schema-ReportRequestReportScope', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRequestReportScope();
-      var od = api.ReportRequestReportScope.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRequestReportScope.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRequestReportScope(od as api.ReportRequestReportScope);
     });
   });
@@ -1095,7 +1117,9 @@
   unittest.group('obj-schema-ReportRequestTimeRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRequestTimeRange();
-      var od = api.ReportRequestTimeRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRequestTimeRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRequestTimeRange(od as api.ReportRequestTimeRange);
     });
   });
@@ -1103,7 +1127,9 @@
   unittest.group('obj-schema-ReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRequest();
-      var od = api.ReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRequest(od as api.ReportRequest);
     });
   });
@@ -1111,7 +1137,9 @@
   unittest.group('obj-schema-ReportRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRow();
-      var od = api.ReportRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReportRow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReportRow(od as api.ReportRow);
     });
   });
@@ -1119,7 +1147,9 @@
   unittest.group('obj-schema-SavedColumn', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSavedColumn();
-      var od = api.SavedColumn.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SavedColumn.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSavedColumn(od as api.SavedColumn);
     });
   });
@@ -1127,7 +1157,9 @@
   unittest.group('obj-schema-SavedColumnList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSavedColumnList();
-      var od = api.SavedColumnList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SavedColumnList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSavedColumnList(od as api.SavedColumnList);
     });
   });
@@ -1135,7 +1167,9 @@
   unittest.group('obj-schema-UpdateAvailabilityRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateAvailabilityRequest();
-      var od = api.UpdateAvailabilityRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateAvailabilityRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateAvailabilityRequest(od as api.UpdateAvailabilityRequest);
     });
   });
@@ -1143,7 +1177,9 @@
   unittest.group('obj-schema-UpdateAvailabilityResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateAvailabilityResponse();
-      var od = api.UpdateAvailabilityResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateAvailabilityResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateAvailabilityResponse(od as api.UpdateAvailabilityResponse);
     });
   });
diff --git a/generated/googleapis/test/drive/v2_test.dart b/generated/googleapis/test/drive/v2_test.dart
index af7bb68..f3a264a 100644
--- a/generated/googleapis/test/drive/v2_test.dart
+++ b/generated/googleapis/test/drive/v2_test.dart
@@ -3605,7 +3605,9 @@
   unittest.group('obj-schema-AboutAdditionalRoleInfoRoleSets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutAdditionalRoleInfoRoleSets();
-      var od = api.AboutAdditionalRoleInfoRoleSets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutAdditionalRoleInfoRoleSets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutAdditionalRoleInfoRoleSets(
           od as api.AboutAdditionalRoleInfoRoleSets);
     });
@@ -3614,7 +3616,9 @@
   unittest.group('obj-schema-AboutAdditionalRoleInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutAdditionalRoleInfo();
-      var od = api.AboutAdditionalRoleInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutAdditionalRoleInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutAdditionalRoleInfo(od as api.AboutAdditionalRoleInfo);
     });
   });
@@ -3622,7 +3626,9 @@
   unittest.group('obj-schema-AboutDriveThemes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutDriveThemes();
-      var od = api.AboutDriveThemes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutDriveThemes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutDriveThemes(od as api.AboutDriveThemes);
     });
   });
@@ -3630,7 +3636,9 @@
   unittest.group('obj-schema-AboutExportFormats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutExportFormats();
-      var od = api.AboutExportFormats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutExportFormats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutExportFormats(od as api.AboutExportFormats);
     });
   });
@@ -3638,7 +3646,9 @@
   unittest.group('obj-schema-AboutFeatures', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutFeatures();
-      var od = api.AboutFeatures.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutFeatures.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutFeatures(od as api.AboutFeatures);
     });
   });
@@ -3646,7 +3656,9 @@
   unittest.group('obj-schema-AboutImportFormats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutImportFormats();
-      var od = api.AboutImportFormats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutImportFormats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutImportFormats(od as api.AboutImportFormats);
     });
   });
@@ -3654,7 +3666,9 @@
   unittest.group('obj-schema-AboutMaxUploadSizes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutMaxUploadSizes();
-      var od = api.AboutMaxUploadSizes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutMaxUploadSizes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutMaxUploadSizes(od as api.AboutMaxUploadSizes);
     });
   });
@@ -3662,7 +3676,9 @@
   unittest.group('obj-schema-AboutQuotaBytesByService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutQuotaBytesByService();
-      var od = api.AboutQuotaBytesByService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutQuotaBytesByService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutQuotaBytesByService(od as api.AboutQuotaBytesByService);
     });
   });
@@ -3670,7 +3686,9 @@
   unittest.group('obj-schema-AboutTeamDriveThemes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutTeamDriveThemes();
-      var od = api.AboutTeamDriveThemes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutTeamDriveThemes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutTeamDriveThemes(od as api.AboutTeamDriveThemes);
     });
   });
@@ -3678,7 +3696,8 @@
   unittest.group('obj-schema-About', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAbout();
-      var od = api.About.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.About.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAbout(od as api.About);
     });
   });
@@ -3686,7 +3705,9 @@
   unittest.group('obj-schema-AppIcons', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppIcons();
-      var od = api.AppIcons.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AppIcons.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAppIcons(od as api.AppIcons);
     });
   });
@@ -3694,7 +3715,8 @@
   unittest.group('obj-schema-App', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApp();
-      var od = api.App.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.App.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApp(od as api.App);
     });
   });
@@ -3702,7 +3724,9 @@
   unittest.group('obj-schema-AppList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppList();
-      var od = api.AppList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AppList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAppList(od as api.AppList);
     });
   });
@@ -3710,7 +3734,9 @@
   unittest.group('obj-schema-Change', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChange();
-      var od = api.Change.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Change.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChange(od as api.Change);
     });
   });
@@ -3718,7 +3744,9 @@
   unittest.group('obj-schema-ChangeList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChangeList();
-      var od = api.ChangeList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ChangeList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChangeList(od as api.ChangeList);
     });
   });
@@ -3726,7 +3754,9 @@
   unittest.group('obj-schema-Channel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannel();
-      var od = api.Channel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Channel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChannel(od as api.Channel);
     });
   });
@@ -3734,7 +3764,9 @@
   unittest.group('obj-schema-ChildList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChildList();
-      var od = api.ChildList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ChildList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChildList(od as api.ChildList);
     });
   });
@@ -3742,7 +3774,9 @@
   unittest.group('obj-schema-ChildReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChildReference();
-      var od = api.ChildReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChildReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChildReference(od as api.ChildReference);
     });
   });
@@ -3750,7 +3784,9 @@
   unittest.group('obj-schema-CommentContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentContext();
-      var od = api.CommentContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentContext(od as api.CommentContext);
     });
   });
@@ -3758,7 +3794,9 @@
   unittest.group('obj-schema-Comment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComment();
-      var od = api.Comment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Comment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkComment(od as api.Comment);
     });
   });
@@ -3766,7 +3804,9 @@
   unittest.group('obj-schema-CommentList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentList();
-      var od = api.CommentList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentList(od as api.CommentList);
     });
   });
@@ -3774,7 +3814,9 @@
   unittest.group('obj-schema-CommentReply', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentReply();
-      var od = api.CommentReply.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentReply.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentReply(od as api.CommentReply);
     });
   });
@@ -3782,7 +3824,9 @@
   unittest.group('obj-schema-CommentReplyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentReplyList();
-      var od = api.CommentReplyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentReplyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentReplyList(od as api.CommentReplyList);
     });
   });
@@ -3790,7 +3834,9 @@
   unittest.group('obj-schema-ContentRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContentRestriction();
-      var od = api.ContentRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContentRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContentRestriction(od as api.ContentRestriction);
     });
   });
@@ -3798,7 +3844,9 @@
   unittest.group('obj-schema-DriveBackgroundImageFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveBackgroundImageFile();
-      var od = api.DriveBackgroundImageFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveBackgroundImageFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveBackgroundImageFile(od as api.DriveBackgroundImageFile);
     });
   });
@@ -3806,7 +3854,9 @@
   unittest.group('obj-schema-DriveCapabilities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveCapabilities();
-      var od = api.DriveCapabilities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveCapabilities.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveCapabilities(od as api.DriveCapabilities);
     });
   });
@@ -3814,7 +3864,9 @@
   unittest.group('obj-schema-DriveRestrictions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveRestrictions();
-      var od = api.DriveRestrictions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveRestrictions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveRestrictions(od as api.DriveRestrictions);
     });
   });
@@ -3822,7 +3874,8 @@
   unittest.group('obj-schema-Drive', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDrive();
-      var od = api.Drive.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Drive.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDrive(od as api.Drive);
     });
   });
@@ -3830,7 +3883,9 @@
   unittest.group('obj-schema-DriveList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveList();
-      var od = api.DriveList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DriveList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDriveList(od as api.DriveList);
     });
   });
@@ -3838,7 +3893,9 @@
   unittest.group('obj-schema-FileCapabilities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileCapabilities();
-      var od = api.FileCapabilities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileCapabilities.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileCapabilities(od as api.FileCapabilities);
     });
   });
@@ -3846,7 +3903,9 @@
   unittest.group('obj-schema-FileImageMediaMetadataLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileImageMediaMetadataLocation();
-      var od = api.FileImageMediaMetadataLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileImageMediaMetadataLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileImageMediaMetadataLocation(
           od as api.FileImageMediaMetadataLocation);
     });
@@ -3855,7 +3914,9 @@
   unittest.group('obj-schema-FileImageMediaMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileImageMediaMetadata();
-      var od = api.FileImageMediaMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileImageMediaMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileImageMediaMetadata(od as api.FileImageMediaMetadata);
     });
   });
@@ -3863,7 +3924,9 @@
   unittest.group('obj-schema-FileIndexableText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileIndexableText();
-      var od = api.FileIndexableText.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileIndexableText.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileIndexableText(od as api.FileIndexableText);
     });
   });
@@ -3871,7 +3934,9 @@
   unittest.group('obj-schema-FileLabels', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileLabels();
-      var od = api.FileLabels.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FileLabels.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFileLabels(od as api.FileLabels);
     });
   });
@@ -3879,7 +3944,9 @@
   unittest.group('obj-schema-FileShortcutDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileShortcutDetails();
-      var od = api.FileShortcutDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileShortcutDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileShortcutDetails(od as api.FileShortcutDetails);
     });
   });
@@ -3887,7 +3954,9 @@
   unittest.group('obj-schema-FileThumbnail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileThumbnail();
-      var od = api.FileThumbnail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileThumbnail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileThumbnail(od as api.FileThumbnail);
     });
   });
@@ -3895,7 +3964,9 @@
   unittest.group('obj-schema-FileVideoMediaMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileVideoMediaMetadata();
-      var od = api.FileVideoMediaMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileVideoMediaMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileVideoMediaMetadata(od as api.FileVideoMediaMetadata);
     });
   });
@@ -3903,7 +3974,8 @@
   unittest.group('obj-schema-File', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFile();
-      var od = api.File.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.File.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFile(od as api.File);
     });
   });
@@ -3911,7 +3983,9 @@
   unittest.group('obj-schema-FileList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileList();
-      var od = api.FileList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FileList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFileList(od as api.FileList);
     });
   });
@@ -3919,7 +3993,9 @@
   unittest.group('obj-schema-GeneratedIds', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeneratedIds();
-      var od = api.GeneratedIds.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeneratedIds.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeneratedIds(od as api.GeneratedIds);
     });
   });
@@ -3927,7 +4003,9 @@
   unittest.group('obj-schema-ParentList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParentList();
-      var od = api.ParentList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ParentList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkParentList(od as api.ParentList);
     });
   });
@@ -3935,7 +4013,9 @@
   unittest.group('obj-schema-ParentReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParentReference();
-      var od = api.ParentReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParentReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParentReference(od as api.ParentReference);
     });
   });
@@ -3943,7 +4023,9 @@
   unittest.group('obj-schema-PermissionPermissionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissionPermissionDetails();
-      var od = api.PermissionPermissionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PermissionPermissionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissionPermissionDetails(od as api.PermissionPermissionDetails);
     });
   });
@@ -3951,7 +4033,9 @@
   unittest.group('obj-schema-PermissionTeamDrivePermissionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissionTeamDrivePermissionDetails();
-      var od = api.PermissionTeamDrivePermissionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PermissionTeamDrivePermissionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissionTeamDrivePermissionDetails(
           od as api.PermissionTeamDrivePermissionDetails);
     });
@@ -3960,7 +4044,9 @@
   unittest.group('obj-schema-Permission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermission();
-      var od = api.Permission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Permission.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPermission(od as api.Permission);
     });
   });
@@ -3968,7 +4054,9 @@
   unittest.group('obj-schema-PermissionId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissionId();
-      var od = api.PermissionId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PermissionId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissionId(od as api.PermissionId);
     });
   });
@@ -3976,7 +4064,9 @@
   unittest.group('obj-schema-PermissionList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissionList();
-      var od = api.PermissionList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PermissionList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissionList(od as api.PermissionList);
     });
   });
@@ -3984,7 +4074,9 @@
   unittest.group('obj-schema-Property', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProperty();
-      var od = api.Property.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Property.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProperty(od as api.Property);
     });
   });
@@ -3992,7 +4084,9 @@
   unittest.group('obj-schema-PropertyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPropertyList();
-      var od = api.PropertyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PropertyList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPropertyList(od as api.PropertyList);
     });
   });
@@ -4000,7 +4094,9 @@
   unittest.group('obj-schema-Revision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevision();
-      var od = api.Revision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Revision.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRevision(od as api.Revision);
     });
   });
@@ -4008,7 +4104,9 @@
   unittest.group('obj-schema-RevisionList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevisionList();
-      var od = api.RevisionList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevisionList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevisionList(od as api.RevisionList);
     });
   });
@@ -4016,7 +4114,9 @@
   unittest.group('obj-schema-StartPageToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartPageToken();
-      var od = api.StartPageToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartPageToken.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartPageToken(od as api.StartPageToken);
     });
   });
@@ -4024,7 +4124,9 @@
   unittest.group('obj-schema-TeamDriveBackgroundImageFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDriveBackgroundImageFile();
-      var od = api.TeamDriveBackgroundImageFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeamDriveBackgroundImageFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeamDriveBackgroundImageFile(od as api.TeamDriveBackgroundImageFile);
     });
   });
@@ -4032,7 +4134,9 @@
   unittest.group('obj-schema-TeamDriveCapabilities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDriveCapabilities();
-      var od = api.TeamDriveCapabilities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeamDriveCapabilities.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeamDriveCapabilities(od as api.TeamDriveCapabilities);
     });
   });
@@ -4040,7 +4144,9 @@
   unittest.group('obj-schema-TeamDriveRestrictions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDriveRestrictions();
-      var od = api.TeamDriveRestrictions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeamDriveRestrictions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeamDriveRestrictions(od as api.TeamDriveRestrictions);
     });
   });
@@ -4048,7 +4154,9 @@
   unittest.group('obj-schema-TeamDrive', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDrive();
-      var od = api.TeamDrive.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TeamDrive.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTeamDrive(od as api.TeamDrive);
     });
   });
@@ -4056,7 +4164,9 @@
   unittest.group('obj-schema-TeamDriveList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDriveList();
-      var od = api.TeamDriveList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeamDriveList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeamDriveList(od as api.TeamDriveList);
     });
   });
@@ -4064,7 +4174,9 @@
   unittest.group('obj-schema-UserPicture', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserPicture();
-      var od = api.UserPicture.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserPicture.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserPicture(od as api.UserPicture);
     });
   });
@@ -4072,7 +4184,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
diff --git a/generated/googleapis/test/drive/v3_test.dart b/generated/googleapis/test/drive/v3_test.dart
index 7c11b7c..7e0ca2e 100644
--- a/generated/googleapis/test/drive/v3_test.dart
+++ b/generated/googleapis/test/drive/v3_test.dart
@@ -2433,7 +2433,9 @@
   unittest.group('obj-schema-AboutDriveThemes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutDriveThemes();
-      var od = api.AboutDriveThemes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutDriveThemes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutDriveThemes(od as api.AboutDriveThemes);
     });
   });
@@ -2441,7 +2443,9 @@
   unittest.group('obj-schema-AboutStorageQuota', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutStorageQuota();
-      var od = api.AboutStorageQuota.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutStorageQuota.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutStorageQuota(od as api.AboutStorageQuota);
     });
   });
@@ -2449,7 +2453,9 @@
   unittest.group('obj-schema-AboutTeamDriveThemes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAboutTeamDriveThemes();
-      var od = api.AboutTeamDriveThemes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AboutTeamDriveThemes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAboutTeamDriveThemes(od as api.AboutTeamDriveThemes);
     });
   });
@@ -2457,7 +2463,8 @@
   unittest.group('obj-schema-About', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAbout();
-      var od = api.About.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.About.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAbout(od as api.About);
     });
   });
@@ -2465,7 +2472,9 @@
   unittest.group('obj-schema-Change', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChange();
-      var od = api.Change.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Change.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChange(od as api.Change);
     });
   });
@@ -2473,7 +2482,9 @@
   unittest.group('obj-schema-ChangeList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChangeList();
-      var od = api.ChangeList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ChangeList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChangeList(od as api.ChangeList);
     });
   });
@@ -2481,7 +2492,9 @@
   unittest.group('obj-schema-Channel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannel();
-      var od = api.Channel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Channel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChannel(od as api.Channel);
     });
   });
@@ -2489,7 +2502,9 @@
   unittest.group('obj-schema-CommentQuotedFileContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentQuotedFileContent();
-      var od = api.CommentQuotedFileContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentQuotedFileContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentQuotedFileContent(od as api.CommentQuotedFileContent);
     });
   });
@@ -2497,7 +2512,9 @@
   unittest.group('obj-schema-Comment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComment();
-      var od = api.Comment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Comment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkComment(od as api.Comment);
     });
   });
@@ -2505,7 +2522,9 @@
   unittest.group('obj-schema-CommentList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentList();
-      var od = api.CommentList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentList(od as api.CommentList);
     });
   });
@@ -2513,7 +2532,9 @@
   unittest.group('obj-schema-ContentRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContentRestriction();
-      var od = api.ContentRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContentRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContentRestriction(od as api.ContentRestriction);
     });
   });
@@ -2521,7 +2542,9 @@
   unittest.group('obj-schema-DriveBackgroundImageFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveBackgroundImageFile();
-      var od = api.DriveBackgroundImageFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveBackgroundImageFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveBackgroundImageFile(od as api.DriveBackgroundImageFile);
     });
   });
@@ -2529,7 +2552,9 @@
   unittest.group('obj-schema-DriveCapabilities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveCapabilities();
-      var od = api.DriveCapabilities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveCapabilities.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveCapabilities(od as api.DriveCapabilities);
     });
   });
@@ -2537,7 +2562,9 @@
   unittest.group('obj-schema-DriveRestrictions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveRestrictions();
-      var od = api.DriveRestrictions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveRestrictions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveRestrictions(od as api.DriveRestrictions);
     });
   });
@@ -2545,7 +2572,8 @@
   unittest.group('obj-schema-Drive', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDrive();
-      var od = api.Drive.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Drive.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDrive(od as api.Drive);
     });
   });
@@ -2553,7 +2581,9 @@
   unittest.group('obj-schema-DriveList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveList();
-      var od = api.DriveList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DriveList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDriveList(od as api.DriveList);
     });
   });
@@ -2561,7 +2591,9 @@
   unittest.group('obj-schema-FileCapabilities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileCapabilities();
-      var od = api.FileCapabilities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileCapabilities.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileCapabilities(od as api.FileCapabilities);
     });
   });
@@ -2569,7 +2601,9 @@
   unittest.group('obj-schema-FileContentHintsThumbnail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileContentHintsThumbnail();
-      var od = api.FileContentHintsThumbnail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileContentHintsThumbnail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileContentHintsThumbnail(od as api.FileContentHintsThumbnail);
     });
   });
@@ -2577,7 +2611,9 @@
   unittest.group('obj-schema-FileContentHints', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileContentHints();
-      var od = api.FileContentHints.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileContentHints.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileContentHints(od as api.FileContentHints);
     });
   });
@@ -2585,7 +2621,9 @@
   unittest.group('obj-schema-FileImageMediaMetadataLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileImageMediaMetadataLocation();
-      var od = api.FileImageMediaMetadataLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileImageMediaMetadataLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileImageMediaMetadataLocation(
           od as api.FileImageMediaMetadataLocation);
     });
@@ -2594,7 +2632,9 @@
   unittest.group('obj-schema-FileImageMediaMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileImageMediaMetadata();
-      var od = api.FileImageMediaMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileImageMediaMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileImageMediaMetadata(od as api.FileImageMediaMetadata);
     });
   });
@@ -2602,7 +2642,9 @@
   unittest.group('obj-schema-FileShortcutDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileShortcutDetails();
-      var od = api.FileShortcutDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileShortcutDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileShortcutDetails(od as api.FileShortcutDetails);
     });
   });
@@ -2610,7 +2652,9 @@
   unittest.group('obj-schema-FileVideoMediaMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileVideoMediaMetadata();
-      var od = api.FileVideoMediaMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileVideoMediaMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileVideoMediaMetadata(od as api.FileVideoMediaMetadata);
     });
   });
@@ -2618,7 +2662,8 @@
   unittest.group('obj-schema-File', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFile();
-      var od = api.File.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.File.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFile(od as api.File);
     });
   });
@@ -2626,7 +2671,9 @@
   unittest.group('obj-schema-FileList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileList();
-      var od = api.FileList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FileList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFileList(od as api.FileList);
     });
   });
@@ -2634,7 +2681,9 @@
   unittest.group('obj-schema-GeneratedIds', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeneratedIds();
-      var od = api.GeneratedIds.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GeneratedIds.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGeneratedIds(od as api.GeneratedIds);
     });
   });
@@ -2642,7 +2691,9 @@
   unittest.group('obj-schema-PermissionPermissionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissionPermissionDetails();
-      var od = api.PermissionPermissionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PermissionPermissionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissionPermissionDetails(od as api.PermissionPermissionDetails);
     });
   });
@@ -2650,7 +2701,9 @@
   unittest.group('obj-schema-PermissionTeamDrivePermissionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissionTeamDrivePermissionDetails();
-      var od = api.PermissionTeamDrivePermissionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PermissionTeamDrivePermissionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissionTeamDrivePermissionDetails(
           od as api.PermissionTeamDrivePermissionDetails);
     });
@@ -2659,7 +2712,9 @@
   unittest.group('obj-schema-Permission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermission();
-      var od = api.Permission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Permission.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPermission(od as api.Permission);
     });
   });
@@ -2667,7 +2722,9 @@
   unittest.group('obj-schema-PermissionList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissionList();
-      var od = api.PermissionList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PermissionList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissionList(od as api.PermissionList);
     });
   });
@@ -2675,7 +2732,8 @@
   unittest.group('obj-schema-Reply', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReply();
-      var od = api.Reply.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Reply.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReply(od as api.Reply);
     });
   });
@@ -2683,7 +2741,9 @@
   unittest.group('obj-schema-ReplyList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplyList();
-      var od = api.ReplyList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReplyList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReplyList(od as api.ReplyList);
     });
   });
@@ -2691,7 +2751,9 @@
   unittest.group('obj-schema-Revision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevision();
-      var od = api.Revision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Revision.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRevision(od as api.Revision);
     });
   });
@@ -2699,7 +2761,9 @@
   unittest.group('obj-schema-RevisionList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevisionList();
-      var od = api.RevisionList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevisionList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevisionList(od as api.RevisionList);
     });
   });
@@ -2707,7 +2771,9 @@
   unittest.group('obj-schema-StartPageToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartPageToken();
-      var od = api.StartPageToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartPageToken.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartPageToken(od as api.StartPageToken);
     });
   });
@@ -2715,7 +2781,9 @@
   unittest.group('obj-schema-TeamDriveBackgroundImageFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDriveBackgroundImageFile();
-      var od = api.TeamDriveBackgroundImageFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeamDriveBackgroundImageFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeamDriveBackgroundImageFile(od as api.TeamDriveBackgroundImageFile);
     });
   });
@@ -2723,7 +2791,9 @@
   unittest.group('obj-schema-TeamDriveCapabilities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDriveCapabilities();
-      var od = api.TeamDriveCapabilities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeamDriveCapabilities.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeamDriveCapabilities(od as api.TeamDriveCapabilities);
     });
   });
@@ -2731,7 +2801,9 @@
   unittest.group('obj-schema-TeamDriveRestrictions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDriveRestrictions();
-      var od = api.TeamDriveRestrictions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeamDriveRestrictions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeamDriveRestrictions(od as api.TeamDriveRestrictions);
     });
   });
@@ -2739,7 +2811,9 @@
   unittest.group('obj-schema-TeamDrive', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDrive();
-      var od = api.TeamDrive.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TeamDrive.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTeamDrive(od as api.TeamDrive);
     });
   });
@@ -2747,7 +2821,9 @@
   unittest.group('obj-schema-TeamDriveList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDriveList();
-      var od = api.TeamDriveList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeamDriveList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeamDriveList(od as api.TeamDriveList);
     });
   });
@@ -2755,7 +2831,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
diff --git a/generated/googleapis/test/driveactivity/v2_test.dart b/generated/googleapis/test/driveactivity/v2_test.dart
index ffdb5b1..9f14577 100644
--- a/generated/googleapis/test/driveactivity/v2_test.dart
+++ b/generated/googleapis/test/driveactivity/v2_test.dart
@@ -1438,7 +1438,9 @@
   unittest.group('obj-schema-Action', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAction();
-      var od = api.Action.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Action.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAction(od as api.Action);
     });
   });
@@ -1446,7 +1448,9 @@
   unittest.group('obj-schema-ActionDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActionDetail();
-      var od = api.ActionDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActionDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActionDetail(od as api.ActionDetail);
     });
   });
@@ -1454,7 +1458,8 @@
   unittest.group('obj-schema-Actor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActor();
-      var od = api.Actor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Actor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkActor(od as api.Actor);
     });
   });
@@ -1462,7 +1467,9 @@
   unittest.group('obj-schema-Administrator', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdministrator();
-      var od = api.Administrator.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Administrator.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdministrator(od as api.Administrator);
     });
   });
@@ -1470,7 +1477,9 @@
   unittest.group('obj-schema-AnonymousUser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnonymousUser();
-      var od = api.AnonymousUser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnonymousUser.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnonymousUser(od as api.AnonymousUser);
     });
   });
@@ -1478,7 +1487,9 @@
   unittest.group('obj-schema-Anyone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnyone();
-      var od = api.Anyone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Anyone.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAnyone(od as api.Anyone);
     });
   });
@@ -1486,7 +1497,9 @@
   unittest.group('obj-schema-ApplicationReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationReference();
-      var od = api.ApplicationReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationReference(od as api.ApplicationReference);
     });
   });
@@ -1494,7 +1507,9 @@
   unittest.group('obj-schema-Assignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssignment();
-      var od = api.Assignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Assignment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAssignment(od as api.Assignment);
     });
   });
@@ -1502,7 +1517,9 @@
   unittest.group('obj-schema-Comment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComment();
-      var od = api.Comment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Comment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkComment(od as api.Comment);
     });
   });
@@ -1510,7 +1527,9 @@
   unittest.group('obj-schema-ConsolidationStrategy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConsolidationStrategy();
-      var od = api.ConsolidationStrategy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConsolidationStrategy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConsolidationStrategy(od as api.ConsolidationStrategy);
     });
   });
@@ -1518,7 +1537,8 @@
   unittest.group('obj-schema-Copy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCopy();
-      var od = api.Copy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Copy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCopy(od as api.Copy);
     });
   });
@@ -1526,7 +1546,9 @@
   unittest.group('obj-schema-Create', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreate();
-      var od = api.Create.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Create.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCreate(od as api.Create);
     });
   });
@@ -1534,7 +1556,9 @@
   unittest.group('obj-schema-DataLeakPreventionChange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataLeakPreventionChange();
-      var od = api.DataLeakPreventionChange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataLeakPreventionChange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataLeakPreventionChange(od as api.DataLeakPreventionChange);
     });
   });
@@ -1542,7 +1566,9 @@
   unittest.group('obj-schema-Delete', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDelete();
-      var od = api.Delete.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Delete.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDelete(od as api.Delete);
     });
   });
@@ -1550,7 +1576,9 @@
   unittest.group('obj-schema-DeletedUser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeletedUser();
-      var od = api.DeletedUser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeletedUser.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeletedUser(od as api.DeletedUser);
     });
   });
@@ -1558,7 +1586,9 @@
   unittest.group('obj-schema-Domain', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomain();
-      var od = api.Domain.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Domain.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDomain(od as api.Domain);
     });
   });
@@ -1566,7 +1596,8 @@
   unittest.group('obj-schema-Drive', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDrive();
-      var od = api.Drive.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Drive.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDrive(od as api.Drive);
     });
   });
@@ -1574,7 +1605,9 @@
   unittest.group('obj-schema-DriveActivity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveActivity();
-      var od = api.DriveActivity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveActivity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveActivity(od as api.DriveActivity);
     });
   });
@@ -1582,7 +1615,9 @@
   unittest.group('obj-schema-DriveFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveFile();
-      var od = api.DriveFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DriveFile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDriveFile(od as api.DriveFile);
     });
   });
@@ -1590,7 +1625,9 @@
   unittest.group('obj-schema-DriveFolder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveFolder();
-      var od = api.DriveFolder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveFolder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveFolder(od as api.DriveFolder);
     });
   });
@@ -1598,7 +1635,9 @@
   unittest.group('obj-schema-DriveItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveItem();
-      var od = api.DriveItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DriveItem.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDriveItem(od as api.DriveItem);
     });
   });
@@ -1606,7 +1645,9 @@
   unittest.group('obj-schema-DriveItemReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveItemReference();
-      var od = api.DriveItemReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveItemReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveItemReference(od as api.DriveItemReference);
     });
   });
@@ -1614,7 +1655,9 @@
   unittest.group('obj-schema-DriveReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveReference();
-      var od = api.DriveReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveReference(od as api.DriveReference);
     });
   });
@@ -1622,7 +1665,8 @@
   unittest.group('obj-schema-Edit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEdit();
-      var od = api.Edit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Edit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEdit(od as api.Edit);
     });
   });
@@ -1630,7 +1674,8 @@
   unittest.group('obj-schema-File', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFile();
-      var od = api.File.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.File.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFile(od as api.File);
     });
   });
@@ -1638,7 +1683,9 @@
   unittest.group('obj-schema-FileComment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileComment();
-      var od = api.FileComment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileComment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileComment(od as api.FileComment);
     });
   });
@@ -1646,7 +1693,9 @@
   unittest.group('obj-schema-Folder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolder();
-      var od = api.Folder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Folder.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFolder(od as api.Folder);
     });
   });
@@ -1654,7 +1703,8 @@
   unittest.group('obj-schema-Group', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroup();
-      var od = api.Group.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Group.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGroup(od as api.Group);
     });
   });
@@ -1662,7 +1712,9 @@
   unittest.group('obj-schema-Impersonation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImpersonation();
-      var od = api.Impersonation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Impersonation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImpersonation(od as api.Impersonation);
     });
   });
@@ -1670,7 +1722,9 @@
   unittest.group('obj-schema-KnownUser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKnownUser();
-      var od = api.KnownUser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.KnownUser.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKnownUser(od as api.KnownUser);
     });
   });
@@ -1678,7 +1732,9 @@
   unittest.group('obj-schema-Legacy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLegacy();
-      var od = api.Legacy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Legacy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLegacy(od as api.Legacy);
     });
   });
@@ -1686,7 +1742,8 @@
   unittest.group('obj-schema-Move', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMove();
-      var od = api.Move.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Move.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMove(od as api.Move);
     });
   });
@@ -1694,7 +1751,8 @@
   unittest.group('obj-schema-New', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNew();
-      var od = api.New.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.New.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNew(od as api.New);
     });
   });
@@ -1702,7 +1760,9 @@
   unittest.group('obj-schema-NoConsolidation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNoConsolidation();
-      var od = api.NoConsolidation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NoConsolidation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNoConsolidation(od as api.NoConsolidation);
     });
   });
@@ -1710,7 +1770,8 @@
   unittest.group('obj-schema-Owner', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOwner();
-      var od = api.Owner.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Owner.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOwner(od as api.Owner);
     });
   });
@@ -1718,7 +1779,9 @@
   unittest.group('obj-schema-Permission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermission();
-      var od = api.Permission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Permission.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPermission(od as api.Permission);
     });
   });
@@ -1726,7 +1789,9 @@
   unittest.group('obj-schema-PermissionChange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissionChange();
-      var od = api.PermissionChange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PermissionChange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissionChange(od as api.PermissionChange);
     });
   });
@@ -1734,7 +1799,8 @@
   unittest.group('obj-schema-Post', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPost();
-      var od = api.Post.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Post.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPost(od as api.Post);
     });
   });
@@ -1742,7 +1808,9 @@
   unittest.group('obj-schema-QueryDriveActivityRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryDriveActivityRequest();
-      var od = api.QueryDriveActivityRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryDriveActivityRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryDriveActivityRequest(od as api.QueryDriveActivityRequest);
     });
   });
@@ -1750,7 +1818,9 @@
   unittest.group('obj-schema-QueryDriveActivityResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryDriveActivityResponse();
-      var od = api.QueryDriveActivityResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryDriveActivityResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryDriveActivityResponse(od as api.QueryDriveActivityResponse);
     });
   });
@@ -1758,7 +1828,9 @@
   unittest.group('obj-schema-Rename', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRename();
-      var od = api.Rename.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Rename.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRename(od as api.Rename);
     });
   });
@@ -1766,7 +1838,9 @@
   unittest.group('obj-schema-Restore', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestore();
-      var od = api.Restore.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Restore.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRestore(od as api.Restore);
     });
   });
@@ -1774,7 +1848,9 @@
   unittest.group('obj-schema-RestrictionChange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestrictionChange();
-      var od = api.RestrictionChange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestrictionChange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestrictionChange(od as api.RestrictionChange);
     });
   });
@@ -1782,7 +1858,9 @@
   unittest.group('obj-schema-SettingsChange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettingsChange();
-      var od = api.SettingsChange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SettingsChange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSettingsChange(od as api.SettingsChange);
     });
   });
@@ -1790,7 +1868,9 @@
   unittest.group('obj-schema-Suggestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestion();
-      var od = api.Suggestion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Suggestion.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSuggestion(od as api.Suggestion);
     });
   });
@@ -1798,7 +1878,9 @@
   unittest.group('obj-schema-SystemEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemEvent();
-      var od = api.SystemEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemEvent(od as api.SystemEvent);
     });
   });
@@ -1806,7 +1888,9 @@
   unittest.group('obj-schema-Target', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTarget();
-      var od = api.Target.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Target.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTarget(od as api.Target);
     });
   });
@@ -1814,7 +1898,9 @@
   unittest.group('obj-schema-TargetReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetReference();
-      var od = api.TargetReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetReference(od as api.TargetReference);
     });
   });
@@ -1822,7 +1908,9 @@
   unittest.group('obj-schema-TeamDrive', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDrive();
-      var od = api.TeamDrive.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TeamDrive.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTeamDrive(od as api.TeamDrive);
     });
   });
@@ -1830,7 +1918,9 @@
   unittest.group('obj-schema-TeamDriveReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDriveReference();
-      var od = api.TeamDriveReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeamDriveReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeamDriveReference(od as api.TeamDriveReference);
     });
   });
@@ -1838,7 +1928,9 @@
   unittest.group('obj-schema-TimeRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeRange();
-      var od = api.TimeRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeRange(od as api.TimeRange);
     });
   });
@@ -1846,7 +1938,9 @@
   unittest.group('obj-schema-UnknownUser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnknownUser();
-      var od = api.UnknownUser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnknownUser.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnknownUser(od as api.UnknownUser);
     });
   });
@@ -1854,7 +1948,9 @@
   unittest.group('obj-schema-Upload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpload();
-      var od = api.Upload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Upload.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUpload(od as api.Upload);
     });
   });
@@ -1862,7 +1958,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
diff --git a/generated/googleapis/test/eventarc/v1_test.dart b/generated/googleapis/test/eventarc/v1_test.dart
index df6fed5..cdb5f9b 100644
--- a/generated/googleapis/test/eventarc/v1_test.dart
+++ b/generated/googleapis/test/eventarc/v1_test.dart
@@ -1070,7 +1070,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1078,7 +1080,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1086,7 +1090,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1094,7 +1100,9 @@
   unittest.group('obj-schema-CloudRun', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudRun();
-      var od = api.CloudRun.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CloudRun.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCloudRun(od as api.CloudRun);
     });
   });
@@ -1102,7 +1110,9 @@
   unittest.group('obj-schema-Destination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDestination();
-      var od = api.Destination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Destination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDestination(od as api.Destination);
     });
   });
@@ -1110,7 +1120,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1118,7 +1129,9 @@
   unittest.group('obj-schema-EventFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventFilter();
-      var od = api.EventFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventFilter(od as api.EventFilter);
     });
   });
@@ -1126,7 +1139,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1134,7 +1148,9 @@
   unittest.group('obj-schema-GoogleLongrunningCancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningCancelOperationRequest();
-      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningCancelOperationRequest(
           od as api.GoogleLongrunningCancelOperationRequest);
     });
@@ -1143,7 +1159,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -1152,7 +1170,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -1160,7 +1180,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
@@ -1168,7 +1190,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1176,7 +1200,9 @@
   unittest.group('obj-schema-ListTriggersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTriggersResponse();
-      var od = api.ListTriggersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTriggersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTriggersResponse(od as api.ListTriggersResponse);
     });
   });
@@ -1184,7 +1210,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1192,7 +1220,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -1200,7 +1230,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1208,7 +1240,9 @@
   unittest.group('obj-schema-Pubsub', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubsub();
-      var od = api.Pubsub.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Pubsub.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPubsub(od as api.Pubsub);
     });
   });
@@ -1216,7 +1250,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1224,7 +1260,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1232,7 +1270,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -1240,7 +1280,9 @@
   unittest.group('obj-schema-Transport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransport();
-      var od = api.Transport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Transport.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTransport(od as api.Transport);
     });
   });
@@ -1248,7 +1290,9 @@
   unittest.group('obj-schema-Trigger', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrigger();
-      var od = api.Trigger.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Trigger.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTrigger(od as api.Trigger);
     });
   });
diff --git a/generated/googleapis/test/fcm/v1_test.dart b/generated/googleapis/test/fcm/v1_test.dart
index 882f949..b31a936 100644
--- a/generated/googleapis/test/fcm/v1_test.dart
+++ b/generated/googleapis/test/fcm/v1_test.dart
@@ -751,7 +751,9 @@
   unittest.group('obj-schema-AndroidConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidConfig();
-      var od = api.AndroidConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidConfig(od as api.AndroidConfig);
     });
   });
@@ -759,7 +761,9 @@
   unittest.group('obj-schema-AndroidFcmOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidFcmOptions();
-      var od = api.AndroidFcmOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidFcmOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidFcmOptions(od as api.AndroidFcmOptions);
     });
   });
@@ -767,7 +771,9 @@
   unittest.group('obj-schema-AndroidNotification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidNotification();
-      var od = api.AndroidNotification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidNotification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidNotification(od as api.AndroidNotification);
     });
   });
@@ -775,7 +781,9 @@
   unittest.group('obj-schema-ApnsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApnsConfig();
-      var od = api.ApnsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ApnsConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApnsConfig(od as api.ApnsConfig);
     });
   });
@@ -783,7 +791,9 @@
   unittest.group('obj-schema-ApnsFcmOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApnsFcmOptions();
-      var od = api.ApnsFcmOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApnsFcmOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApnsFcmOptions(od as api.ApnsFcmOptions);
     });
   });
@@ -791,7 +801,8 @@
   unittest.group('obj-schema-Color', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColor();
-      var od = api.Color.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Color.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColor(od as api.Color);
     });
   });
@@ -799,7 +810,9 @@
   unittest.group('obj-schema-FcmOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFcmOptions();
-      var od = api.FcmOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FcmOptions.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFcmOptions(od as api.FcmOptions);
     });
   });
@@ -807,7 +820,9 @@
   unittest.group('obj-schema-LightSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLightSettings();
-      var od = api.LightSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LightSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLightSettings(od as api.LightSettings);
     });
   });
@@ -815,7 +830,9 @@
   unittest.group('obj-schema-Message', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMessage();
-      var od = api.Message.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Message.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMessage(od as api.Message);
     });
   });
@@ -823,7 +840,9 @@
   unittest.group('obj-schema-Notification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotification();
-      var od = api.Notification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Notification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotification(od as api.Notification);
     });
   });
@@ -831,7 +850,9 @@
   unittest.group('obj-schema-SendMessageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSendMessageRequest();
-      var od = api.SendMessageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SendMessageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSendMessageRequest(od as api.SendMessageRequest);
     });
   });
@@ -839,7 +860,9 @@
   unittest.group('obj-schema-WebpushConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebpushConfig();
-      var od = api.WebpushConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebpushConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebpushConfig(od as api.WebpushConfig);
     });
   });
@@ -847,7 +870,9 @@
   unittest.group('obj-schema-WebpushFcmOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebpushFcmOptions();
-      var od = api.WebpushFcmOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebpushFcmOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebpushFcmOptions(od as api.WebpushFcmOptions);
     });
   });
diff --git a/generated/googleapis/test/file/v1_test.dart b/generated/googleapis/test/file/v1_test.dart
index 78ef334..9a349a8 100644
--- a/generated/googleapis/test/file/v1_test.dart
+++ b/generated/googleapis/test/file/v1_test.dart
@@ -1886,7 +1886,9 @@
   unittest.group('obj-schema-Backup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackup();
-      var od = api.Backup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Backup.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackup(od as api.Backup);
     });
   });
@@ -1894,7 +1896,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -1902,7 +1906,9 @@
   unittest.group('obj-schema-DailyCycle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDailyCycle();
-      var od = api.DailyCycle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DailyCycle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDailyCycle(od as api.DailyCycle);
     });
   });
@@ -1910,7 +1916,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -1918,7 +1925,9 @@
   unittest.group('obj-schema-DenyMaintenancePeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDenyMaintenancePeriod();
-      var od = api.DenyMaintenancePeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DenyMaintenancePeriod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDenyMaintenancePeriod(od as api.DenyMaintenancePeriod);
     });
   });
@@ -1926,7 +1935,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1934,7 +1944,9 @@
   unittest.group('obj-schema-FileShareConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileShareConfig();
-      var od = api.FileShareConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileShareConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileShareConfig(od as api.FileShareConfig);
     });
   });
@@ -1943,9 +1955,10 @@
       'obj-schema-GoogleCloudSaasacceleratorManagementProvidersV1Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSaasacceleratorManagementProvidersV1Instance();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1Instance.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1Instance(
           od as api.GoogleCloudSaasacceleratorManagementProvidersV1Instance);
     });
@@ -1957,9 +1970,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule);
@@ -1972,9 +1986,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings);
@@ -1987,9 +2002,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata);
@@ -2002,9 +2018,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1PerSliSloEligibility();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1PerSliSloEligibility
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1PerSliSloEligibility(
           od as api
               .GoogleCloudSaasacceleratorManagementProvidersV1PerSliSloEligibility);
@@ -2017,9 +2034,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource);
@@ -2032,8 +2050,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(od
           as api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility);
     });
@@ -2045,8 +2064,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(od
           as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
     });
@@ -2057,8 +2077,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata(
           od as api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata);
     });
@@ -2067,7 +2088,9 @@
   unittest.group('obj-schema-Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstance();
-      var od = api.Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Instance.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstance(od as api.Instance);
     });
   });
@@ -2075,7 +2098,9 @@
   unittest.group('obj-schema-ListBackupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBackupsResponse();
-      var od = api.ListBackupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBackupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBackupsResponse(od as api.ListBackupsResponse);
     });
   });
@@ -2083,7 +2108,9 @@
   unittest.group('obj-schema-ListInstancesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInstancesResponse();
-      var od = api.ListInstancesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInstancesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
@@ -2091,7 +2118,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -2099,7 +2128,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -2107,7 +2138,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2115,7 +2148,9 @@
   unittest.group('obj-schema-MaintenancePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenancePolicy();
-      var od = api.MaintenancePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenancePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenancePolicy(od as api.MaintenancePolicy);
     });
   });
@@ -2123,7 +2158,9 @@
   unittest.group('obj-schema-MaintenanceWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenanceWindow();
-      var od = api.MaintenanceWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenanceWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenanceWindow(od as api.MaintenanceWindow);
     });
   });
@@ -2131,7 +2168,9 @@
   unittest.group('obj-schema-NetworkConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkConfig();
-      var od = api.NetworkConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkConfig(od as api.NetworkConfig);
     });
   });
@@ -2139,7 +2178,9 @@
   unittest.group('obj-schema-NfsExportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNfsExportOptions();
-      var od = api.NfsExportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NfsExportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNfsExportOptions(od as api.NfsExportOptions);
     });
   });
@@ -2147,7 +2188,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2155,7 +2198,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -2163,7 +2208,9 @@
   unittest.group('obj-schema-RestoreInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreInstanceRequest();
-      var od = api.RestoreInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreInstanceRequest(od as api.RestoreInstanceRequest);
     });
   });
@@ -2171,7 +2218,9 @@
   unittest.group('obj-schema-Schedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchedule();
-      var od = api.Schedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schedule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchedule(od as api.Schedule);
     });
   });
@@ -2179,7 +2228,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2187,7 +2238,9 @@
   unittest.group('obj-schema-TimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeOfDay();
-      var od = api.TimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeOfDay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeOfDay(od as api.TimeOfDay);
     });
   });
@@ -2195,7 +2248,9 @@
   unittest.group('obj-schema-UpdatePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdatePolicy();
-      var od = api.UpdatePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdatePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdatePolicy(od as api.UpdatePolicy);
     });
   });
@@ -2203,7 +2258,9 @@
   unittest.group('obj-schema-WeeklyCycle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWeeklyCycle();
-      var od = api.WeeklyCycle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WeeklyCycle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWeeklyCycle(od as api.WeeklyCycle);
     });
   });
diff --git a/generated/googleapis/test/firebasedynamiclinks/v1_test.dart b/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
index 1d368c1..819c2f2 100644
--- a/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
+++ b/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
@@ -973,7 +973,9 @@
   unittest.group('obj-schema-AnalyticsInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyticsInfo();
-      var od = api.AnalyticsInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyticsInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyticsInfo(od as api.AnalyticsInfo);
     });
   });
@@ -981,7 +983,9 @@
   unittest.group('obj-schema-AndroidInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidInfo();
-      var od = api.AndroidInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidInfo(od as api.AndroidInfo);
     });
   });
@@ -989,7 +993,9 @@
   unittest.group('obj-schema-CreateManagedShortLinkRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateManagedShortLinkRequest();
-      var od = api.CreateManagedShortLinkRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateManagedShortLinkRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateManagedShortLinkRequest(
           od as api.CreateManagedShortLinkRequest);
     });
@@ -998,7 +1004,9 @@
   unittest.group('obj-schema-CreateManagedShortLinkResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateManagedShortLinkResponse();
-      var od = api.CreateManagedShortLinkResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateManagedShortLinkResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateManagedShortLinkResponse(
           od as api.CreateManagedShortLinkResponse);
     });
@@ -1007,7 +1015,9 @@
   unittest.group('obj-schema-CreateShortDynamicLinkRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateShortDynamicLinkRequest();
-      var od = api.CreateShortDynamicLinkRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateShortDynamicLinkRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateShortDynamicLinkRequest(
           od as api.CreateShortDynamicLinkRequest);
     });
@@ -1016,7 +1026,9 @@
   unittest.group('obj-schema-CreateShortDynamicLinkResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateShortDynamicLinkResponse();
-      var od = api.CreateShortDynamicLinkResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateShortDynamicLinkResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateShortDynamicLinkResponse(
           od as api.CreateShortDynamicLinkResponse);
     });
@@ -1025,7 +1037,9 @@
   unittest.group('obj-schema-DesktopInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDesktopInfo();
-      var od = api.DesktopInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DesktopInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDesktopInfo(od as api.DesktopInfo);
     });
   });
@@ -1033,7 +1047,9 @@
   unittest.group('obj-schema-DeviceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceInfo();
-      var od = api.DeviceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DeviceInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeviceInfo(od as api.DeviceInfo);
     });
   });
@@ -1041,7 +1057,9 @@
   unittest.group('obj-schema-DynamicLinkEventStat', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicLinkEventStat();
-      var od = api.DynamicLinkEventStat.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicLinkEventStat.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicLinkEventStat(od as api.DynamicLinkEventStat);
     });
   });
@@ -1049,7 +1067,9 @@
   unittest.group('obj-schema-DynamicLinkInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicLinkInfo();
-      var od = api.DynamicLinkInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicLinkInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicLinkInfo(od as api.DynamicLinkInfo);
     });
   });
@@ -1057,7 +1077,9 @@
   unittest.group('obj-schema-DynamicLinkStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicLinkStats();
-      var od = api.DynamicLinkStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicLinkStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicLinkStats(od as api.DynamicLinkStats);
     });
   });
@@ -1065,7 +1087,9 @@
   unittest.group('obj-schema-DynamicLinkWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicLinkWarning();
-      var od = api.DynamicLinkWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicLinkWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicLinkWarning(od as api.DynamicLinkWarning);
     });
   });
@@ -1073,7 +1097,9 @@
   unittest.group('obj-schema-GetIosPostInstallAttributionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIosPostInstallAttributionRequest();
-      var od = api.GetIosPostInstallAttributionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIosPostInstallAttributionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIosPostInstallAttributionRequest(
           od as api.GetIosPostInstallAttributionRequest);
     });
@@ -1082,7 +1108,9 @@
   unittest.group('obj-schema-GetIosPostInstallAttributionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIosPostInstallAttributionResponse();
-      var od = api.GetIosPostInstallAttributionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIosPostInstallAttributionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIosPostInstallAttributionResponse(
           od as api.GetIosPostInstallAttributionResponse);
     });
@@ -1091,7 +1119,9 @@
   unittest.group('obj-schema-GetIosReopenAttributionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIosReopenAttributionRequest();
-      var od = api.GetIosReopenAttributionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIosReopenAttributionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIosReopenAttributionRequest(
           od as api.GetIosReopenAttributionRequest);
     });
@@ -1100,7 +1130,9 @@
   unittest.group('obj-schema-GetIosReopenAttributionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIosReopenAttributionResponse();
-      var od = api.GetIosReopenAttributionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIosReopenAttributionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIosReopenAttributionResponse(
           od as api.GetIosReopenAttributionResponse);
     });
@@ -1109,7 +1141,9 @@
   unittest.group('obj-schema-GooglePlayAnalytics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooglePlayAnalytics();
-      var od = api.GooglePlayAnalytics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooglePlayAnalytics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooglePlayAnalytics(od as api.GooglePlayAnalytics);
     });
   });
@@ -1117,7 +1151,9 @@
   unittest.group('obj-schema-ITunesConnectAnalytics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildITunesConnectAnalytics();
-      var od = api.ITunesConnectAnalytics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ITunesConnectAnalytics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkITunesConnectAnalytics(od as api.ITunesConnectAnalytics);
     });
   });
@@ -1125,7 +1161,9 @@
   unittest.group('obj-schema-IosInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosInfo();
-      var od = api.IosInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IosInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIosInfo(od as api.IosInfo);
     });
   });
@@ -1133,7 +1171,9 @@
   unittest.group('obj-schema-ManagedShortLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedShortLink();
-      var od = api.ManagedShortLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedShortLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedShortLink(od as api.ManagedShortLink);
     });
   });
@@ -1141,7 +1181,9 @@
   unittest.group('obj-schema-NavigationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNavigationInfo();
-      var od = api.NavigationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NavigationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNavigationInfo(od as api.NavigationInfo);
     });
   });
@@ -1149,7 +1191,9 @@
   unittest.group('obj-schema-SocialMetaTagInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSocialMetaTagInfo();
-      var od = api.SocialMetaTagInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SocialMetaTagInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSocialMetaTagInfo(od as api.SocialMetaTagInfo);
     });
   });
@@ -1157,7 +1201,9 @@
   unittest.group('obj-schema-Suffix', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuffix();
-      var od = api.Suffix.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Suffix.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSuffix(od as api.Suffix);
     });
   });
diff --git a/generated/googleapis/test/firebasehosting/v1_test.dart b/generated/googleapis/test/firebasehosting/v1_test.dart
index a8ddd9e..c07eb48 100644
--- a/generated/googleapis/test/firebasehosting/v1_test.dart
+++ b/generated/googleapis/test/firebasehosting/v1_test.dart
@@ -311,7 +311,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -319,7 +321,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -327,7 +330,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -335,7 +340,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -343,7 +350,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
diff --git a/generated/googleapis/test/firebaseml/v1_test.dart b/generated/googleapis/test/firebaseml/v1_test.dart
index a0936b0..53df7b1 100644
--- a/generated/googleapis/test/firebaseml/v1_test.dart
+++ b/generated/googleapis/test/firebaseml/v1_test.dart
@@ -338,7 +338,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -346,7 +348,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -354,7 +357,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -362,7 +367,9 @@
   unittest.group('obj-schema-ModelOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModelOperationMetadata();
-      var od = api.ModelOperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModelOperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModelOperationMetadata(od as api.ModelOperationMetadata);
     });
   });
@@ -370,7 +377,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -378,7 +387,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
diff --git a/generated/googleapis/test/firebaserules/v1_test.dart b/generated/googleapis/test/firebaserules/v1_test.dart
index 0936eb9..700d8c6 100644
--- a/generated/googleapis/test/firebaserules/v1_test.dart
+++ b/generated/googleapis/test/firebaserules/v1_test.dart
@@ -1021,7 +1021,8 @@
   unittest.group('obj-schema-Arg', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArg();
-      var od = api.Arg.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Arg.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkArg(od as api.Arg);
     });
   });
@@ -1029,7 +1030,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1037,7 +1039,9 @@
   unittest.group('obj-schema-ExpressionReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpressionReport();
-      var od = api.ExpressionReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExpressionReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExpressionReport(od as api.ExpressionReport);
     });
   });
@@ -1045,7 +1049,8 @@
   unittest.group('obj-schema-File', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFile();
-      var od = api.File.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.File.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFile(od as api.File);
     });
   });
@@ -1053,7 +1058,9 @@
   unittest.group('obj-schema-FunctionCall', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFunctionCall();
-      var od = api.FunctionCall.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FunctionCall.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFunctionCall(od as api.FunctionCall);
     });
   });
@@ -1061,7 +1068,9 @@
   unittest.group('obj-schema-FunctionMock', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFunctionMock();
-      var od = api.FunctionMock.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FunctionMock.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFunctionMock(od as api.FunctionMock);
     });
   });
@@ -1069,7 +1078,9 @@
   unittest.group('obj-schema-GetReleaseExecutableResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetReleaseExecutableResponse();
-      var od = api.GetReleaseExecutableResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetReleaseExecutableResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetReleaseExecutableResponse(od as api.GetReleaseExecutableResponse);
     });
   });
@@ -1077,7 +1088,8 @@
   unittest.group('obj-schema-Issue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIssue();
-      var od = api.Issue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Issue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIssue(od as api.Issue);
     });
   });
@@ -1085,7 +1097,9 @@
   unittest.group('obj-schema-ListReleasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListReleasesResponse();
-      var od = api.ListReleasesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListReleasesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListReleasesResponse(od as api.ListReleasesResponse);
     });
   });
@@ -1093,7 +1107,9 @@
   unittest.group('obj-schema-ListRulesetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRulesetsResponse();
-      var od = api.ListRulesetsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRulesetsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRulesetsResponse(od as api.ListRulesetsResponse);
     });
   });
@@ -1101,7 +1117,9 @@
   unittest.group('obj-schema-Metadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadata();
-      var od = api.Metadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metadata.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetadata(od as api.Metadata);
     });
   });
@@ -1109,7 +1127,9 @@
   unittest.group('obj-schema-Release', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelease();
-      var od = api.Release.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Release.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRelease(od as api.Release);
     });
   });
@@ -1117,7 +1137,9 @@
   unittest.group('obj-schema-Result', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResult();
-      var od = api.Result.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Result.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResult(od as api.Result);
     });
   });
@@ -1125,7 +1147,9 @@
   unittest.group('obj-schema-Ruleset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRuleset();
-      var od = api.Ruleset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Ruleset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRuleset(od as api.Ruleset);
     });
   });
@@ -1133,7 +1157,9 @@
   unittest.group('obj-schema-Source', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSource();
-      var od = api.Source.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Source.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSource(od as api.Source);
     });
   });
@@ -1141,7 +1167,9 @@
   unittest.group('obj-schema-SourcePosition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourcePosition();
-      var od = api.SourcePosition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourcePosition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourcePosition(od as api.SourcePosition);
     });
   });
@@ -1149,7 +1177,9 @@
   unittest.group('obj-schema-TestCase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestCase();
-      var od = api.TestCase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestCase.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestCase(od as api.TestCase);
     });
   });
@@ -1157,7 +1187,9 @@
   unittest.group('obj-schema-TestResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestResult();
-      var od = api.TestResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestResult.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestResult(od as api.TestResult);
     });
   });
@@ -1165,7 +1197,9 @@
   unittest.group('obj-schema-TestRulesetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestRulesetRequest();
-      var od = api.TestRulesetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestRulesetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestRulesetRequest(od as api.TestRulesetRequest);
     });
   });
@@ -1173,7 +1207,9 @@
   unittest.group('obj-schema-TestRulesetResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestRulesetResponse();
-      var od = api.TestRulesetResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestRulesetResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestRulesetResponse(od as api.TestRulesetResponse);
     });
   });
@@ -1181,7 +1217,9 @@
   unittest.group('obj-schema-TestSuite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestSuite();
-      var od = api.TestSuite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestSuite.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestSuite(od as api.TestSuite);
     });
   });
@@ -1189,7 +1227,9 @@
   unittest.group('obj-schema-UpdateReleaseRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateReleaseRequest();
-      var od = api.UpdateReleaseRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateReleaseRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateReleaseRequest(od as api.UpdateReleaseRequest);
     });
   });
@@ -1197,7 +1237,9 @@
   unittest.group('obj-schema-ValueCount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValueCount();
-      var od = api.ValueCount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ValueCount.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkValueCount(od as api.ValueCount);
     });
   });
@@ -1205,7 +1247,9 @@
   unittest.group('obj-schema-VisitedExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVisitedExpression();
-      var od = api.VisitedExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VisitedExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVisitedExpression(od as api.VisitedExpression);
     });
   });
diff --git a/generated/googleapis/test/firestore/v1_test.dart b/generated/googleapis/test/firestore/v1_test.dart
index 7b8d1d7..2f0f3be 100644
--- a/generated/googleapis/test/firestore/v1_test.dart
+++ b/generated/googleapis/test/firestore/v1_test.dart
@@ -3079,7 +3079,9 @@
   unittest.group('obj-schema-ArrayValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArrayValue();
-      var od = api.ArrayValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ArrayValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkArrayValue(od as api.ArrayValue);
     });
   });
@@ -3087,7 +3089,9 @@
   unittest.group('obj-schema-BatchGetDocumentsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetDocumentsRequest();
-      var od = api.BatchGetDocumentsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetDocumentsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetDocumentsRequest(od as api.BatchGetDocumentsRequest);
     });
   });
@@ -3095,7 +3099,9 @@
   unittest.group('obj-schema-BatchGetDocumentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetDocumentsResponse();
-      var od = api.BatchGetDocumentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetDocumentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetDocumentsResponse(od as api.BatchGetDocumentsResponse);
     });
   });
@@ -3103,7 +3109,9 @@
   unittest.group('obj-schema-BatchWriteRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchWriteRequest();
-      var od = api.BatchWriteRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchWriteRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchWriteRequest(od as api.BatchWriteRequest);
     });
   });
@@ -3111,7 +3119,9 @@
   unittest.group('obj-schema-BatchWriteResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchWriteResponse();
-      var od = api.BatchWriteResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchWriteResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchWriteResponse(od as api.BatchWriteResponse);
     });
   });
@@ -3119,7 +3129,9 @@
   unittest.group('obj-schema-BeginTransactionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBeginTransactionRequest();
-      var od = api.BeginTransactionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BeginTransactionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBeginTransactionRequest(od as api.BeginTransactionRequest);
     });
   });
@@ -3127,7 +3139,9 @@
   unittest.group('obj-schema-BeginTransactionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBeginTransactionResponse();
-      var od = api.BeginTransactionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BeginTransactionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBeginTransactionResponse(od as api.BeginTransactionResponse);
     });
   });
@@ -3135,7 +3149,9 @@
   unittest.group('obj-schema-CollectionSelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCollectionSelector();
-      var od = api.CollectionSelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CollectionSelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCollectionSelector(od as api.CollectionSelector);
     });
   });
@@ -3143,7 +3159,9 @@
   unittest.group('obj-schema-CommitRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitRequest();
-      var od = api.CommitRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitRequest(od as api.CommitRequest);
     });
   });
@@ -3151,7 +3169,9 @@
   unittest.group('obj-schema-CommitResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitResponse();
-      var od = api.CommitResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitResponse(od as api.CommitResponse);
     });
   });
@@ -3159,7 +3179,9 @@
   unittest.group('obj-schema-CompositeFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompositeFilter();
-      var od = api.CompositeFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompositeFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompositeFilter(od as api.CompositeFilter);
     });
   });
@@ -3167,7 +3189,9 @@
   unittest.group('obj-schema-Cursor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCursor();
-      var od = api.Cursor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Cursor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCursor(od as api.Cursor);
     });
   });
@@ -3175,7 +3199,9 @@
   unittest.group('obj-schema-Document', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocument();
-      var od = api.Document.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Document.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDocument(od as api.Document);
     });
   });
@@ -3183,7 +3209,9 @@
   unittest.group('obj-schema-DocumentChange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentChange();
-      var od = api.DocumentChange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentChange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentChange(od as api.DocumentChange);
     });
   });
@@ -3191,7 +3219,9 @@
   unittest.group('obj-schema-DocumentDelete', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentDelete();
-      var od = api.DocumentDelete.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentDelete.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentDelete(od as api.DocumentDelete);
     });
   });
@@ -3199,7 +3229,9 @@
   unittest.group('obj-schema-DocumentMask', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentMask();
-      var od = api.DocumentMask.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentMask.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentMask(od as api.DocumentMask);
     });
   });
@@ -3207,7 +3239,9 @@
   unittest.group('obj-schema-DocumentRemove', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentRemove();
-      var od = api.DocumentRemove.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentRemove.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentRemove(od as api.DocumentRemove);
     });
   });
@@ -3215,7 +3249,9 @@
   unittest.group('obj-schema-DocumentTransform', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentTransform();
-      var od = api.DocumentTransform.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentTransform.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentTransform(od as api.DocumentTransform);
     });
   });
@@ -3223,7 +3259,9 @@
   unittest.group('obj-schema-DocumentsTarget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentsTarget();
-      var od = api.DocumentsTarget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentsTarget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentsTarget(od as api.DocumentsTarget);
     });
   });
@@ -3231,7 +3269,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -3239,7 +3278,9 @@
   unittest.group('obj-schema-ExistenceFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExistenceFilter();
-      var od = api.ExistenceFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExistenceFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExistenceFilter(od as api.ExistenceFilter);
     });
   });
@@ -3247,7 +3288,9 @@
   unittest.group('obj-schema-FieldFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFieldFilter();
-      var od = api.FieldFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FieldFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFieldFilter(od as api.FieldFilter);
     });
   });
@@ -3255,7 +3298,9 @@
   unittest.group('obj-schema-FieldReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFieldReference();
-      var od = api.FieldReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FieldReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFieldReference(od as api.FieldReference);
     });
   });
@@ -3263,7 +3308,9 @@
   unittest.group('obj-schema-FieldTransform', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFieldTransform();
-      var od = api.FieldTransform.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FieldTransform.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFieldTransform(od as api.FieldTransform);
     });
   });
@@ -3271,7 +3318,9 @@
   unittest.group('obj-schema-Filter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilter();
-      var od = api.Filter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Filter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilter(od as api.Filter);
     });
   });
@@ -3280,8 +3329,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1ExportDocumentsMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFirestoreAdminV1ExportDocumentsMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1ExportDocumentsMetadata(
           od as api.GoogleFirestoreAdminV1ExportDocumentsMetadata);
     });
@@ -3290,8 +3340,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1ExportDocumentsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1ExportDocumentsRequest();
-      var od =
-          api.GoogleFirestoreAdminV1ExportDocumentsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1ExportDocumentsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1ExportDocumentsRequest(
           od as api.GoogleFirestoreAdminV1ExportDocumentsRequest);
     });
@@ -3301,8 +3352,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1ExportDocumentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFirestoreAdminV1ExportDocumentsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1ExportDocumentsResponse(
           od as api.GoogleFirestoreAdminV1ExportDocumentsResponse);
     });
@@ -3311,7 +3363,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1Field', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1Field();
-      var od = api.GoogleFirestoreAdminV1Field.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1Field.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1Field(od as api.GoogleFirestoreAdminV1Field);
     });
   });
@@ -3319,8 +3373,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1FieldOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1FieldOperationMetadata();
-      var od =
-          api.GoogleFirestoreAdminV1FieldOperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1FieldOperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1FieldOperationMetadata(
           od as api.GoogleFirestoreAdminV1FieldOperationMetadata);
     });
@@ -3330,8 +3385,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1ImportDocumentsMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFirestoreAdminV1ImportDocumentsMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1ImportDocumentsMetadata(
           od as api.GoogleFirestoreAdminV1ImportDocumentsMetadata);
     });
@@ -3340,8 +3396,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1ImportDocumentsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1ImportDocumentsRequest();
-      var od =
-          api.GoogleFirestoreAdminV1ImportDocumentsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1ImportDocumentsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1ImportDocumentsRequest(
           od as api.GoogleFirestoreAdminV1ImportDocumentsRequest);
     });
@@ -3350,7 +3407,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1Index', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1Index();
-      var od = api.GoogleFirestoreAdminV1Index.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1Index.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1Index(od as api.GoogleFirestoreAdminV1Index);
     });
   });
@@ -3358,7 +3417,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1IndexConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1IndexConfig();
-      var od = api.GoogleFirestoreAdminV1IndexConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1IndexConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1IndexConfig(
           od as api.GoogleFirestoreAdminV1IndexConfig);
     });
@@ -3367,7 +3428,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1IndexConfigDelta', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1IndexConfigDelta();
-      var od = api.GoogleFirestoreAdminV1IndexConfigDelta.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1IndexConfigDelta.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1IndexConfigDelta(
           od as api.GoogleFirestoreAdminV1IndexConfigDelta);
     });
@@ -3376,7 +3439,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1IndexField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1IndexField();
-      var od = api.GoogleFirestoreAdminV1IndexField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1IndexField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1IndexField(
           od as api.GoogleFirestoreAdminV1IndexField);
     });
@@ -3385,8 +3450,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1IndexOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1IndexOperationMetadata();
-      var od =
-          api.GoogleFirestoreAdminV1IndexOperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1IndexOperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1IndexOperationMetadata(
           od as api.GoogleFirestoreAdminV1IndexOperationMetadata);
     });
@@ -3395,8 +3461,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1ListFieldsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1ListFieldsResponse();
-      var od =
-          api.GoogleFirestoreAdminV1ListFieldsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1ListFieldsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1ListFieldsResponse(
           od as api.GoogleFirestoreAdminV1ListFieldsResponse);
     });
@@ -3405,8 +3472,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1ListIndexesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1ListIndexesResponse();
-      var od =
-          api.GoogleFirestoreAdminV1ListIndexesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1ListIndexesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1ListIndexesResponse(
           od as api.GoogleFirestoreAdminV1ListIndexesResponse);
     });
@@ -3415,7 +3483,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1LocationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1LocationMetadata();
-      var od = api.GoogleFirestoreAdminV1LocationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1LocationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1LocationMetadata(
           od as api.GoogleFirestoreAdminV1LocationMetadata);
     });
@@ -3424,7 +3494,9 @@
   unittest.group('obj-schema-GoogleFirestoreAdminV1Progress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFirestoreAdminV1Progress();
-      var od = api.GoogleFirestoreAdminV1Progress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleFirestoreAdminV1Progress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFirestoreAdminV1Progress(
           od as api.GoogleFirestoreAdminV1Progress);
     });
@@ -3433,7 +3505,9 @@
   unittest.group('obj-schema-GoogleLongrunningCancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningCancelOperationRequest();
-      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningCancelOperationRequest(
           od as api.GoogleLongrunningCancelOperationRequest);
     });
@@ -3442,7 +3516,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -3451,7 +3527,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -3459,7 +3537,9 @@
   unittest.group('obj-schema-LatLng', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLatLng();
-      var od = api.LatLng.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LatLng.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLatLng(od as api.LatLng);
     });
   });
@@ -3467,7 +3547,9 @@
   unittest.group('obj-schema-ListCollectionIdsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCollectionIdsRequest();
-      var od = api.ListCollectionIdsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCollectionIdsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCollectionIdsRequest(od as api.ListCollectionIdsRequest);
     });
   });
@@ -3475,7 +3557,9 @@
   unittest.group('obj-schema-ListCollectionIdsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCollectionIdsResponse();
-      var od = api.ListCollectionIdsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCollectionIdsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCollectionIdsResponse(od as api.ListCollectionIdsResponse);
     });
   });
@@ -3483,7 +3567,9 @@
   unittest.group('obj-schema-ListDocumentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDocumentsResponse();
-      var od = api.ListDocumentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDocumentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDocumentsResponse(od as api.ListDocumentsResponse);
     });
   });
@@ -3491,7 +3577,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -3499,7 +3587,9 @@
   unittest.group('obj-schema-ListenRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListenRequest();
-      var od = api.ListenRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListenRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListenRequest(od as api.ListenRequest);
     });
   });
@@ -3507,7 +3597,9 @@
   unittest.group('obj-schema-ListenResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListenResponse();
-      var od = api.ListenResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListenResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListenResponse(od as api.ListenResponse);
     });
   });
@@ -3515,7 +3607,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -3523,7 +3617,9 @@
   unittest.group('obj-schema-MapValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMapValue();
-      var od = api.MapValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MapValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMapValue(od as api.MapValue);
     });
   });
@@ -3531,7 +3627,8 @@
   unittest.group('obj-schema-Order', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrder();
-      var od = api.Order.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Order.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrder(od as api.Order);
     });
   });
@@ -3539,7 +3636,9 @@
   unittest.group('obj-schema-PartitionQueryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionQueryRequest();
-      var od = api.PartitionQueryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionQueryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionQueryRequest(od as api.PartitionQueryRequest);
     });
   });
@@ -3547,7 +3646,9 @@
   unittest.group('obj-schema-PartitionQueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionQueryResponse();
-      var od = api.PartitionQueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionQueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionQueryResponse(od as api.PartitionQueryResponse);
     });
   });
@@ -3555,7 +3656,9 @@
   unittest.group('obj-schema-Precondition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrecondition();
-      var od = api.Precondition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Precondition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPrecondition(od as api.Precondition);
     });
   });
@@ -3563,7 +3666,9 @@
   unittest.group('obj-schema-Projection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjection();
-      var od = api.Projection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Projection.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProjection(od as api.Projection);
     });
   });
@@ -3571,7 +3676,9 @@
   unittest.group('obj-schema-QueryTarget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryTarget();
-      var od = api.QueryTarget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryTarget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryTarget(od as api.QueryTarget);
     });
   });
@@ -3579,7 +3686,9 @@
   unittest.group('obj-schema-ReadOnly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadOnly();
-      var od = api.ReadOnly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReadOnly.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReadOnly(od as api.ReadOnly);
     });
   });
@@ -3587,7 +3696,9 @@
   unittest.group('obj-schema-ReadWrite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadWrite();
-      var od = api.ReadWrite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReadWrite.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReadWrite(od as api.ReadWrite);
     });
   });
@@ -3595,7 +3706,9 @@
   unittest.group('obj-schema-RollbackRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRollbackRequest();
-      var od = api.RollbackRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RollbackRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRollbackRequest(od as api.RollbackRequest);
     });
   });
@@ -3603,7 +3716,9 @@
   unittest.group('obj-schema-RunQueryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunQueryRequest();
-      var od = api.RunQueryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunQueryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunQueryRequest(od as api.RunQueryRequest);
     });
   });
@@ -3611,7 +3726,9 @@
   unittest.group('obj-schema-RunQueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunQueryResponse();
-      var od = api.RunQueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunQueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunQueryResponse(od as api.RunQueryResponse);
     });
   });
@@ -3619,7 +3736,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -3627,7 +3746,9 @@
   unittest.group('obj-schema-StructuredQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStructuredQuery();
-      var od = api.StructuredQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StructuredQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStructuredQuery(od as api.StructuredQuery);
     });
   });
@@ -3635,7 +3756,9 @@
   unittest.group('obj-schema-Target', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTarget();
-      var od = api.Target.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Target.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTarget(od as api.Target);
     });
   });
@@ -3643,7 +3766,9 @@
   unittest.group('obj-schema-TargetChange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetChange();
-      var od = api.TargetChange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetChange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetChange(od as api.TargetChange);
     });
   });
@@ -3651,7 +3776,9 @@
   unittest.group('obj-schema-TransactionOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransactionOptions();
-      var od = api.TransactionOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransactionOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransactionOptions(od as api.TransactionOptions);
     });
   });
@@ -3659,7 +3786,9 @@
   unittest.group('obj-schema-UnaryFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnaryFilter();
-      var od = api.UnaryFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnaryFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnaryFilter(od as api.UnaryFilter);
     });
   });
@@ -3667,7 +3796,8 @@
   unittest.group('obj-schema-Value', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValue();
-      var od = api.Value.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Value.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkValue(od as api.Value);
     });
   });
@@ -3675,7 +3805,8 @@
   unittest.group('obj-schema-Write', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWrite();
-      var od = api.Write.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Write.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWrite(od as api.Write);
     });
   });
@@ -3683,7 +3814,9 @@
   unittest.group('obj-schema-WriteRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWriteRequest();
-      var od = api.WriteRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WriteRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWriteRequest(od as api.WriteRequest);
     });
   });
@@ -3691,7 +3824,9 @@
   unittest.group('obj-schema-WriteResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWriteResponse();
-      var od = api.WriteResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WriteResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWriteResponse(od as api.WriteResponse);
     });
   });
@@ -3699,7 +3834,9 @@
   unittest.group('obj-schema-WriteResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWriteResult();
-      var od = api.WriteResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WriteResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWriteResult(od as api.WriteResult);
     });
   });
diff --git a/generated/googleapis/test/fitness/v1_test.dart b/generated/googleapis/test/fitness/v1_test.dart
index 0b5642f..5a9d021 100644
--- a/generated/googleapis/test/fitness/v1_test.dart
+++ b/generated/googleapis/test/fitness/v1_test.dart
@@ -981,7 +981,9 @@
   unittest.group('obj-schema-AggregateBucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAggregateBucket();
-      var od = api.AggregateBucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AggregateBucket.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAggregateBucket(od as api.AggregateBucket);
     });
   });
@@ -989,7 +991,9 @@
   unittest.group('obj-schema-AggregateBy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAggregateBy();
-      var od = api.AggregateBy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AggregateBy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAggregateBy(od as api.AggregateBy);
     });
   });
@@ -997,7 +1001,9 @@
   unittest.group('obj-schema-AggregateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAggregateRequest();
-      var od = api.AggregateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AggregateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAggregateRequest(od as api.AggregateRequest);
     });
   });
@@ -1005,7 +1011,9 @@
   unittest.group('obj-schema-AggregateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAggregateResponse();
-      var od = api.AggregateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AggregateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAggregateResponse(od as api.AggregateResponse);
     });
   });
@@ -1013,7 +1021,9 @@
   unittest.group('obj-schema-Application', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplication();
-      var od = api.Application.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Application.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplication(od as api.Application);
     });
   });
@@ -1021,7 +1031,9 @@
   unittest.group('obj-schema-BucketByActivity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketByActivity();
-      var od = api.BucketByActivity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketByActivity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketByActivity(od as api.BucketByActivity);
     });
   });
@@ -1029,7 +1041,9 @@
   unittest.group('obj-schema-BucketBySession', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketBySession();
-      var od = api.BucketBySession.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketBySession.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketBySession(od as api.BucketBySession);
     });
   });
@@ -1037,7 +1051,9 @@
   unittest.group('obj-schema-BucketByTime', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketByTime();
-      var od = api.BucketByTime.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketByTime.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketByTime(od as api.BucketByTime);
     });
   });
@@ -1045,7 +1061,9 @@
   unittest.group('obj-schema-BucketByTimePeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketByTimePeriod();
-      var od = api.BucketByTimePeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketByTimePeriod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketByTimePeriod(od as api.BucketByTimePeriod);
     });
   });
@@ -1053,7 +1071,9 @@
   unittest.group('obj-schema-DataPoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataPoint();
-      var od = api.DataPoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DataPoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataPoint(od as api.DataPoint);
     });
   });
@@ -1061,7 +1081,9 @@
   unittest.group('obj-schema-DataSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSource();
-      var od = api.DataSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DataSource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataSource(od as api.DataSource);
     });
   });
@@ -1069,7 +1091,9 @@
   unittest.group('obj-schema-DataType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataType();
-      var od = api.DataType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DataType.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataType(od as api.DataType);
     });
   });
@@ -1077,7 +1101,9 @@
   unittest.group('obj-schema-DataTypeField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataTypeField();
-      var od = api.DataTypeField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataTypeField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataTypeField(od as api.DataTypeField);
     });
   });
@@ -1085,7 +1111,9 @@
   unittest.group('obj-schema-Dataset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataset();
-      var od = api.Dataset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Dataset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataset(od as api.Dataset);
     });
   });
@@ -1093,7 +1121,9 @@
   unittest.group('obj-schema-Device', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDevice();
-      var od = api.Device.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Device.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDevice(od as api.Device);
     });
   });
@@ -1101,7 +1131,9 @@
   unittest.group('obj-schema-ListDataPointChangesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDataPointChangesResponse();
-      var od = api.ListDataPointChangesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDataPointChangesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDataPointChangesResponse(od as api.ListDataPointChangesResponse);
     });
   });
@@ -1109,7 +1141,9 @@
   unittest.group('obj-schema-ListDataSourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDataSourcesResponse();
-      var od = api.ListDataSourcesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDataSourcesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDataSourcesResponse(od as api.ListDataSourcesResponse);
     });
   });
@@ -1117,7 +1151,9 @@
   unittest.group('obj-schema-ListSessionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSessionsResponse();
-      var od = api.ListSessionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSessionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSessionsResponse(od as api.ListSessionsResponse);
     });
   });
@@ -1125,7 +1161,9 @@
   unittest.group('obj-schema-MapValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMapValue();
-      var od = api.MapValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MapValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMapValue(od as api.MapValue);
     });
   });
@@ -1133,7 +1171,9 @@
   unittest.group('obj-schema-Session', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSession();
-      var od = api.Session.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Session.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSession(od as api.Session);
     });
   });
@@ -1141,7 +1181,8 @@
   unittest.group('obj-schema-Value', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValue();
-      var od = api.Value.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Value.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkValue(od as api.Value);
     });
   });
@@ -1149,7 +1190,9 @@
   unittest.group('obj-schema-ValueMapValEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValueMapValEntry();
-      var od = api.ValueMapValEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValueMapValEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValueMapValEntry(od as api.ValueMapValEntry);
     });
   });
diff --git a/generated/googleapis/test/games/v1_test.dart b/generated/googleapis/test/games/v1_test.dart
index 6eb18dc..0ab5f9e 100644
--- a/generated/googleapis/test/games/v1_test.dart
+++ b/generated/googleapis/test/games/v1_test.dart
@@ -2887,7 +2887,9 @@
   unittest.group('obj-schema-AchievementDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementDefinition();
-      var od = api.AchievementDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementDefinition(od as api.AchievementDefinition);
     });
   });
@@ -2895,7 +2897,9 @@
   unittest.group('obj-schema-AchievementDefinitionsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementDefinitionsListResponse();
-      var od = api.AchievementDefinitionsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementDefinitionsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementDefinitionsListResponse(
           od as api.AchievementDefinitionsListResponse);
     });
@@ -2904,7 +2908,9 @@
   unittest.group('obj-schema-AchievementIncrementResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementIncrementResponse();
-      var od = api.AchievementIncrementResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementIncrementResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementIncrementResponse(od as api.AchievementIncrementResponse);
     });
   });
@@ -2912,7 +2918,9 @@
   unittest.group('obj-schema-AchievementRevealResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementRevealResponse();
-      var od = api.AchievementRevealResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementRevealResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementRevealResponse(od as api.AchievementRevealResponse);
     });
   });
@@ -2920,7 +2928,9 @@
   unittest.group('obj-schema-AchievementSetStepsAtLeastResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementSetStepsAtLeastResponse();
-      var od = api.AchievementSetStepsAtLeastResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementSetStepsAtLeastResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementSetStepsAtLeastResponse(
           od as api.AchievementSetStepsAtLeastResponse);
     });
@@ -2929,7 +2939,9 @@
   unittest.group('obj-schema-AchievementUnlockResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementUnlockResponse();
-      var od = api.AchievementUnlockResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementUnlockResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementUnlockResponse(od as api.AchievementUnlockResponse);
     });
   });
@@ -2937,7 +2949,9 @@
   unittest.group('obj-schema-AchievementUpdateMultipleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementUpdateMultipleRequest();
-      var od = api.AchievementUpdateMultipleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementUpdateMultipleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementUpdateMultipleRequest(
           od as api.AchievementUpdateMultipleRequest);
     });
@@ -2946,7 +2960,9 @@
   unittest.group('obj-schema-AchievementUpdateMultipleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementUpdateMultipleResponse();
-      var od = api.AchievementUpdateMultipleResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementUpdateMultipleResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementUpdateMultipleResponse(
           od as api.AchievementUpdateMultipleResponse);
     });
@@ -2955,7 +2971,9 @@
   unittest.group('obj-schema-AchievementUpdateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementUpdateRequest();
-      var od = api.AchievementUpdateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementUpdateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementUpdateRequest(od as api.AchievementUpdateRequest);
     });
   });
@@ -2963,7 +2981,9 @@
   unittest.group('obj-schema-AchievementUpdateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementUpdateResponse();
-      var od = api.AchievementUpdateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementUpdateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementUpdateResponse(od as api.AchievementUpdateResponse);
     });
   });
@@ -2971,7 +2991,9 @@
   unittest.group('obj-schema-Application', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplication();
-      var od = api.Application.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Application.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplication(od as api.Application);
     });
   });
@@ -2979,7 +3001,9 @@
   unittest.group('obj-schema-ApplicationCategory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationCategory();
-      var od = api.ApplicationCategory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationCategory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationCategory(od as api.ApplicationCategory);
     });
   });
@@ -2987,7 +3011,9 @@
   unittest.group('obj-schema-ApplicationVerifyResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationVerifyResponse();
-      var od = api.ApplicationVerifyResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationVerifyResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationVerifyResponse(od as api.ApplicationVerifyResponse);
     });
   });
@@ -2995,7 +3021,9 @@
   unittest.group('obj-schema-Category', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategory();
-      var od = api.Category.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Category.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCategory(od as api.Category);
     });
   });
@@ -3003,7 +3031,9 @@
   unittest.group('obj-schema-CategoryListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategoryListResponse();
-      var od = api.CategoryListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CategoryListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCategoryListResponse(od as api.CategoryListResponse);
     });
   });
@@ -3011,7 +3041,9 @@
   unittest.group('obj-schema-EndPoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndPoint();
-      var od = api.EndPoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EndPoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEndPoint(od as api.EndPoint);
     });
   });
@@ -3019,7 +3051,9 @@
   unittest.group('obj-schema-EventBatchRecordFailure', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventBatchRecordFailure();
-      var od = api.EventBatchRecordFailure.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventBatchRecordFailure.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventBatchRecordFailure(od as api.EventBatchRecordFailure);
     });
   });
@@ -3027,7 +3061,9 @@
   unittest.group('obj-schema-EventChild', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventChild();
-      var od = api.EventChild.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EventChild.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEventChild(od as api.EventChild);
     });
   });
@@ -3035,7 +3071,9 @@
   unittest.group('obj-schema-EventDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventDefinition();
-      var od = api.EventDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventDefinition(od as api.EventDefinition);
     });
   });
@@ -3043,7 +3081,9 @@
   unittest.group('obj-schema-EventDefinitionListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventDefinitionListResponse();
-      var od = api.EventDefinitionListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventDefinitionListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventDefinitionListResponse(od as api.EventDefinitionListResponse);
     });
   });
@@ -3051,7 +3091,9 @@
   unittest.group('obj-schema-EventPeriodRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventPeriodRange();
-      var od = api.EventPeriodRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventPeriodRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventPeriodRange(od as api.EventPeriodRange);
     });
   });
@@ -3059,7 +3101,9 @@
   unittest.group('obj-schema-EventPeriodUpdate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventPeriodUpdate();
-      var od = api.EventPeriodUpdate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventPeriodUpdate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventPeriodUpdate(od as api.EventPeriodUpdate);
     });
   });
@@ -3067,7 +3111,9 @@
   unittest.group('obj-schema-EventRecordFailure', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventRecordFailure();
-      var od = api.EventRecordFailure.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventRecordFailure.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventRecordFailure(od as api.EventRecordFailure);
     });
   });
@@ -3075,7 +3121,9 @@
   unittest.group('obj-schema-EventRecordRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventRecordRequest();
-      var od = api.EventRecordRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventRecordRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventRecordRequest(od as api.EventRecordRequest);
     });
   });
@@ -3083,7 +3131,9 @@
   unittest.group('obj-schema-EventUpdateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventUpdateRequest();
-      var od = api.EventUpdateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventUpdateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventUpdateRequest(od as api.EventUpdateRequest);
     });
   });
@@ -3091,7 +3141,9 @@
   unittest.group('obj-schema-EventUpdateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventUpdateResponse();
-      var od = api.EventUpdateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventUpdateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventUpdateResponse(od as api.EventUpdateResponse);
     });
   });
@@ -3099,7 +3151,9 @@
   unittest.group('obj-schema-GamesAchievementIncrement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGamesAchievementIncrement();
-      var od = api.GamesAchievementIncrement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GamesAchievementIncrement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGamesAchievementIncrement(od as api.GamesAchievementIncrement);
     });
   });
@@ -3107,7 +3161,9 @@
   unittest.group('obj-schema-GamesAchievementSetStepsAtLeast', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGamesAchievementSetStepsAtLeast();
-      var od = api.GamesAchievementSetStepsAtLeast.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GamesAchievementSetStepsAtLeast.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGamesAchievementSetStepsAtLeast(
           od as api.GamesAchievementSetStepsAtLeast);
     });
@@ -3116,7 +3172,9 @@
   unittest.group('obj-schema-ImageAsset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageAsset();
-      var od = api.ImageAsset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ImageAsset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImageAsset(od as api.ImageAsset);
     });
   });
@@ -3124,7 +3182,9 @@
   unittest.group('obj-schema-Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstance();
-      var od = api.Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Instance.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstance(od as api.Instance);
     });
   });
@@ -3132,7 +3192,9 @@
   unittest.group('obj-schema-InstanceAndroidDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceAndroidDetails();
-      var od = api.InstanceAndroidDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceAndroidDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceAndroidDetails(od as api.InstanceAndroidDetails);
     });
   });
@@ -3140,7 +3202,9 @@
   unittest.group('obj-schema-InstanceIosDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceIosDetails();
-      var od = api.InstanceIosDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceIosDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceIosDetails(od as api.InstanceIosDetails);
     });
   });
@@ -3148,7 +3212,9 @@
   unittest.group('obj-schema-InstanceWebDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceWebDetails();
-      var od = api.InstanceWebDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceWebDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceWebDetails(od as api.InstanceWebDetails);
     });
   });
@@ -3156,7 +3222,9 @@
   unittest.group('obj-schema-Leaderboard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLeaderboard();
-      var od = api.Leaderboard.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Leaderboard.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLeaderboard(od as api.Leaderboard);
     });
   });
@@ -3164,7 +3232,9 @@
   unittest.group('obj-schema-LeaderboardEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLeaderboardEntry();
-      var od = api.LeaderboardEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LeaderboardEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLeaderboardEntry(od as api.LeaderboardEntry);
     });
   });
@@ -3172,7 +3242,9 @@
   unittest.group('obj-schema-LeaderboardListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLeaderboardListResponse();
-      var od = api.LeaderboardListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LeaderboardListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLeaderboardListResponse(od as api.LeaderboardListResponse);
     });
   });
@@ -3180,7 +3252,9 @@
   unittest.group('obj-schema-LeaderboardScoreRank', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLeaderboardScoreRank();
-      var od = api.LeaderboardScoreRank.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LeaderboardScoreRank.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLeaderboardScoreRank(od as api.LeaderboardScoreRank);
     });
   });
@@ -3188,7 +3262,9 @@
   unittest.group('obj-schema-LeaderboardScores', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLeaderboardScores();
-      var od = api.LeaderboardScores.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LeaderboardScores.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLeaderboardScores(od as api.LeaderboardScores);
     });
   });
@@ -3196,7 +3272,9 @@
   unittest.group('obj-schema-MetagameConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetagameConfig();
-      var od = api.MetagameConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetagameConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetagameConfig(od as api.MetagameConfig);
     });
   });
@@ -3204,7 +3282,9 @@
   unittest.group('obj-schema-PlayerName', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerName();
-      var od = api.PlayerName.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PlayerName.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPlayerName(od as api.PlayerName);
     });
   });
@@ -3212,7 +3292,9 @@
   unittest.group('obj-schema-Player', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayer();
-      var od = api.Player.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Player.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPlayer(od as api.Player);
     });
   });
@@ -3220,7 +3302,9 @@
   unittest.group('obj-schema-PlayerAchievement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerAchievement();
-      var od = api.PlayerAchievement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerAchievement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerAchievement(od as api.PlayerAchievement);
     });
   });
@@ -3228,7 +3312,9 @@
   unittest.group('obj-schema-PlayerAchievementListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerAchievementListResponse();
-      var od = api.PlayerAchievementListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerAchievementListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerAchievementListResponse(
           od as api.PlayerAchievementListResponse);
     });
@@ -3237,7 +3323,9 @@
   unittest.group('obj-schema-PlayerEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerEvent();
-      var od = api.PlayerEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerEvent(od as api.PlayerEvent);
     });
   });
@@ -3245,7 +3333,9 @@
   unittest.group('obj-schema-PlayerEventListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerEventListResponse();
-      var od = api.PlayerEventListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerEventListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerEventListResponse(od as api.PlayerEventListResponse);
     });
   });
@@ -3253,7 +3343,9 @@
   unittest.group('obj-schema-PlayerExperienceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerExperienceInfo();
-      var od = api.PlayerExperienceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerExperienceInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerExperienceInfo(od as api.PlayerExperienceInfo);
     });
   });
@@ -3261,7 +3353,9 @@
   unittest.group('obj-schema-PlayerLeaderboardScore', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerLeaderboardScore();
-      var od = api.PlayerLeaderboardScore.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerLeaderboardScore.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerLeaderboardScore(od as api.PlayerLeaderboardScore);
     });
   });
@@ -3269,7 +3363,9 @@
   unittest.group('obj-schema-PlayerLeaderboardScoreListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerLeaderboardScoreListResponse();
-      var od = api.PlayerLeaderboardScoreListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerLeaderboardScoreListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerLeaderboardScoreListResponse(
           od as api.PlayerLeaderboardScoreListResponse);
     });
@@ -3278,7 +3374,9 @@
   unittest.group('obj-schema-PlayerLevel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerLevel();
-      var od = api.PlayerLevel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerLevel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerLevel(od as api.PlayerLevel);
     });
   });
@@ -3286,7 +3384,9 @@
   unittest.group('obj-schema-PlayerListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerListResponse();
-      var od = api.PlayerListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerListResponse(od as api.PlayerListResponse);
     });
   });
@@ -3294,7 +3394,9 @@
   unittest.group('obj-schema-PlayerScore', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerScore();
-      var od = api.PlayerScore.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerScore.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerScore(od as api.PlayerScore);
     });
   });
@@ -3302,7 +3404,9 @@
   unittest.group('obj-schema-PlayerScoreListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerScoreListResponse();
-      var od = api.PlayerScoreListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerScoreListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerScoreListResponse(od as api.PlayerScoreListResponse);
     });
   });
@@ -3310,7 +3414,9 @@
   unittest.group('obj-schema-PlayerScoreResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerScoreResponse();
-      var od = api.PlayerScoreResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerScoreResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerScoreResponse(od as api.PlayerScoreResponse);
     });
   });
@@ -3318,7 +3424,9 @@
   unittest.group('obj-schema-PlayerScoreSubmissionList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerScoreSubmissionList();
-      var od = api.PlayerScoreSubmissionList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerScoreSubmissionList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerScoreSubmissionList(od as api.PlayerScoreSubmissionList);
     });
   });
@@ -3326,7 +3434,9 @@
   unittest.group('obj-schema-ProfileSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfileSettings();
-      var od = api.ProfileSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProfileSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProfileSettings(od as api.ProfileSettings);
     });
   });
@@ -3334,7 +3444,9 @@
   unittest.group('obj-schema-ResolveSnapshotHeadRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResolveSnapshotHeadRequest();
-      var od = api.ResolveSnapshotHeadRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResolveSnapshotHeadRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResolveSnapshotHeadRequest(od as api.ResolveSnapshotHeadRequest);
     });
   });
@@ -3342,7 +3454,9 @@
   unittest.group('obj-schema-ResolveSnapshotHeadResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResolveSnapshotHeadResponse();
-      var od = api.ResolveSnapshotHeadResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResolveSnapshotHeadResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResolveSnapshotHeadResponse(od as api.ResolveSnapshotHeadResponse);
     });
   });
@@ -3350,7 +3464,9 @@
   unittest.group('obj-schema-RevisionCheckResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevisionCheckResponse();
-      var od = api.RevisionCheckResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevisionCheckResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevisionCheckResponse(od as api.RevisionCheckResponse);
     });
   });
@@ -3358,7 +3474,9 @@
   unittest.group('obj-schema-ScoreSubmission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScoreSubmission();
-      var od = api.ScoreSubmission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScoreSubmission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScoreSubmission(od as api.ScoreSubmission);
     });
   });
@@ -3366,7 +3484,9 @@
   unittest.group('obj-schema-Snapshot', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshot();
-      var od = api.Snapshot.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Snapshot.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSnapshot(od as api.Snapshot);
     });
   });
@@ -3374,7 +3494,9 @@
   unittest.group('obj-schema-SnapshotCoverImageResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotCoverImageResource();
-      var od = api.SnapshotCoverImageResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotCoverImageResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotCoverImageResource(od as api.SnapshotCoverImageResource);
     });
   });
@@ -3382,7 +3504,9 @@
   unittest.group('obj-schema-SnapshotDataResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotDataResource();
-      var od = api.SnapshotDataResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotDataResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotDataResource(od as api.SnapshotDataResource);
     });
   });
@@ -3390,7 +3514,9 @@
   unittest.group('obj-schema-SnapshotExtended', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotExtended();
-      var od = api.SnapshotExtended.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotExtended.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotExtended(od as api.SnapshotExtended);
     });
   });
@@ -3398,7 +3524,9 @@
   unittest.group('obj-schema-SnapshotImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotImage();
-      var od = api.SnapshotImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotImage(od as api.SnapshotImage);
     });
   });
@@ -3406,7 +3534,9 @@
   unittest.group('obj-schema-SnapshotListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotListResponse();
-      var od = api.SnapshotListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotListResponse(od as api.SnapshotListResponse);
     });
   });
@@ -3414,7 +3544,9 @@
   unittest.group('obj-schema-SnapshotMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotMetadata();
-      var od = api.SnapshotMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotMetadata(od as api.SnapshotMetadata);
     });
   });
@@ -3422,7 +3554,9 @@
   unittest.group('obj-schema-SnapshotRevision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotRevision();
-      var od = api.SnapshotRevision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotRevision.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotRevision(od as api.SnapshotRevision);
     });
   });
@@ -3430,7 +3564,9 @@
   unittest.group('obj-schema-StatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatsResponse();
-      var od = api.StatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStatsResponse(od as api.StatsResponse);
     });
   });
diff --git a/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart b/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
index 7bdfaff..84fddcc 100644
--- a/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
+++ b/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
@@ -473,7 +473,9 @@
   unittest.group('obj-schema-AchievementConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementConfiguration();
-      var od = api.AchievementConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementConfiguration(od as api.AchievementConfiguration);
     });
   });
@@ -481,7 +483,9 @@
   unittest.group('obj-schema-AchievementConfigurationDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementConfigurationDetail();
-      var od = api.AchievementConfigurationDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementConfigurationDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementConfigurationDetail(
           od as api.AchievementConfigurationDetail);
     });
@@ -490,7 +494,9 @@
   unittest.group('obj-schema-AchievementConfigurationListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementConfigurationListResponse();
-      var od = api.AchievementConfigurationListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementConfigurationListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementConfigurationListResponse(
           od as api.AchievementConfigurationListResponse);
     });
@@ -499,7 +505,9 @@
   unittest.group('obj-schema-GamesNumberAffixConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGamesNumberAffixConfiguration();
-      var od = api.GamesNumberAffixConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GamesNumberAffixConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGamesNumberAffixConfiguration(
           od as api.GamesNumberAffixConfiguration);
     });
@@ -508,7 +516,9 @@
   unittest.group('obj-schema-GamesNumberFormatConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGamesNumberFormatConfiguration();
-      var od = api.GamesNumberFormatConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GamesNumberFormatConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGamesNumberFormatConfiguration(
           od as api.GamesNumberFormatConfiguration);
     });
@@ -517,7 +527,9 @@
   unittest.group('obj-schema-ImageConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageConfiguration();
-      var od = api.ImageConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageConfiguration(od as api.ImageConfiguration);
     });
   });
@@ -525,7 +537,9 @@
   unittest.group('obj-schema-LeaderboardConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLeaderboardConfiguration();
-      var od = api.LeaderboardConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LeaderboardConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLeaderboardConfiguration(od as api.LeaderboardConfiguration);
     });
   });
@@ -533,7 +547,9 @@
   unittest.group('obj-schema-LeaderboardConfigurationDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLeaderboardConfigurationDetail();
-      var od = api.LeaderboardConfigurationDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LeaderboardConfigurationDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLeaderboardConfigurationDetail(
           od as api.LeaderboardConfigurationDetail);
     });
@@ -542,7 +558,9 @@
   unittest.group('obj-schema-LeaderboardConfigurationListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLeaderboardConfigurationListResponse();
-      var od = api.LeaderboardConfigurationListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LeaderboardConfigurationListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLeaderboardConfigurationListResponse(
           od as api.LeaderboardConfigurationListResponse);
     });
@@ -551,7 +569,9 @@
   unittest.group('obj-schema-LocalizedString', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalizedString();
-      var od = api.LocalizedString.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalizedString.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalizedString(od as api.LocalizedString);
     });
   });
@@ -559,7 +579,9 @@
   unittest.group('obj-schema-LocalizedStringBundle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalizedStringBundle();
-      var od = api.LocalizedStringBundle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalizedStringBundle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalizedStringBundle(od as api.LocalizedStringBundle);
     });
   });
diff --git a/generated/googleapis/test/gameservices/v1_test.dart b/generated/googleapis/test/gameservices/v1_test.dart
index 8b02c4d..3de9982 100644
--- a/generated/googleapis/test/gameservices/v1_test.dart
+++ b/generated/googleapis/test/gameservices/v1_test.dart
@@ -2653,7 +2653,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -2661,7 +2663,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -2669,7 +2673,9 @@
   unittest.group('obj-schema-AuthorizationLoggingOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizationLoggingOptions();
-      var od = api.AuthorizationLoggingOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizationLoggingOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizationLoggingOptions(od as api.AuthorizationLoggingOptions);
     });
   });
@@ -2677,7 +2683,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -2685,7 +2693,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -2693,7 +2703,9 @@
   unittest.group('obj-schema-CloudAuditOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudAuditOptions();
-      var od = api.CloudAuditOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudAuditOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudAuditOptions(od as api.CloudAuditOptions);
     });
   });
@@ -2701,7 +2713,9 @@
   unittest.group('obj-schema-Condition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCondition();
-      var od = api.Condition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Condition.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCondition(od as api.Condition);
     });
   });
@@ -2709,7 +2723,9 @@
   unittest.group('obj-schema-CounterOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCounterOptions();
-      var od = api.CounterOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CounterOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCounterOptions(od as api.CounterOptions);
     });
   });
@@ -2717,7 +2733,9 @@
   unittest.group('obj-schema-CustomField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomField();
-      var od = api.CustomField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomField(od as api.CustomField);
     });
   });
@@ -2725,7 +2743,9 @@
   unittest.group('obj-schema-DataAccessOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataAccessOptions();
-      var od = api.DataAccessOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataAccessOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataAccessOptions(od as api.DataAccessOptions);
     });
   });
@@ -2733,7 +2753,9 @@
   unittest.group('obj-schema-DeployedClusterState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployedClusterState();
-      var od = api.DeployedClusterState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeployedClusterState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeployedClusterState(od as api.DeployedClusterState);
     });
   });
@@ -2741,7 +2763,9 @@
   unittest.group('obj-schema-DeployedFleet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployedFleet();
-      var od = api.DeployedFleet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeployedFleet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeployedFleet(od as api.DeployedFleet);
     });
   });
@@ -2749,7 +2773,9 @@
   unittest.group('obj-schema-DeployedFleetAutoscaler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployedFleetAutoscaler();
-      var od = api.DeployedFleetAutoscaler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeployedFleetAutoscaler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeployedFleetAutoscaler(od as api.DeployedFleetAutoscaler);
     });
   });
@@ -2757,7 +2783,9 @@
   unittest.group('obj-schema-DeployedFleetDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployedFleetDetails();
-      var od = api.DeployedFleetDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeployedFleetDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeployedFleetDetails(od as api.DeployedFleetDetails);
     });
   });
@@ -2765,7 +2793,9 @@
   unittest.group('obj-schema-DeployedFleetStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployedFleetStatus();
-      var od = api.DeployedFleetStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeployedFleetStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeployedFleetStatus(od as api.DeployedFleetStatus);
     });
   });
@@ -2773,7 +2803,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2781,7 +2812,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -2789,7 +2821,9 @@
   unittest.group('obj-schema-FetchDeploymentStateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFetchDeploymentStateRequest();
-      var od = api.FetchDeploymentStateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FetchDeploymentStateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFetchDeploymentStateRequest(od as api.FetchDeploymentStateRequest);
     });
   });
@@ -2797,7 +2831,9 @@
   unittest.group('obj-schema-FetchDeploymentStateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFetchDeploymentStateResponse();
-      var od = api.FetchDeploymentStateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FetchDeploymentStateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFetchDeploymentStateResponse(od as api.FetchDeploymentStateResponse);
     });
   });
@@ -2805,7 +2841,9 @@
   unittest.group('obj-schema-FleetConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFleetConfig();
-      var od = api.FleetConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FleetConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFleetConfig(od as api.FleetConfig);
     });
   });
@@ -2813,7 +2851,9 @@
   unittest.group('obj-schema-GameServerCluster', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGameServerCluster();
-      var od = api.GameServerCluster.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GameServerCluster.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGameServerCluster(od as api.GameServerCluster);
     });
   });
@@ -2821,7 +2861,9 @@
   unittest.group('obj-schema-GameServerClusterConnectionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGameServerClusterConnectionInfo();
-      var od = api.GameServerClusterConnectionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GameServerClusterConnectionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGameServerClusterConnectionInfo(
           od as api.GameServerClusterConnectionInfo);
     });
@@ -2830,7 +2872,9 @@
   unittest.group('obj-schema-GameServerConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGameServerConfig();
-      var od = api.GameServerConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GameServerConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGameServerConfig(od as api.GameServerConfig);
     });
   });
@@ -2838,7 +2882,9 @@
   unittest.group('obj-schema-GameServerConfigOverride', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGameServerConfigOverride();
-      var od = api.GameServerConfigOverride.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GameServerConfigOverride.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGameServerConfigOverride(od as api.GameServerConfigOverride);
     });
   });
@@ -2846,7 +2892,9 @@
   unittest.group('obj-schema-GameServerDeployment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGameServerDeployment();
-      var od = api.GameServerDeployment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GameServerDeployment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGameServerDeployment(od as api.GameServerDeployment);
     });
   });
@@ -2854,7 +2902,9 @@
   unittest.group('obj-schema-GameServerDeploymentRollout', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGameServerDeploymentRollout();
-      var od = api.GameServerDeploymentRollout.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GameServerDeploymentRollout.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGameServerDeploymentRollout(od as api.GameServerDeploymentRollout);
     });
   });
@@ -2862,7 +2912,9 @@
   unittest.group('obj-schema-GkeClusterReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGkeClusterReference();
-      var od = api.GkeClusterReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GkeClusterReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGkeClusterReference(od as api.GkeClusterReference);
     });
   });
@@ -2870,7 +2922,9 @@
   unittest.group('obj-schema-LabelSelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabelSelector();
-      var od = api.LabelSelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LabelSelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLabelSelector(od as api.LabelSelector);
     });
   });
@@ -2878,7 +2932,9 @@
   unittest.group('obj-schema-ListGameServerClustersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGameServerClustersResponse();
-      var od = api.ListGameServerClustersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGameServerClustersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGameServerClustersResponse(
           od as api.ListGameServerClustersResponse);
     });
@@ -2887,7 +2943,9 @@
   unittest.group('obj-schema-ListGameServerConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGameServerConfigsResponse();
-      var od = api.ListGameServerConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGameServerConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGameServerConfigsResponse(
           od as api.ListGameServerConfigsResponse);
     });
@@ -2896,7 +2954,9 @@
   unittest.group('obj-schema-ListGameServerDeploymentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGameServerDeploymentsResponse();
-      var od = api.ListGameServerDeploymentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGameServerDeploymentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGameServerDeploymentsResponse(
           od as api.ListGameServerDeploymentsResponse);
     });
@@ -2905,7 +2965,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -2913,7 +2975,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -2921,7 +2985,9 @@
   unittest.group('obj-schema-ListRealmsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRealmsResponse();
-      var od = api.ListRealmsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRealmsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRealmsResponse(od as api.ListRealmsResponse);
     });
   });
@@ -2929,7 +2995,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2937,7 +3005,9 @@
   unittest.group('obj-schema-LogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogConfig();
-      var od = api.LogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LogConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogConfig(od as api.LogConfig);
     });
   });
@@ -2945,7 +3015,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2953,7 +3025,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -2961,7 +3035,9 @@
   unittest.group('obj-schema-OperationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationStatus();
-      var od = api.OperationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationStatus(od as api.OperationStatus);
     });
   });
@@ -2969,7 +3045,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2977,7 +3055,9 @@
   unittest.group('obj-schema-PreviewCreateGameServerClusterResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPreviewCreateGameServerClusterResponse();
-      var od = api.PreviewCreateGameServerClusterResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PreviewCreateGameServerClusterResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPreviewCreateGameServerClusterResponse(
           od as api.PreviewCreateGameServerClusterResponse);
     });
@@ -2986,7 +3066,9 @@
   unittest.group('obj-schema-PreviewDeleteGameServerClusterResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPreviewDeleteGameServerClusterResponse();
-      var od = api.PreviewDeleteGameServerClusterResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PreviewDeleteGameServerClusterResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPreviewDeleteGameServerClusterResponse(
           od as api.PreviewDeleteGameServerClusterResponse);
     });
@@ -2995,8 +3077,9 @@
   unittest.group('obj-schema-PreviewGameServerDeploymentRolloutResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPreviewGameServerDeploymentRolloutResponse();
-      var od =
-          api.PreviewGameServerDeploymentRolloutResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PreviewGameServerDeploymentRolloutResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPreviewGameServerDeploymentRolloutResponse(
           od as api.PreviewGameServerDeploymentRolloutResponse);
     });
@@ -3005,7 +3088,9 @@
   unittest.group('obj-schema-PreviewRealmUpdateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPreviewRealmUpdateResponse();
-      var od = api.PreviewRealmUpdateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PreviewRealmUpdateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPreviewRealmUpdateResponse(od as api.PreviewRealmUpdateResponse);
     });
   });
@@ -3013,7 +3098,9 @@
   unittest.group('obj-schema-PreviewUpdateGameServerClusterResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPreviewUpdateGameServerClusterResponse();
-      var od = api.PreviewUpdateGameServerClusterResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PreviewUpdateGameServerClusterResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPreviewUpdateGameServerClusterResponse(
           od as api.PreviewUpdateGameServerClusterResponse);
     });
@@ -3022,7 +3109,8 @@
   unittest.group('obj-schema-Realm', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRealm();
-      var od = api.Realm.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Realm.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRealm(od as api.Realm);
     });
   });
@@ -3030,7 +3118,9 @@
   unittest.group('obj-schema-RealmSelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRealmSelector();
-      var od = api.RealmSelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RealmSelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRealmSelector(od as api.RealmSelector);
     });
   });
@@ -3038,7 +3128,8 @@
   unittest.group('obj-schema-Rule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRule();
-      var od = api.Rule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Rule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRule(od as api.Rule);
     });
   });
@@ -3046,7 +3137,9 @@
   unittest.group('obj-schema-ScalingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScalingConfig();
-      var od = api.ScalingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScalingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScalingConfig(od as api.ScalingConfig);
     });
   });
@@ -3054,7 +3147,9 @@
   unittest.group('obj-schema-Schedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchedule();
-      var od = api.Schedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schedule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchedule(od as api.Schedule);
     });
   });
@@ -3062,7 +3157,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -3070,7 +3167,9 @@
   unittest.group('obj-schema-SpecSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpecSource();
-      var od = api.SpecSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SpecSource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSpecSource(od as api.SpecSource);
     });
   });
@@ -3078,7 +3177,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -3086,7 +3187,9 @@
   unittest.group('obj-schema-TargetDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetDetails();
-      var od = api.TargetDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetDetails(od as api.TargetDetails);
     });
   });
@@ -3094,7 +3197,9 @@
   unittest.group('obj-schema-TargetFleet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetFleet();
-      var od = api.TargetFleet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetFleet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetFleet(od as api.TargetFleet);
     });
   });
@@ -3102,7 +3207,9 @@
   unittest.group('obj-schema-TargetFleetAutoscaler', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetFleetAutoscaler();
-      var od = api.TargetFleetAutoscaler.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetFleetAutoscaler.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetFleetAutoscaler(od as api.TargetFleetAutoscaler);
     });
   });
@@ -3110,7 +3217,9 @@
   unittest.group('obj-schema-TargetFleetDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetFleetDetails();
-      var od = api.TargetFleetDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetFleetDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetFleetDetails(od as api.TargetFleetDetails);
     });
   });
@@ -3118,7 +3227,9 @@
   unittest.group('obj-schema-TargetState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetState();
-      var od = api.TargetState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetState(od as api.TargetState);
     });
   });
@@ -3126,7 +3237,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -3134,7 +3247,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis/test/gamesmanagement/v1management_test.dart b/generated/googleapis/test/gamesmanagement/v1management_test.dart
index c67dfbf..964d2d0 100644
--- a/generated/googleapis/test/gamesmanagement/v1management_test.dart
+++ b/generated/googleapis/test/gamesmanagement/v1management_test.dart
@@ -571,7 +571,9 @@
   unittest.group('obj-schema-AchievementResetAllResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementResetAllResponse();
-      var od = api.AchievementResetAllResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementResetAllResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementResetAllResponse(od as api.AchievementResetAllResponse);
     });
   });
@@ -579,7 +581,9 @@
   unittest.group('obj-schema-AchievementResetMultipleForAllRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementResetMultipleForAllRequest();
-      var od = api.AchievementResetMultipleForAllRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementResetMultipleForAllRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementResetMultipleForAllRequest(
           od as api.AchievementResetMultipleForAllRequest);
     });
@@ -588,7 +592,9 @@
   unittest.group('obj-schema-AchievementResetResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAchievementResetResponse();
-      var od = api.AchievementResetResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AchievementResetResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAchievementResetResponse(od as api.AchievementResetResponse);
     });
   });
@@ -596,7 +602,9 @@
   unittest.group('obj-schema-EventsResetMultipleForAllRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEventsResetMultipleForAllRequest();
-      var od = api.EventsResetMultipleForAllRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EventsResetMultipleForAllRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEventsResetMultipleForAllRequest(
           od as api.EventsResetMultipleForAllRequest);
     });
@@ -605,7 +613,9 @@
   unittest.group('obj-schema-GamesPlayerExperienceInfoResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGamesPlayerExperienceInfoResource();
-      var od = api.GamesPlayerExperienceInfoResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GamesPlayerExperienceInfoResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGamesPlayerExperienceInfoResource(
           od as api.GamesPlayerExperienceInfoResource);
     });
@@ -614,7 +624,9 @@
   unittest.group('obj-schema-GamesPlayerLevelResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGamesPlayerLevelResource();
-      var od = api.GamesPlayerLevelResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GamesPlayerLevelResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGamesPlayerLevelResource(od as api.GamesPlayerLevelResource);
     });
   });
@@ -622,7 +634,9 @@
   unittest.group('obj-schema-HiddenPlayer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHiddenPlayer();
-      var od = api.HiddenPlayer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HiddenPlayer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHiddenPlayer(od as api.HiddenPlayer);
     });
   });
@@ -630,7 +644,9 @@
   unittest.group('obj-schema-HiddenPlayerList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHiddenPlayerList();
-      var od = api.HiddenPlayerList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HiddenPlayerList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHiddenPlayerList(od as api.HiddenPlayerList);
     });
   });
@@ -638,7 +654,9 @@
   unittest.group('obj-schema-PlayerName', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerName();
-      var od = api.PlayerName.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PlayerName.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPlayerName(od as api.PlayerName);
     });
   });
@@ -646,7 +664,9 @@
   unittest.group('obj-schema-Player', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayer();
-      var od = api.Player.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Player.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPlayer(od as api.Player);
     });
   });
@@ -654,7 +674,9 @@
   unittest.group('obj-schema-PlayerScoreResetAllResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerScoreResetAllResponse();
-      var od = api.PlayerScoreResetAllResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerScoreResetAllResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerScoreResetAllResponse(od as api.PlayerScoreResetAllResponse);
     });
   });
@@ -662,7 +684,9 @@
   unittest.group('obj-schema-PlayerScoreResetResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlayerScoreResetResponse();
-      var od = api.PlayerScoreResetResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlayerScoreResetResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlayerScoreResetResponse(od as api.PlayerScoreResetResponse);
     });
   });
@@ -670,7 +694,9 @@
   unittest.group('obj-schema-ProfileSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfileSettings();
-      var od = api.ProfileSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProfileSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProfileSettings(od as api.ProfileSettings);
     });
   });
@@ -678,7 +704,9 @@
   unittest.group('obj-schema-ScoresResetMultipleForAllRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScoresResetMultipleForAllRequest();
-      var od = api.ScoresResetMultipleForAllRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScoresResetMultipleForAllRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScoresResetMultipleForAllRequest(
           od as api.ScoresResetMultipleForAllRequest);
     });
diff --git a/generated/googleapis/test/genomics/v1_test.dart b/generated/googleapis/test/genomics/v1_test.dart
index c65b6c8..a9ce246 100644
--- a/generated/googleapis/test/genomics/v1_test.dart
+++ b/generated/googleapis/test/genomics/v1_test.dart
@@ -984,7 +984,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -992,7 +994,9 @@
   unittest.group('obj-schema-ComputeEngine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComputeEngine();
-      var od = api.ComputeEngine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComputeEngine.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComputeEngine(od as api.ComputeEngine);
     });
   });
@@ -1000,7 +1004,9 @@
   unittest.group('obj-schema-ContainerKilledEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerKilledEvent();
-      var od = api.ContainerKilledEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerKilledEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerKilledEvent(od as api.ContainerKilledEvent);
     });
   });
@@ -1008,7 +1014,9 @@
   unittest.group('obj-schema-ContainerStartedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerStartedEvent();
-      var od = api.ContainerStartedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerStartedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerStartedEvent(od as api.ContainerStartedEvent);
     });
   });
@@ -1016,7 +1024,9 @@
   unittest.group('obj-schema-ContainerStoppedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerStoppedEvent();
-      var od = api.ContainerStoppedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerStoppedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerStoppedEvent(od as api.ContainerStoppedEvent);
     });
   });
@@ -1024,7 +1034,9 @@
   unittest.group('obj-schema-DelayedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDelayedEvent();
-      var od = api.DelayedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DelayedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDelayedEvent(od as api.DelayedEvent);
     });
   });
@@ -1032,7 +1044,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1040,7 +1053,8 @@
   unittest.group('obj-schema-Event', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEvent();
-      var od = api.Event.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Event.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEvent(od as api.Event);
     });
   });
@@ -1048,7 +1062,9 @@
   unittest.group('obj-schema-FailedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFailedEvent();
-      var od = api.FailedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FailedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFailedEvent(od as api.FailedEvent);
     });
   });
@@ -1056,7 +1072,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1064,7 +1082,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1072,7 +1092,9 @@
   unittest.group('obj-schema-OperationEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationEvent();
-      var od = api.OperationEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationEvent(od as api.OperationEvent);
     });
   });
@@ -1080,7 +1102,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -1088,7 +1112,9 @@
   unittest.group('obj-schema-PullStartedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPullStartedEvent();
-      var od = api.PullStartedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PullStartedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPullStartedEvent(od as api.PullStartedEvent);
     });
   });
@@ -1096,7 +1122,9 @@
   unittest.group('obj-schema-PullStoppedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPullStoppedEvent();
-      var od = api.PullStoppedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PullStoppedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPullStoppedEvent(od as api.PullStoppedEvent);
     });
   });
@@ -1104,7 +1132,9 @@
   unittest.group('obj-schema-RunPipelineResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunPipelineResponse();
-      var od = api.RunPipelineResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunPipelineResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunPipelineResponse(od as api.RunPipelineResponse);
     });
   });
@@ -1112,7 +1142,9 @@
   unittest.group('obj-schema-RuntimeMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRuntimeMetadata();
-      var od = api.RuntimeMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RuntimeMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRuntimeMetadata(od as api.RuntimeMetadata);
     });
   });
@@ -1120,7 +1152,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1128,7 +1162,9 @@
   unittest.group('obj-schema-UnexpectedExitStatusEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnexpectedExitStatusEvent();
-      var od = api.UnexpectedExitStatusEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnexpectedExitStatusEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnexpectedExitStatusEvent(od as api.UnexpectedExitStatusEvent);
     });
   });
@@ -1136,7 +1172,9 @@
   unittest.group('obj-schema-WorkerAssignedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerAssignedEvent();
-      var od = api.WorkerAssignedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerAssignedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerAssignedEvent(od as api.WorkerAssignedEvent);
     });
   });
@@ -1144,7 +1182,9 @@
   unittest.group('obj-schema-WorkerReleasedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerReleasedEvent();
-      var od = api.WorkerReleasedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerReleasedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerReleasedEvent(od as api.WorkerReleasedEvent);
     });
   });
diff --git a/generated/googleapis/test/gmail/v1_test.dart b/generated/googleapis/test/gmail/v1_test.dart
index f24f5bc..28e6ec3 100644
--- a/generated/googleapis/test/gmail/v1_test.dart
+++ b/generated/googleapis/test/gmail/v1_test.dart
@@ -1908,7 +1908,9 @@
   unittest.group('obj-schema-AutoForwarding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoForwarding();
-      var od = api.AutoForwarding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoForwarding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoForwarding(od as api.AutoForwarding);
     });
   });
@@ -1916,7 +1918,9 @@
   unittest.group('obj-schema-BatchDeleteMessagesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchDeleteMessagesRequest();
-      var od = api.BatchDeleteMessagesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchDeleteMessagesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchDeleteMessagesRequest(od as api.BatchDeleteMessagesRequest);
     });
   });
@@ -1924,7 +1928,9 @@
   unittest.group('obj-schema-BatchModifyMessagesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchModifyMessagesRequest();
-      var od = api.BatchModifyMessagesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchModifyMessagesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchModifyMessagesRequest(od as api.BatchModifyMessagesRequest);
     });
   });
@@ -1932,7 +1938,9 @@
   unittest.group('obj-schema-Delegate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDelegate();
-      var od = api.Delegate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Delegate.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDelegate(od as api.Delegate);
     });
   });
@@ -1940,7 +1948,8 @@
   unittest.group('obj-schema-Draft', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDraft();
-      var od = api.Draft.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Draft.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDraft(od as api.Draft);
     });
   });
@@ -1948,7 +1957,9 @@
   unittest.group('obj-schema-Filter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilter();
-      var od = api.Filter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Filter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilter(od as api.Filter);
     });
   });
@@ -1956,7 +1967,9 @@
   unittest.group('obj-schema-FilterAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterAction();
-      var od = api.FilterAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterAction(od as api.FilterAction);
     });
   });
@@ -1964,7 +1977,9 @@
   unittest.group('obj-schema-FilterCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterCriteria();
-      var od = api.FilterCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterCriteria(od as api.FilterCriteria);
     });
   });
@@ -1972,7 +1987,9 @@
   unittest.group('obj-schema-ForwardingAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingAddress();
-      var od = api.ForwardingAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingAddress(od as api.ForwardingAddress);
     });
   });
@@ -1980,7 +1997,9 @@
   unittest.group('obj-schema-History', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistory();
-      var od = api.History.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.History.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHistory(od as api.History);
     });
   });
@@ -1988,7 +2007,9 @@
   unittest.group('obj-schema-HistoryLabelAdded', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistoryLabelAdded();
-      var od = api.HistoryLabelAdded.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistoryLabelAdded.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistoryLabelAdded(od as api.HistoryLabelAdded);
     });
   });
@@ -1996,7 +2017,9 @@
   unittest.group('obj-schema-HistoryLabelRemoved', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistoryLabelRemoved();
-      var od = api.HistoryLabelRemoved.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistoryLabelRemoved.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistoryLabelRemoved(od as api.HistoryLabelRemoved);
     });
   });
@@ -2004,7 +2027,9 @@
   unittest.group('obj-schema-HistoryMessageAdded', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistoryMessageAdded();
-      var od = api.HistoryMessageAdded.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistoryMessageAdded.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistoryMessageAdded(od as api.HistoryMessageAdded);
     });
   });
@@ -2012,7 +2037,9 @@
   unittest.group('obj-schema-HistoryMessageDeleted', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistoryMessageDeleted();
-      var od = api.HistoryMessageDeleted.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistoryMessageDeleted.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistoryMessageDeleted(od as api.HistoryMessageDeleted);
     });
   });
@@ -2020,7 +2047,9 @@
   unittest.group('obj-schema-ImapSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImapSettings();
-      var od = api.ImapSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImapSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImapSettings(od as api.ImapSettings);
     });
   });
@@ -2028,7 +2057,8 @@
   unittest.group('obj-schema-Label', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabel();
-      var od = api.Label.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Label.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLabel(od as api.Label);
     });
   });
@@ -2036,7 +2066,9 @@
   unittest.group('obj-schema-LabelColor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabelColor();
-      var od = api.LabelColor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LabelColor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLabelColor(od as api.LabelColor);
     });
   });
@@ -2044,7 +2076,9 @@
   unittest.group('obj-schema-LanguageSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLanguageSettings();
-      var od = api.LanguageSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LanguageSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLanguageSettings(od as api.LanguageSettings);
     });
   });
@@ -2052,7 +2086,9 @@
   unittest.group('obj-schema-ListDelegatesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDelegatesResponse();
-      var od = api.ListDelegatesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDelegatesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDelegatesResponse(od as api.ListDelegatesResponse);
     });
   });
@@ -2060,7 +2096,9 @@
   unittest.group('obj-schema-ListDraftsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDraftsResponse();
-      var od = api.ListDraftsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDraftsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDraftsResponse(od as api.ListDraftsResponse);
     });
   });
@@ -2068,7 +2106,9 @@
   unittest.group('obj-schema-ListFiltersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFiltersResponse();
-      var od = api.ListFiltersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFiltersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFiltersResponse(od as api.ListFiltersResponse);
     });
   });
@@ -2076,7 +2116,9 @@
   unittest.group('obj-schema-ListForwardingAddressesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListForwardingAddressesResponse();
-      var od = api.ListForwardingAddressesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListForwardingAddressesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListForwardingAddressesResponse(
           od as api.ListForwardingAddressesResponse);
     });
@@ -2085,7 +2127,9 @@
   unittest.group('obj-schema-ListHistoryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListHistoryResponse();
-      var od = api.ListHistoryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListHistoryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListHistoryResponse(od as api.ListHistoryResponse);
     });
   });
@@ -2093,7 +2137,9 @@
   unittest.group('obj-schema-ListLabelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLabelsResponse();
-      var od = api.ListLabelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLabelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLabelsResponse(od as api.ListLabelsResponse);
     });
   });
@@ -2101,7 +2147,9 @@
   unittest.group('obj-schema-ListMessagesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMessagesResponse();
-      var od = api.ListMessagesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMessagesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMessagesResponse(od as api.ListMessagesResponse);
     });
   });
@@ -2109,7 +2157,9 @@
   unittest.group('obj-schema-ListSendAsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSendAsResponse();
-      var od = api.ListSendAsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSendAsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSendAsResponse(od as api.ListSendAsResponse);
     });
   });
@@ -2117,7 +2167,9 @@
   unittest.group('obj-schema-ListSmimeInfoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSmimeInfoResponse();
-      var od = api.ListSmimeInfoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSmimeInfoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSmimeInfoResponse(od as api.ListSmimeInfoResponse);
     });
   });
@@ -2125,7 +2177,9 @@
   unittest.group('obj-schema-ListThreadsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListThreadsResponse();
-      var od = api.ListThreadsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListThreadsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListThreadsResponse(od as api.ListThreadsResponse);
     });
   });
@@ -2133,7 +2187,9 @@
   unittest.group('obj-schema-Message', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMessage();
-      var od = api.Message.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Message.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMessage(od as api.Message);
     });
   });
@@ -2141,7 +2197,9 @@
   unittest.group('obj-schema-MessagePart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMessagePart();
-      var od = api.MessagePart.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MessagePart.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMessagePart(od as api.MessagePart);
     });
   });
@@ -2149,7 +2207,9 @@
   unittest.group('obj-schema-MessagePartBody', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMessagePartBody();
-      var od = api.MessagePartBody.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MessagePartBody.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMessagePartBody(od as api.MessagePartBody);
     });
   });
@@ -2157,7 +2217,9 @@
   unittest.group('obj-schema-MessagePartHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMessagePartHeader();
-      var od = api.MessagePartHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MessagePartHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMessagePartHeader(od as api.MessagePartHeader);
     });
   });
@@ -2165,7 +2227,9 @@
   unittest.group('obj-schema-ModifyMessageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyMessageRequest();
-      var od = api.ModifyMessageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyMessageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyMessageRequest(od as api.ModifyMessageRequest);
     });
   });
@@ -2173,7 +2237,9 @@
   unittest.group('obj-schema-ModifyThreadRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyThreadRequest();
-      var od = api.ModifyThreadRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyThreadRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyThreadRequest(od as api.ModifyThreadRequest);
     });
   });
@@ -2181,7 +2247,9 @@
   unittest.group('obj-schema-PopSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPopSettings();
-      var od = api.PopSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PopSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPopSettings(od as api.PopSettings);
     });
   });
@@ -2189,7 +2257,9 @@
   unittest.group('obj-schema-Profile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfile();
-      var od = api.Profile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Profile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProfile(od as api.Profile);
     });
   });
@@ -2197,7 +2267,9 @@
   unittest.group('obj-schema-SendAs', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSendAs();
-      var od = api.SendAs.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SendAs.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSendAs(od as api.SendAs);
     });
   });
@@ -2205,7 +2277,9 @@
   unittest.group('obj-schema-SmimeInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSmimeInfo();
-      var od = api.SmimeInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SmimeInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSmimeInfo(od as api.SmimeInfo);
     });
   });
@@ -2213,7 +2287,9 @@
   unittest.group('obj-schema-SmtpMsa', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSmtpMsa();
-      var od = api.SmtpMsa.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SmtpMsa.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSmtpMsa(od as api.SmtpMsa);
     });
   });
@@ -2221,7 +2297,9 @@
   unittest.group('obj-schema-Thread', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThread();
-      var od = api.Thread.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Thread.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkThread(od as api.Thread);
     });
   });
@@ -2229,7 +2307,9 @@
   unittest.group('obj-schema-VacationSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVacationSettings();
-      var od = api.VacationSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VacationSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVacationSettings(od as api.VacationSettings);
     });
   });
@@ -2237,7 +2317,9 @@
   unittest.group('obj-schema-WatchRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWatchRequest();
-      var od = api.WatchRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WatchRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWatchRequest(od as api.WatchRequest);
     });
   });
@@ -2245,7 +2327,9 @@
   unittest.group('obj-schema-WatchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWatchResponse();
-      var od = api.WatchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WatchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWatchResponse(od as api.WatchResponse);
     });
   });
diff --git a/generated/googleapis/test/gmailpostmastertools/v1_test.dart b/generated/googleapis/test/gmailpostmastertools/v1_test.dart
index 2e0564c..69c3a34 100644
--- a/generated/googleapis/test/gmailpostmastertools/v1_test.dart
+++ b/generated/googleapis/test/gmailpostmastertools/v1_test.dart
@@ -346,7 +346,9 @@
   unittest.group('obj-schema-DeliveryError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeliveryError();
-      var od = api.DeliveryError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeliveryError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeliveryError(od as api.DeliveryError);
     });
   });
@@ -354,7 +356,9 @@
   unittest.group('obj-schema-Domain', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomain();
-      var od = api.Domain.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Domain.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDomain(od as api.Domain);
     });
   });
@@ -362,7 +366,9 @@
   unittest.group('obj-schema-FeedbackLoop', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeedbackLoop();
-      var od = api.FeedbackLoop.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FeedbackLoop.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFeedbackLoop(od as api.FeedbackLoop);
     });
   });
@@ -370,7 +376,9 @@
   unittest.group('obj-schema-IpReputation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIpReputation();
-      var od = api.IpReputation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IpReputation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIpReputation(od as api.IpReputation);
     });
   });
@@ -378,7 +386,9 @@
   unittest.group('obj-schema-ListDomainsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDomainsResponse();
-      var od = api.ListDomainsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDomainsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDomainsResponse(od as api.ListDomainsResponse);
     });
   });
@@ -386,7 +396,9 @@
   unittest.group('obj-schema-ListTrafficStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTrafficStatsResponse();
-      var od = api.ListTrafficStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTrafficStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTrafficStatsResponse(od as api.ListTrafficStatsResponse);
     });
   });
@@ -394,7 +406,9 @@
   unittest.group('obj-schema-TrafficStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrafficStats();
-      var od = api.TrafficStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrafficStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrafficStats(od as api.TrafficStats);
     });
   });
diff --git a/generated/googleapis/test/groupsmigration/v1_test.dart b/generated/googleapis/test/groupsmigration/v1_test.dart
index c22682f..ff91f39 100644
--- a/generated/googleapis/test/groupsmigration/v1_test.dart
+++ b/generated/googleapis/test/groupsmigration/v1_test.dart
@@ -58,7 +58,9 @@
   unittest.group('obj-schema-Groups', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroups();
-      var od = api.Groups.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Groups.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGroups(od as api.Groups);
     });
   });
diff --git a/generated/googleapis/test/groupssettings/v1_test.dart b/generated/googleapis/test/groupssettings/v1_test.dart
index ef3ae1f..2d7b357 100644
--- a/generated/googleapis/test/groupssettings/v1_test.dart
+++ b/generated/googleapis/test/groupssettings/v1_test.dart
@@ -353,7 +353,9 @@
   unittest.group('obj-schema-Groups', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroups();
-      var od = api.Groups.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Groups.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGroups(od as api.Groups);
     });
   });
diff --git a/generated/googleapis/test/healthcare/v1_test.dart b/generated/googleapis/test/healthcare/v1_test.dart
index 530f1b1..9d5c06e 100644
--- a/generated/googleapis/test/healthcare/v1_test.dart
+++ b/generated/googleapis/test/healthcare/v1_test.dart
@@ -2628,7 +2628,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -2636,7 +2638,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -2644,7 +2648,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -2652,7 +2658,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -2660,7 +2668,9 @@
   unittest.group('obj-schema-CharacterMaskConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCharacterMaskConfig();
-      var od = api.CharacterMaskConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CharacterMaskConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCharacterMaskConfig(od as api.CharacterMaskConfig);
     });
   });
@@ -2668,7 +2678,9 @@
   unittest.group('obj-schema-CreateMessageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateMessageRequest();
-      var od = api.CreateMessageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateMessageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateMessageRequest(od as api.CreateMessageRequest);
     });
   });
@@ -2676,7 +2688,9 @@
   unittest.group('obj-schema-CryptoHashConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCryptoHashConfig();
-      var od = api.CryptoHashConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CryptoHashConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCryptoHashConfig(od as api.CryptoHashConfig);
     });
   });
@@ -2684,7 +2698,9 @@
   unittest.group('obj-schema-Dataset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataset();
-      var od = api.Dataset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Dataset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataset(od as api.Dataset);
     });
   });
@@ -2692,7 +2708,9 @@
   unittest.group('obj-schema-DateShiftConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateShiftConfig();
-      var od = api.DateShiftConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DateShiftConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDateShiftConfig(od as api.DateShiftConfig);
     });
   });
@@ -2700,7 +2718,9 @@
   unittest.group('obj-schema-DeidentifyConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeidentifyConfig();
-      var od = api.DeidentifyConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeidentifyConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeidentifyConfig(od as api.DeidentifyConfig);
     });
   });
@@ -2708,7 +2728,9 @@
   unittest.group('obj-schema-DeidentifyDatasetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeidentifyDatasetRequest();
-      var od = api.DeidentifyDatasetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeidentifyDatasetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeidentifyDatasetRequest(od as api.DeidentifyDatasetRequest);
     });
   });
@@ -2716,7 +2738,9 @@
   unittest.group('obj-schema-DeidentifyDicomStoreRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeidentifyDicomStoreRequest();
-      var od = api.DeidentifyDicomStoreRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeidentifyDicomStoreRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeidentifyDicomStoreRequest(od as api.DeidentifyDicomStoreRequest);
     });
   });
@@ -2724,7 +2748,9 @@
   unittest.group('obj-schema-DeidentifyFhirStoreRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeidentifyFhirStoreRequest();
-      var od = api.DeidentifyFhirStoreRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeidentifyFhirStoreRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeidentifyFhirStoreRequest(od as api.DeidentifyFhirStoreRequest);
     });
   });
@@ -2732,7 +2758,9 @@
   unittest.group('obj-schema-DeidentifySummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeidentifySummary();
-      var od = api.DeidentifySummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeidentifySummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeidentifySummary(od as api.DeidentifySummary);
     });
   });
@@ -2740,7 +2768,9 @@
   unittest.group('obj-schema-DicomConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDicomConfig();
-      var od = api.DicomConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DicomConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDicomConfig(od as api.DicomConfig);
     });
   });
@@ -2748,7 +2778,9 @@
   unittest.group('obj-schema-DicomFilterConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDicomFilterConfig();
-      var od = api.DicomFilterConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DicomFilterConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDicomFilterConfig(od as api.DicomFilterConfig);
     });
   });
@@ -2756,7 +2788,9 @@
   unittest.group('obj-schema-DicomStore', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDicomStore();
-      var od = api.DicomStore.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DicomStore.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDicomStore(od as api.DicomStore);
     });
   });
@@ -2764,7 +2798,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2772,7 +2807,9 @@
   unittest.group('obj-schema-ExportDicomDataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportDicomDataRequest();
-      var od = api.ExportDicomDataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportDicomDataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportDicomDataRequest(od as api.ExportDicomDataRequest);
     });
   });
@@ -2780,7 +2817,9 @@
   unittest.group('obj-schema-ExportDicomDataResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportDicomDataResponse();
-      var od = api.ExportDicomDataResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportDicomDataResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportDicomDataResponse(od as api.ExportDicomDataResponse);
     });
   });
@@ -2788,7 +2827,9 @@
   unittest.group('obj-schema-ExportResourcesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportResourcesRequest();
-      var od = api.ExportResourcesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportResourcesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportResourcesRequest(od as api.ExportResourcesRequest);
     });
   });
@@ -2796,7 +2837,9 @@
   unittest.group('obj-schema-ExportResourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportResourcesResponse();
-      var od = api.ExportResourcesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportResourcesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportResourcesResponse(od as api.ExportResourcesResponse);
     });
   });
@@ -2804,7 +2847,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -2812,7 +2856,9 @@
   unittest.group('obj-schema-FhirConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFhirConfig();
-      var od = api.FhirConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FhirConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFhirConfig(od as api.FhirConfig);
     });
   });
@@ -2820,7 +2866,9 @@
   unittest.group('obj-schema-FhirFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFhirFilter();
-      var od = api.FhirFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FhirFilter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFhirFilter(od as api.FhirFilter);
     });
   });
@@ -2828,7 +2876,9 @@
   unittest.group('obj-schema-FhirStore', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFhirStore();
-      var od = api.FhirStore.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FhirStore.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFhirStore(od as api.FhirStore);
     });
   });
@@ -2836,7 +2886,9 @@
   unittest.group('obj-schema-FieldMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFieldMetadata();
-      var od = api.FieldMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FieldMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFieldMetadata(od as api.FieldMetadata);
     });
   });
@@ -2847,8 +2899,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudHealthcareV1DeidentifyDeidentifyDicomStoreSummary();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudHealthcareV1DeidentifyDeidentifyDicomStoreSummary
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudHealthcareV1DeidentifyDeidentifyDicomStoreSummary(od
           as api.GoogleCloudHealthcareV1DeidentifyDeidentifyDicomStoreSummary);
     });
@@ -2860,8 +2913,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudHealthcareV1DeidentifyDeidentifyFhirStoreSummary();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudHealthcareV1DeidentifyDeidentifyFhirStoreSummary
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudHealthcareV1DeidentifyDeidentifyFhirStoreSummary(od
           as api.GoogleCloudHealthcareV1DeidentifyDeidentifyFhirStoreSummary);
     });
@@ -2871,8 +2925,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudHealthcareV1DicomBigQueryDestination();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudHealthcareV1DicomBigQueryDestination.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudHealthcareV1DicomBigQueryDestination(
           od as api.GoogleCloudHealthcareV1DicomBigQueryDestination);
     });
@@ -2881,8 +2936,9 @@
   unittest.group('obj-schema-GoogleCloudHealthcareV1DicomGcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudHealthcareV1DicomGcsDestination();
-      var od =
-          api.GoogleCloudHealthcareV1DicomGcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudHealthcareV1DicomGcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudHealthcareV1DicomGcsDestination(
           od as api.GoogleCloudHealthcareV1DicomGcsDestination);
     });
@@ -2891,7 +2947,9 @@
   unittest.group('obj-schema-GoogleCloudHealthcareV1DicomGcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudHealthcareV1DicomGcsSource();
-      var od = api.GoogleCloudHealthcareV1DicomGcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudHealthcareV1DicomGcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudHealthcareV1DicomGcsSource(
           od as api.GoogleCloudHealthcareV1DicomGcsSource);
     });
@@ -2901,8 +2959,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudHealthcareV1FhirBigQueryDestination();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudHealthcareV1FhirBigQueryDestination.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudHealthcareV1FhirBigQueryDestination(
           od as api.GoogleCloudHealthcareV1FhirBigQueryDestination);
     });
@@ -2911,8 +2970,9 @@
   unittest.group('obj-schema-GoogleCloudHealthcareV1FhirGcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudHealthcareV1FhirGcsDestination();
-      var od =
-          api.GoogleCloudHealthcareV1FhirGcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudHealthcareV1FhirGcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudHealthcareV1FhirGcsDestination(
           od as api.GoogleCloudHealthcareV1FhirGcsDestination);
     });
@@ -2921,7 +2981,9 @@
   unittest.group('obj-schema-GoogleCloudHealthcareV1FhirGcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudHealthcareV1FhirGcsSource();
-      var od = api.GoogleCloudHealthcareV1FhirGcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudHealthcareV1FhirGcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudHealthcareV1FhirGcsSource(
           od as api.GoogleCloudHealthcareV1FhirGcsSource);
     });
@@ -2930,7 +2992,9 @@
   unittest.group('obj-schema-Hl7V2NotificationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHl7V2NotificationConfig();
-      var od = api.Hl7V2NotificationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Hl7V2NotificationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHl7V2NotificationConfig(od as api.Hl7V2NotificationConfig);
     });
   });
@@ -2938,7 +3002,9 @@
   unittest.group('obj-schema-Hl7V2Store', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHl7V2Store();
-      var od = api.Hl7V2Store.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Hl7V2Store.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHl7V2Store(od as api.Hl7V2Store);
     });
   });
@@ -2946,7 +3012,9 @@
   unittest.group('obj-schema-HttpBody', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpBody();
-      var od = api.HttpBody.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpBody.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpBody(od as api.HttpBody);
     });
   });
@@ -2954,7 +3022,9 @@
   unittest.group('obj-schema-ImageConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageConfig();
-      var od = api.ImageConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageConfig(od as api.ImageConfig);
     });
   });
@@ -2962,7 +3032,9 @@
   unittest.group('obj-schema-ImportDicomDataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportDicomDataRequest();
-      var od = api.ImportDicomDataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportDicomDataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportDicomDataRequest(od as api.ImportDicomDataRequest);
     });
   });
@@ -2970,7 +3042,9 @@
   unittest.group('obj-schema-ImportDicomDataResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportDicomDataResponse();
-      var od = api.ImportDicomDataResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportDicomDataResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportDicomDataResponse(od as api.ImportDicomDataResponse);
     });
   });
@@ -2978,7 +3052,9 @@
   unittest.group('obj-schema-ImportResourcesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportResourcesRequest();
-      var od = api.ImportResourcesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportResourcesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportResourcesRequest(od as api.ImportResourcesRequest);
     });
   });
@@ -2986,7 +3062,9 @@
   unittest.group('obj-schema-ImportResourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportResourcesResponse();
-      var od = api.ImportResourcesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportResourcesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportResourcesResponse(od as api.ImportResourcesResponse);
     });
   });
@@ -2994,7 +3072,9 @@
   unittest.group('obj-schema-InfoTypeTransformation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInfoTypeTransformation();
-      var od = api.InfoTypeTransformation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InfoTypeTransformation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInfoTypeTransformation(od as api.InfoTypeTransformation);
     });
   });
@@ -3002,7 +3082,9 @@
   unittest.group('obj-schema-IngestMessageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIngestMessageRequest();
-      var od = api.IngestMessageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IngestMessageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIngestMessageRequest(od as api.IngestMessageRequest);
     });
   });
@@ -3010,7 +3092,9 @@
   unittest.group('obj-schema-IngestMessageResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIngestMessageResponse();
-      var od = api.IngestMessageResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IngestMessageResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIngestMessageResponse(od as api.IngestMessageResponse);
     });
   });
@@ -3018,7 +3102,9 @@
   unittest.group('obj-schema-ListDatasetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDatasetsResponse();
-      var od = api.ListDatasetsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDatasetsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDatasetsResponse(od as api.ListDatasetsResponse);
     });
   });
@@ -3026,7 +3112,9 @@
   unittest.group('obj-schema-ListDicomStoresResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDicomStoresResponse();
-      var od = api.ListDicomStoresResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDicomStoresResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDicomStoresResponse(od as api.ListDicomStoresResponse);
     });
   });
@@ -3034,7 +3122,9 @@
   unittest.group('obj-schema-ListFhirStoresResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFhirStoresResponse();
-      var od = api.ListFhirStoresResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFhirStoresResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFhirStoresResponse(od as api.ListFhirStoresResponse);
     });
   });
@@ -3042,7 +3132,9 @@
   unittest.group('obj-schema-ListHl7V2StoresResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListHl7V2StoresResponse();
-      var od = api.ListHl7V2StoresResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListHl7V2StoresResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListHl7V2StoresResponse(od as api.ListHl7V2StoresResponse);
     });
   });
@@ -3050,7 +3142,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -3058,7 +3152,9 @@
   unittest.group('obj-schema-ListMessagesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMessagesResponse();
-      var od = api.ListMessagesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMessagesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMessagesResponse(od as api.ListMessagesResponse);
     });
   });
@@ -3066,7 +3162,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -3074,7 +3172,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -3082,7 +3182,9 @@
   unittest.group('obj-schema-Message', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMessage();
-      var od = api.Message.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Message.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMessage(od as api.Message);
     });
   });
@@ -3090,7 +3192,9 @@
   unittest.group('obj-schema-NotificationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationConfig();
-      var od = api.NotificationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationConfig(od as api.NotificationConfig);
     });
   });
@@ -3098,7 +3202,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -3106,7 +3212,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -3114,7 +3222,9 @@
   unittest.group('obj-schema-ParsedData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParsedData();
-      var od = api.ParsedData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ParsedData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkParsedData(od as api.ParsedData);
     });
   });
@@ -3122,7 +3232,9 @@
   unittest.group('obj-schema-ParserConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParserConfig();
-      var od = api.ParserConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParserConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParserConfig(od as api.ParserConfig);
     });
   });
@@ -3130,7 +3242,9 @@
   unittest.group('obj-schema-PatientId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPatientId();
-      var od = api.PatientId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PatientId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPatientId(od as api.PatientId);
     });
   });
@@ -3138,7 +3252,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -3146,7 +3262,9 @@
   unittest.group('obj-schema-ProgressCounter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProgressCounter();
-      var od = api.ProgressCounter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProgressCounter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProgressCounter(od as api.ProgressCounter);
     });
   });
@@ -3154,7 +3272,9 @@
   unittest.group('obj-schema-RedactConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRedactConfig();
-      var od = api.RedactConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RedactConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRedactConfig(od as api.RedactConfig);
     });
   });
@@ -3162,7 +3282,9 @@
   unittest.group('obj-schema-ReplaceWithInfoTypeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceWithInfoTypeConfig();
-      var od = api.ReplaceWithInfoTypeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceWithInfoTypeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceWithInfoTypeConfig(od as api.ReplaceWithInfoTypeConfig);
     });
   });
@@ -3170,7 +3292,9 @@
   unittest.group('obj-schema-Resources', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResources();
-      var od = api.Resources.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Resources.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResources(od as api.Resources);
     });
   });
@@ -3178,7 +3302,9 @@
   unittest.group('obj-schema-SchemaConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchemaConfig();
-      var od = api.SchemaConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SchemaConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSchemaConfig(od as api.SchemaConfig);
     });
   });
@@ -3186,7 +3312,9 @@
   unittest.group('obj-schema-SearchResourcesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchResourcesRequest();
-      var od = api.SearchResourcesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchResourcesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchResourcesRequest(od as api.SearchResourcesRequest);
     });
   });
@@ -3194,7 +3322,9 @@
   unittest.group('obj-schema-Segment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegment();
-      var od = api.Segment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Segment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSegment(od as api.Segment);
     });
   });
@@ -3202,7 +3332,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -3210,7 +3342,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -3218,7 +3352,9 @@
   unittest.group('obj-schema-StreamConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamConfig();
-      var od = api.StreamConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamConfig(od as api.StreamConfig);
     });
   });
@@ -3226,7 +3362,9 @@
   unittest.group('obj-schema-TagFilterList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTagFilterList();
-      var od = api.TagFilterList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TagFilterList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTagFilterList(od as api.TagFilterList);
     });
   });
@@ -3234,7 +3372,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -3242,7 +3382,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -3250,7 +3392,9 @@
   unittest.group('obj-schema-TextConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextConfig();
-      var od = api.TextConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextConfig(od as api.TextConfig);
     });
   });
diff --git a/generated/googleapis/test/homegraph/v1_test.dart b/generated/googleapis/test/homegraph/v1_test.dart
index b6fdf35..fd25387 100644
--- a/generated/googleapis/test/homegraph/v1_test.dart
+++ b/generated/googleapis/test/homegraph/v1_test.dart
@@ -937,7 +937,9 @@
   unittest.group('obj-schema-AgentDeviceId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAgentDeviceId();
-      var od = api.AgentDeviceId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AgentDeviceId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAgentDeviceId(od as api.AgentDeviceId);
     });
   });
@@ -945,7 +947,9 @@
   unittest.group('obj-schema-AgentOtherDeviceId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAgentOtherDeviceId();
-      var od = api.AgentOtherDeviceId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AgentOtherDeviceId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAgentOtherDeviceId(od as api.AgentOtherDeviceId);
     });
   });
@@ -953,7 +957,9 @@
   unittest.group('obj-schema-Device', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDevice();
-      var od = api.Device.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Device.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDevice(od as api.Device);
     });
   });
@@ -961,7 +967,9 @@
   unittest.group('obj-schema-DeviceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceInfo();
-      var od = api.DeviceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DeviceInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeviceInfo(od as api.DeviceInfo);
     });
   });
@@ -969,7 +977,9 @@
   unittest.group('obj-schema-DeviceNames', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceNames();
-      var od = api.DeviceNames.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceNames.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceNames(od as api.DeviceNames);
     });
   });
@@ -977,7 +987,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -985,7 +996,9 @@
   unittest.group('obj-schema-NonLocalTrait', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNonLocalTrait();
-      var od = api.NonLocalTrait.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NonLocalTrait.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNonLocalTrait(od as api.NonLocalTrait);
     });
   });
@@ -993,7 +1006,9 @@
   unittest.group('obj-schema-QueryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryRequest();
-      var od = api.QueryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryRequest(od as api.QueryRequest);
     });
   });
@@ -1001,7 +1016,9 @@
   unittest.group('obj-schema-QueryRequestInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryRequestInput();
-      var od = api.QueryRequestInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryRequestInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryRequestInput(od as api.QueryRequestInput);
     });
   });
@@ -1009,7 +1026,9 @@
   unittest.group('obj-schema-QueryRequestPayload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryRequestPayload();
-      var od = api.QueryRequestPayload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryRequestPayload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryRequestPayload(od as api.QueryRequestPayload);
     });
   });
@@ -1017,7 +1036,9 @@
   unittest.group('obj-schema-QueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryResponse();
-      var od = api.QueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryResponse(od as api.QueryResponse);
     });
   });
@@ -1025,7 +1046,9 @@
   unittest.group('obj-schema-QueryResponsePayload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryResponsePayload();
-      var od = api.QueryResponsePayload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryResponsePayload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryResponsePayload(od as api.QueryResponsePayload);
     });
   });
@@ -1033,7 +1056,9 @@
   unittest.group('obj-schema-ReportStateAndNotificationDevice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportStateAndNotificationDevice();
-      var od = api.ReportStateAndNotificationDevice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportStateAndNotificationDevice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportStateAndNotificationDevice(
           od as api.ReportStateAndNotificationDevice);
     });
@@ -1042,7 +1067,9 @@
   unittest.group('obj-schema-ReportStateAndNotificationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportStateAndNotificationRequest();
-      var od = api.ReportStateAndNotificationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportStateAndNotificationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportStateAndNotificationRequest(
           od as api.ReportStateAndNotificationRequest);
     });
@@ -1051,7 +1078,9 @@
   unittest.group('obj-schema-ReportStateAndNotificationResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportStateAndNotificationResponse();
-      var od = api.ReportStateAndNotificationResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportStateAndNotificationResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportStateAndNotificationResponse(
           od as api.ReportStateAndNotificationResponse);
     });
@@ -1060,7 +1089,9 @@
   unittest.group('obj-schema-RequestSyncDevicesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestSyncDevicesRequest();
-      var od = api.RequestSyncDevicesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestSyncDevicesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestSyncDevicesRequest(od as api.RequestSyncDevicesRequest);
     });
   });
@@ -1068,7 +1099,9 @@
   unittest.group('obj-schema-RequestSyncDevicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestSyncDevicesResponse();
-      var od = api.RequestSyncDevicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestSyncDevicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestSyncDevicesResponse(od as api.RequestSyncDevicesResponse);
     });
   });
@@ -1076,7 +1109,9 @@
   unittest.group('obj-schema-StateAndNotificationPayload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStateAndNotificationPayload();
-      var od = api.StateAndNotificationPayload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StateAndNotificationPayload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStateAndNotificationPayload(od as api.StateAndNotificationPayload);
     });
   });
@@ -1084,7 +1119,9 @@
   unittest.group('obj-schema-SyncRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSyncRequest();
-      var od = api.SyncRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SyncRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSyncRequest(od as api.SyncRequest);
     });
   });
@@ -1092,7 +1129,9 @@
   unittest.group('obj-schema-SyncResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSyncResponse();
-      var od = api.SyncResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SyncResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSyncResponse(od as api.SyncResponse);
     });
   });
@@ -1100,7 +1139,9 @@
   unittest.group('obj-schema-SyncResponsePayload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSyncResponsePayload();
-      var od = api.SyncResponsePayload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SyncResponsePayload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSyncResponsePayload(od as api.SyncResponsePayload);
     });
   });
diff --git a/generated/googleapis/test/iam/v1_test.dart b/generated/googleapis/test/iam/v1_test.dart
index 9ce1190..3a50886 100644
--- a/generated/googleapis/test/iam/v1_test.dart
+++ b/generated/googleapis/test/iam/v1_test.dart
@@ -2016,7 +2016,9 @@
   unittest.group('obj-schema-AdminAuditData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdminAuditData();
-      var od = api.AdminAuditData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdminAuditData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdminAuditData(od as api.AdminAuditData);
     });
   });
@@ -2024,7 +2026,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -2032,7 +2036,9 @@
   unittest.group('obj-schema-AuditData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditData();
-      var od = api.AuditData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AuditData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAuditData(od as api.AuditData);
     });
   });
@@ -2040,7 +2046,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -2048,7 +2056,9 @@
   unittest.group('obj-schema-AuditableService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditableService();
-      var od = api.AuditableService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditableService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditableService(od as api.AuditableService);
     });
   });
@@ -2056,7 +2066,8 @@
   unittest.group('obj-schema-Aws', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAws();
-      var od = api.Aws.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Aws.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAws(od as api.Aws);
     });
   });
@@ -2064,7 +2075,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -2072,7 +2085,9 @@
   unittest.group('obj-schema-BindingDelta', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBindingDelta();
-      var od = api.BindingDelta.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BindingDelta.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBindingDelta(od as api.BindingDelta);
     });
   });
@@ -2080,7 +2095,9 @@
   unittest.group('obj-schema-CreateRoleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateRoleRequest();
-      var od = api.CreateRoleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateRoleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateRoleRequest(od as api.CreateRoleRequest);
     });
   });
@@ -2088,7 +2105,9 @@
   unittest.group('obj-schema-CreateServiceAccountKeyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateServiceAccountKeyRequest();
-      var od = api.CreateServiceAccountKeyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateServiceAccountKeyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateServiceAccountKeyRequest(
           od as api.CreateServiceAccountKeyRequest);
     });
@@ -2097,7 +2116,9 @@
   unittest.group('obj-schema-CreateServiceAccountRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateServiceAccountRequest();
-      var od = api.CreateServiceAccountRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateServiceAccountRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateServiceAccountRequest(od as api.CreateServiceAccountRequest);
     });
   });
@@ -2105,7 +2126,9 @@
   unittest.group('obj-schema-DisableServiceAccountRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisableServiceAccountRequest();
-      var od = api.DisableServiceAccountRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisableServiceAccountRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisableServiceAccountRequest(od as api.DisableServiceAccountRequest);
     });
   });
@@ -2113,7 +2136,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2121,7 +2145,9 @@
   unittest.group('obj-schema-EnableServiceAccountRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnableServiceAccountRequest();
-      var od = api.EnableServiceAccountRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnableServiceAccountRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnableServiceAccountRequest(od as api.EnableServiceAccountRequest);
     });
   });
@@ -2129,7 +2155,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -2137,7 +2164,9 @@
   unittest.group('obj-schema-LintPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLintPolicyRequest();
-      var od = api.LintPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LintPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLintPolicyRequest(od as api.LintPolicyRequest);
     });
   });
@@ -2145,7 +2174,9 @@
   unittest.group('obj-schema-LintPolicyResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLintPolicyResponse();
-      var od = api.LintPolicyResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LintPolicyResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLintPolicyResponse(od as api.LintPolicyResponse);
     });
   });
@@ -2153,7 +2184,9 @@
   unittest.group('obj-schema-LintResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLintResult();
-      var od = api.LintResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LintResult.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLintResult(od as api.LintResult);
     });
   });
@@ -2161,7 +2194,9 @@
   unittest.group('obj-schema-ListRolesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRolesResponse();
-      var od = api.ListRolesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRolesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRolesResponse(od as api.ListRolesResponse);
     });
   });
@@ -2169,7 +2204,9 @@
   unittest.group('obj-schema-ListServiceAccountKeysResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServiceAccountKeysResponse();
-      var od = api.ListServiceAccountKeysResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServiceAccountKeysResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServiceAccountKeysResponse(
           od as api.ListServiceAccountKeysResponse);
     });
@@ -2178,7 +2215,9 @@
   unittest.group('obj-schema-ListServiceAccountsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServiceAccountsResponse();
-      var od = api.ListServiceAccountsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServiceAccountsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServiceAccountsResponse(od as api.ListServiceAccountsResponse);
     });
   });
@@ -2186,8 +2225,9 @@
   unittest.group('obj-schema-ListWorkloadIdentityPoolProvidersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListWorkloadIdentityPoolProvidersResponse();
-      var od =
-          api.ListWorkloadIdentityPoolProvidersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListWorkloadIdentityPoolProvidersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListWorkloadIdentityPoolProvidersResponse(
           od as api.ListWorkloadIdentityPoolProvidersResponse);
     });
@@ -2196,7 +2236,9 @@
   unittest.group('obj-schema-ListWorkloadIdentityPoolsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListWorkloadIdentityPoolsResponse();
-      var od = api.ListWorkloadIdentityPoolsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListWorkloadIdentityPoolsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListWorkloadIdentityPoolsResponse(
           od as api.ListWorkloadIdentityPoolsResponse);
     });
@@ -2205,7 +2247,8 @@
   unittest.group('obj-schema-Oidc', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOidc();
-      var od = api.Oidc.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Oidc.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOidc(od as api.Oidc);
     });
   });
@@ -2213,7 +2256,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2221,7 +2266,9 @@
   unittest.group('obj-schema-PatchServiceAccountRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPatchServiceAccountRequest();
-      var od = api.PatchServiceAccountRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PatchServiceAccountRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPatchServiceAccountRequest(od as api.PatchServiceAccountRequest);
     });
   });
@@ -2229,7 +2276,9 @@
   unittest.group('obj-schema-Permission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermission();
-      var od = api.Permission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Permission.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPermission(od as api.Permission);
     });
   });
@@ -2237,7 +2286,9 @@
   unittest.group('obj-schema-PermissionDelta', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPermissionDelta();
-      var od = api.PermissionDelta.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PermissionDelta.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPermissionDelta(od as api.PermissionDelta);
     });
   });
@@ -2245,7 +2296,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2253,7 +2306,9 @@
   unittest.group('obj-schema-PolicyDelta', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyDelta();
-      var od = api.PolicyDelta.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyDelta.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyDelta(od as api.PolicyDelta);
     });
   });
@@ -2261,7 +2316,9 @@
   unittest.group('obj-schema-QueryAuditableServicesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryAuditableServicesRequest();
-      var od = api.QueryAuditableServicesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryAuditableServicesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryAuditableServicesRequest(
           od as api.QueryAuditableServicesRequest);
     });
@@ -2270,7 +2327,9 @@
   unittest.group('obj-schema-QueryAuditableServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryAuditableServicesResponse();
-      var od = api.QueryAuditableServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryAuditableServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryAuditableServicesResponse(
           od as api.QueryAuditableServicesResponse);
     });
@@ -2279,7 +2338,9 @@
   unittest.group('obj-schema-QueryGrantableRolesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryGrantableRolesRequest();
-      var od = api.QueryGrantableRolesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryGrantableRolesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryGrantableRolesRequest(od as api.QueryGrantableRolesRequest);
     });
   });
@@ -2287,7 +2348,9 @@
   unittest.group('obj-schema-QueryGrantableRolesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryGrantableRolesResponse();
-      var od = api.QueryGrantableRolesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryGrantableRolesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryGrantableRolesResponse(od as api.QueryGrantableRolesResponse);
     });
   });
@@ -2295,7 +2358,9 @@
   unittest.group('obj-schema-QueryTestablePermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryTestablePermissionsRequest();
-      var od = api.QueryTestablePermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryTestablePermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryTestablePermissionsRequest(
           od as api.QueryTestablePermissionsRequest);
     });
@@ -2304,7 +2369,9 @@
   unittest.group('obj-schema-QueryTestablePermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryTestablePermissionsResponse();
-      var od = api.QueryTestablePermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryTestablePermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryTestablePermissionsResponse(
           od as api.QueryTestablePermissionsResponse);
     });
@@ -2313,7 +2380,8 @@
   unittest.group('obj-schema-Role', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRole();
-      var od = api.Role.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Role.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRole(od as api.Role);
     });
   });
@@ -2321,7 +2389,9 @@
   unittest.group('obj-schema-ServiceAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccount();
-      var od = api.ServiceAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccount(od as api.ServiceAccount);
     });
   });
@@ -2329,7 +2399,9 @@
   unittest.group('obj-schema-ServiceAccountKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccountKey();
-      var od = api.ServiceAccountKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccountKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccountKey(od as api.ServiceAccountKey);
     });
   });
@@ -2337,7 +2409,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -2345,7 +2419,9 @@
   unittest.group('obj-schema-SignBlobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignBlobRequest();
-      var od = api.SignBlobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SignBlobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSignBlobRequest(od as api.SignBlobRequest);
     });
   });
@@ -2353,7 +2429,9 @@
   unittest.group('obj-schema-SignBlobResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignBlobResponse();
-      var od = api.SignBlobResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SignBlobResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSignBlobResponse(od as api.SignBlobResponse);
     });
   });
@@ -2361,7 +2439,9 @@
   unittest.group('obj-schema-SignJwtRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignJwtRequest();
-      var od = api.SignJwtRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SignJwtRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSignJwtRequest(od as api.SignJwtRequest);
     });
   });
@@ -2369,7 +2449,9 @@
   unittest.group('obj-schema-SignJwtResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignJwtResponse();
-      var od = api.SignJwtResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SignJwtResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSignJwtResponse(od as api.SignJwtResponse);
     });
   });
@@ -2377,7 +2459,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2385,7 +2469,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2393,7 +2479,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -2401,7 +2489,9 @@
   unittest.group('obj-schema-UndeleteRoleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteRoleRequest();
-      var od = api.UndeleteRoleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteRoleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteRoleRequest(od as api.UndeleteRoleRequest);
     });
   });
@@ -2409,7 +2499,9 @@
   unittest.group('obj-schema-UndeleteServiceAccountRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteServiceAccountRequest();
-      var od = api.UndeleteServiceAccountRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteServiceAccountRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteServiceAccountRequest(
           od as api.UndeleteServiceAccountRequest);
     });
@@ -2418,7 +2510,9 @@
   unittest.group('obj-schema-UndeleteServiceAccountResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteServiceAccountResponse();
-      var od = api.UndeleteServiceAccountResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteServiceAccountResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteServiceAccountResponse(
           od as api.UndeleteServiceAccountResponse);
     });
@@ -2427,8 +2521,9 @@
   unittest.group('obj-schema-UndeleteWorkloadIdentityPoolProviderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteWorkloadIdentityPoolProviderRequest();
-      var od =
-          api.UndeleteWorkloadIdentityPoolProviderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteWorkloadIdentityPoolProviderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteWorkloadIdentityPoolProviderRequest(
           od as api.UndeleteWorkloadIdentityPoolProviderRequest);
     });
@@ -2437,7 +2532,9 @@
   unittest.group('obj-schema-UndeleteWorkloadIdentityPoolRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteWorkloadIdentityPoolRequest();
-      var od = api.UndeleteWorkloadIdentityPoolRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteWorkloadIdentityPoolRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteWorkloadIdentityPoolRequest(
           od as api.UndeleteWorkloadIdentityPoolRequest);
     });
@@ -2446,7 +2543,9 @@
   unittest.group('obj-schema-UploadServiceAccountKeyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUploadServiceAccountKeyRequest();
-      var od = api.UploadServiceAccountKeyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UploadServiceAccountKeyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUploadServiceAccountKeyRequest(
           od as api.UploadServiceAccountKeyRequest);
     });
@@ -2455,7 +2554,9 @@
   unittest.group('obj-schema-WorkloadIdentityPool', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkloadIdentityPool();
-      var od = api.WorkloadIdentityPool.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkloadIdentityPool.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkloadIdentityPool(od as api.WorkloadIdentityPool);
     });
   });
@@ -2463,7 +2564,9 @@
   unittest.group('obj-schema-WorkloadIdentityPoolProvider', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkloadIdentityPoolProvider();
-      var od = api.WorkloadIdentityPoolProvider.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkloadIdentityPoolProvider.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkloadIdentityPoolProvider(od as api.WorkloadIdentityPoolProvider);
     });
   });
diff --git a/generated/googleapis/test/iamcredentials/v1_test.dart b/generated/googleapis/test/iamcredentials/v1_test.dart
index 1514ec1..83a9f66 100644
--- a/generated/googleapis/test/iamcredentials/v1_test.dart
+++ b/generated/googleapis/test/iamcredentials/v1_test.dart
@@ -329,7 +329,9 @@
   unittest.group('obj-schema-GenerateAccessTokenRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateAccessTokenRequest();
-      var od = api.GenerateAccessTokenRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateAccessTokenRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateAccessTokenRequest(od as api.GenerateAccessTokenRequest);
     });
   });
@@ -337,7 +339,9 @@
   unittest.group('obj-schema-GenerateAccessTokenResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateAccessTokenResponse();
-      var od = api.GenerateAccessTokenResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateAccessTokenResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateAccessTokenResponse(od as api.GenerateAccessTokenResponse);
     });
   });
@@ -345,7 +349,9 @@
   unittest.group('obj-schema-GenerateIdTokenRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateIdTokenRequest();
-      var od = api.GenerateIdTokenRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateIdTokenRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateIdTokenRequest(od as api.GenerateIdTokenRequest);
     });
   });
@@ -353,7 +359,9 @@
   unittest.group('obj-schema-GenerateIdTokenResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateIdTokenResponse();
-      var od = api.GenerateIdTokenResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateIdTokenResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateIdTokenResponse(od as api.GenerateIdTokenResponse);
     });
   });
@@ -361,7 +369,9 @@
   unittest.group('obj-schema-SignBlobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignBlobRequest();
-      var od = api.SignBlobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SignBlobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSignBlobRequest(od as api.SignBlobRequest);
     });
   });
@@ -369,7 +379,9 @@
   unittest.group('obj-schema-SignBlobResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignBlobResponse();
-      var od = api.SignBlobResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SignBlobResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSignBlobResponse(od as api.SignBlobResponse);
     });
   });
@@ -377,7 +389,9 @@
   unittest.group('obj-schema-SignJwtRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignJwtRequest();
-      var od = api.SignJwtRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SignJwtRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSignJwtRequest(od as api.SignJwtRequest);
     });
   });
@@ -385,7 +399,9 @@
   unittest.group('obj-schema-SignJwtResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignJwtResponse();
-      var od = api.SignJwtResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SignJwtResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSignJwtResponse(od as api.SignJwtResponse);
     });
   });
diff --git a/generated/googleapis/test/iap/v1_test.dart b/generated/googleapis/test/iap/v1_test.dart
index 9098d33..80a7dfb 100644
--- a/generated/googleapis/test/iap/v1_test.dart
+++ b/generated/googleapis/test/iap/v1_test.dart
@@ -783,7 +783,9 @@
   unittest.group('obj-schema-AccessDeniedPageSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessDeniedPageSettings();
-      var od = api.AccessDeniedPageSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessDeniedPageSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessDeniedPageSettings(od as api.AccessDeniedPageSettings);
     });
   });
@@ -791,7 +793,9 @@
   unittest.group('obj-schema-AccessSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessSettings();
-      var od = api.AccessSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessSettings(od as api.AccessSettings);
     });
   });
@@ -799,7 +803,9 @@
   unittest.group('obj-schema-ApplicationSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationSettings();
-      var od = api.ApplicationSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationSettings(od as api.ApplicationSettings);
     });
   });
@@ -807,7 +813,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -815,7 +823,8 @@
   unittest.group('obj-schema-Brand', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBrand();
-      var od = api.Brand.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Brand.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBrand(od as api.Brand);
     });
   });
@@ -823,7 +832,9 @@
   unittest.group('obj-schema-CorsSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCorsSettings();
-      var od = api.CorsSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CorsSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCorsSettings(od as api.CorsSettings);
     });
   });
@@ -831,7 +842,9 @@
   unittest.group('obj-schema-CsmSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCsmSettings();
-      var od = api.CsmSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CsmSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCsmSettings(od as api.CsmSettings);
     });
   });
@@ -839,7 +852,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -847,7 +861,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -855,7 +870,9 @@
   unittest.group('obj-schema-GcipSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcipSettings();
-      var od = api.GcipSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GcipSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGcipSettings(od as api.GcipSettings);
     });
   });
@@ -863,7 +880,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -871,7 +890,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -879,7 +900,9 @@
   unittest.group('obj-schema-IapSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIapSettings();
-      var od = api.IapSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IapSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIapSettings(od as api.IapSettings);
     });
   });
@@ -887,7 +910,9 @@
   unittest.group('obj-schema-IdentityAwareProxyClient', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentityAwareProxyClient();
-      var od = api.IdentityAwareProxyClient.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IdentityAwareProxyClient.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentityAwareProxyClient(od as api.IdentityAwareProxyClient);
     });
   });
@@ -895,7 +920,9 @@
   unittest.group('obj-schema-ListBrandsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBrandsResponse();
-      var od = api.ListBrandsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBrandsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBrandsResponse(od as api.ListBrandsResponse);
     });
   });
@@ -903,7 +930,9 @@
   unittest.group('obj-schema-ListIdentityAwareProxyClientsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListIdentityAwareProxyClientsResponse();
-      var od = api.ListIdentityAwareProxyClientsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListIdentityAwareProxyClientsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListIdentityAwareProxyClientsResponse(
           od as api.ListIdentityAwareProxyClientsResponse);
     });
@@ -912,7 +941,9 @@
   unittest.group('obj-schema-OAuthSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOAuthSettings();
-      var od = api.OAuthSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OAuthSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOAuthSettings(od as api.OAuthSettings);
     });
   });
@@ -920,7 +951,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -928,7 +961,9 @@
   unittest.group('obj-schema-PolicyDelegationSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyDelegationSettings();
-      var od = api.PolicyDelegationSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyDelegationSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyDelegationSettings(od as api.PolicyDelegationSettings);
     });
   });
@@ -936,7 +971,9 @@
   unittest.group('obj-schema-PolicyName', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyName();
-      var od = api.PolicyName.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PolicyName.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicyName(od as api.PolicyName);
     });
   });
@@ -944,8 +981,9 @@
   unittest.group('obj-schema-ResetIdentityAwareProxyClientSecretRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResetIdentityAwareProxyClientSecretRequest();
-      var od =
-          api.ResetIdentityAwareProxyClientSecretRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResetIdentityAwareProxyClientSecretRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResetIdentityAwareProxyClientSecretRequest(
           od as api.ResetIdentityAwareProxyClientSecretRequest);
     });
@@ -954,7 +992,9 @@
   unittest.group('obj-schema-Resource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResource();
-      var od = api.Resource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Resource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResource(od as api.Resource);
     });
   });
@@ -962,7 +1002,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -970,7 +1012,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -978,7 +1022,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis/test/identitytoolkit/v3_test.dart b/generated/googleapis/test/identitytoolkit/v3_test.dart
index 4703810..daf24b4 100644
--- a/generated/googleapis/test/identitytoolkit/v3_test.dart
+++ b/generated/googleapis/test/identitytoolkit/v3_test.dart
@@ -2620,7 +2620,9 @@
   unittest.group('obj-schema-CreateAuthUriResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateAuthUriResponse();
-      var od = api.CreateAuthUriResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateAuthUriResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateAuthUriResponse(od as api.CreateAuthUriResponse);
     });
   });
@@ -2628,7 +2630,9 @@
   unittest.group('obj-schema-DeleteAccountResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteAccountResponse();
-      var od = api.DeleteAccountResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteAccountResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteAccountResponse(od as api.DeleteAccountResponse);
     });
   });
@@ -2636,7 +2640,9 @@
   unittest.group('obj-schema-DownloadAccountResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDownloadAccountResponse();
-      var od = api.DownloadAccountResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DownloadAccountResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDownloadAccountResponse(od as api.DownloadAccountResponse);
     });
   });
@@ -2644,7 +2650,9 @@
   unittest.group('obj-schema-EmailLinkSigninResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmailLinkSigninResponse();
-      var od = api.EmailLinkSigninResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmailLinkSigninResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmailLinkSigninResponse(od as api.EmailLinkSigninResponse);
     });
   });
@@ -2652,7 +2660,9 @@
   unittest.group('obj-schema-EmailTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmailTemplate();
-      var od = api.EmailTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmailTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmailTemplate(od as api.EmailTemplate);
     });
   });
@@ -2660,7 +2670,9 @@
   unittest.group('obj-schema-GetAccountInfoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetAccountInfoResponse();
-      var od = api.GetAccountInfoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetAccountInfoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetAccountInfoResponse(od as api.GetAccountInfoResponse);
     });
   });
@@ -2668,7 +2680,9 @@
   unittest.group('obj-schema-GetOobConfirmationCodeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetOobConfirmationCodeResponse();
-      var od = api.GetOobConfirmationCodeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetOobConfirmationCodeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetOobConfirmationCodeResponse(
           od as api.GetOobConfirmationCodeResponse);
     });
@@ -2677,7 +2691,9 @@
   unittest.group('obj-schema-GetRecaptchaParamResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetRecaptchaParamResponse();
-      var od = api.GetRecaptchaParamResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetRecaptchaParamResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetRecaptchaParamResponse(od as api.GetRecaptchaParamResponse);
     });
   });
@@ -2686,8 +2702,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyCreateAuthUriRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyCreateAuthUriRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyCreateAuthUriRequest(
           od as api.IdentitytoolkitRelyingpartyCreateAuthUriRequest);
     });
@@ -2697,8 +2714,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyDeleteAccountRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyDeleteAccountRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyDeleteAccountRequest(
           od as api.IdentitytoolkitRelyingpartyDeleteAccountRequest);
     });
@@ -2708,8 +2726,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyDownloadAccountRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyDownloadAccountRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyDownloadAccountRequest(
           od as api.IdentitytoolkitRelyingpartyDownloadAccountRequest);
     });
@@ -2719,8 +2738,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyEmailLinkSigninRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyEmailLinkSigninRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyEmailLinkSigninRequest(
           od as api.IdentitytoolkitRelyingpartyEmailLinkSigninRequest);
     });
@@ -2730,8 +2750,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyGetAccountInfoRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyGetAccountInfoRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(
           od as api.IdentitytoolkitRelyingpartyGetAccountInfoRequest);
     });
@@ -2741,8 +2762,9 @@
       'obj-schema-IdentitytoolkitRelyingpartyGetProjectConfigResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyGetProjectConfigResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyGetProjectConfigResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyGetProjectConfigResponse(
           od as api.IdentitytoolkitRelyingpartyGetProjectConfigResponse);
     });
@@ -2752,8 +2774,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyGetPublicKeysResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyGetPublicKeysResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyGetPublicKeysResponse(
           od as api.IdentitytoolkitRelyingpartyGetPublicKeysResponse);
     });
@@ -2763,8 +2786,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyResetPasswordRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyResetPasswordRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyResetPasswordRequest(
           od as api.IdentitytoolkitRelyingpartyResetPasswordRequest);
     });
@@ -2774,9 +2798,10 @@
       'obj-schema-IdentitytoolkitRelyingpartySendVerificationCodeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartySendVerificationCodeRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.IdentitytoolkitRelyingpartySendVerificationCodeRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartySendVerificationCodeRequest(
           od as api.IdentitytoolkitRelyingpartySendVerificationCodeRequest);
     });
@@ -2786,9 +2811,10 @@
       'obj-schema-IdentitytoolkitRelyingpartySendVerificationCodeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartySendVerificationCodeResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.IdentitytoolkitRelyingpartySendVerificationCodeResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartySendVerificationCodeResponse(
           od as api.IdentitytoolkitRelyingpartySendVerificationCodeResponse);
     });
@@ -2798,8 +2824,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartySetAccountInfoRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartySetAccountInfoRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartySetAccountInfoRequest(
           od as api.IdentitytoolkitRelyingpartySetAccountInfoRequest);
     });
@@ -2809,8 +2836,9 @@
       'obj-schema-IdentitytoolkitRelyingpartySetProjectConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartySetProjectConfigRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartySetProjectConfigRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartySetProjectConfigRequest(
           od as api.IdentitytoolkitRelyingpartySetProjectConfigRequest);
     });
@@ -2820,8 +2848,9 @@
       'obj-schema-IdentitytoolkitRelyingpartySetProjectConfigResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartySetProjectConfigResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartySetProjectConfigResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartySetProjectConfigResponse(
           od as api.IdentitytoolkitRelyingpartySetProjectConfigResponse);
     });
@@ -2831,8 +2860,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartySignOutUserRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartySignOutUserRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartySignOutUserRequest(
           od as api.IdentitytoolkitRelyingpartySignOutUserRequest);
     });
@@ -2842,8 +2872,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartySignOutUserResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartySignOutUserResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartySignOutUserResponse(
           od as api.IdentitytoolkitRelyingpartySignOutUserResponse);
     });
@@ -2853,8 +2884,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartySignupNewUserRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartySignupNewUserRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartySignupNewUserRequest(
           od as api.IdentitytoolkitRelyingpartySignupNewUserRequest);
     });
@@ -2864,8 +2896,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyUploadAccountRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyUploadAccountRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyUploadAccountRequest(
           od as api.IdentitytoolkitRelyingpartyUploadAccountRequest);
     });
@@ -2875,8 +2908,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyVerifyAssertionRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyVerifyAssertionRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyVerifyAssertionRequest(
           od as api.IdentitytoolkitRelyingpartyVerifyAssertionRequest);
     });
@@ -2886,8 +2920,9 @@
       'obj-schema-IdentitytoolkitRelyingpartyVerifyCustomTokenRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyVerifyCustomTokenRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyVerifyCustomTokenRequest(
           od as api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest);
     });
@@ -2897,8 +2932,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyVerifyPasswordRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyVerifyPasswordRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyVerifyPasswordRequest(
           od as api.IdentitytoolkitRelyingpartyVerifyPasswordRequest);
     });
@@ -2908,8 +2944,9 @@
       'obj-schema-IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest(
           od as api.IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest);
     });
@@ -2919,9 +2956,10 @@
       'obj-schema-IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse(
           od as api.IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse);
     });
@@ -2930,7 +2968,9 @@
   unittest.group('obj-schema-IdpConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdpConfig();
-      var od = api.IdpConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IdpConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIdpConfig(od as api.IdpConfig);
     });
   });
@@ -2938,7 +2978,9 @@
   unittest.group('obj-schema-Relyingparty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelyingparty();
-      var od = api.Relyingparty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Relyingparty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRelyingparty(od as api.Relyingparty);
     });
   });
@@ -2946,7 +2988,9 @@
   unittest.group('obj-schema-ResetPasswordResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResetPasswordResponse();
-      var od = api.ResetPasswordResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResetPasswordResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResetPasswordResponse(od as api.ResetPasswordResponse);
     });
   });
@@ -2954,7 +2998,9 @@
   unittest.group('obj-schema-SetAccountInfoResponseProviderUserInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetAccountInfoResponseProviderUserInfo();
-      var od = api.SetAccountInfoResponseProviderUserInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetAccountInfoResponseProviderUserInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetAccountInfoResponseProviderUserInfo(
           od as api.SetAccountInfoResponseProviderUserInfo);
     });
@@ -2963,7 +3009,9 @@
   unittest.group('obj-schema-SetAccountInfoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetAccountInfoResponse();
-      var od = api.SetAccountInfoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetAccountInfoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetAccountInfoResponse(od as api.SetAccountInfoResponse);
     });
   });
@@ -2971,7 +3019,9 @@
   unittest.group('obj-schema-SignupNewUserResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignupNewUserResponse();
-      var od = api.SignupNewUserResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SignupNewUserResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSignupNewUserResponse(od as api.SignupNewUserResponse);
     });
   });
@@ -2979,7 +3029,9 @@
   unittest.group('obj-schema-UploadAccountResponseError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUploadAccountResponseError();
-      var od = api.UploadAccountResponseError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UploadAccountResponseError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUploadAccountResponseError(od as api.UploadAccountResponseError);
     });
   });
@@ -2987,7 +3039,9 @@
   unittest.group('obj-schema-UploadAccountResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUploadAccountResponse();
-      var od = api.UploadAccountResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UploadAccountResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUploadAccountResponse(od as api.UploadAccountResponse);
     });
   });
@@ -2995,7 +3049,9 @@
   unittest.group('obj-schema-UserInfoProviderUserInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserInfoProviderUserInfo();
-      var od = api.UserInfoProviderUserInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserInfoProviderUserInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserInfoProviderUserInfo(od as api.UserInfoProviderUserInfo);
     });
   });
@@ -3003,7 +3059,9 @@
   unittest.group('obj-schema-UserInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserInfo();
-      var od = api.UserInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserInfo(od as api.UserInfo);
     });
   });
@@ -3011,7 +3069,9 @@
   unittest.group('obj-schema-VerifyAssertionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVerifyAssertionResponse();
-      var od = api.VerifyAssertionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VerifyAssertionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVerifyAssertionResponse(od as api.VerifyAssertionResponse);
     });
   });
@@ -3019,7 +3079,9 @@
   unittest.group('obj-schema-VerifyCustomTokenResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVerifyCustomTokenResponse();
-      var od = api.VerifyCustomTokenResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VerifyCustomTokenResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVerifyCustomTokenResponse(od as api.VerifyCustomTokenResponse);
     });
   });
@@ -3027,7 +3089,9 @@
   unittest.group('obj-schema-VerifyPasswordResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVerifyPasswordResponse();
-      var od = api.VerifyPasswordResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VerifyPasswordResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVerifyPasswordResponse(od as api.VerifyPasswordResponse);
     });
   });
diff --git a/generated/googleapis/test/indexing/v3_test.dart b/generated/googleapis/test/indexing/v3_test.dart
index 0158cab..e98c5bb 100644
--- a/generated/googleapis/test/indexing/v3_test.dart
+++ b/generated/googleapis/test/indexing/v3_test.dart
@@ -109,7 +109,9 @@
   unittest.group('obj-schema-PublishUrlNotificationResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublishUrlNotificationResponse();
-      var od = api.PublishUrlNotificationResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublishUrlNotificationResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublishUrlNotificationResponse(
           od as api.PublishUrlNotificationResponse);
     });
@@ -118,7 +120,9 @@
   unittest.group('obj-schema-UrlNotification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlNotification();
-      var od = api.UrlNotification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlNotification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlNotification(od as api.UrlNotification);
     });
   });
@@ -126,7 +130,9 @@
   unittest.group('obj-schema-UrlNotificationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlNotificationMetadata();
-      var od = api.UrlNotificationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlNotificationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlNotificationMetadata(od as api.UrlNotificationMetadata);
     });
   });
diff --git a/generated/googleapis/test/jobs/v3_test.dart b/generated/googleapis/test/jobs/v3_test.dart
index 8aa0f6f..28e7180 100644
--- a/generated/googleapis/test/jobs/v3_test.dart
+++ b/generated/googleapis/test/jobs/v3_test.dart
@@ -2638,7 +2638,9 @@
   unittest.group('obj-schema-ApplicationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationInfo();
-      var od = api.ApplicationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationInfo(od as api.ApplicationInfo);
     });
   });
@@ -2646,7 +2648,9 @@
   unittest.group('obj-schema-BatchDeleteJobsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchDeleteJobsRequest();
-      var od = api.BatchDeleteJobsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchDeleteJobsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchDeleteJobsRequest(od as api.BatchDeleteJobsRequest);
     });
   });
@@ -2654,7 +2658,9 @@
   unittest.group('obj-schema-BucketRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketRange();
-      var od = api.BucketRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketRange(od as api.BucketRange);
     });
   });
@@ -2662,7 +2668,9 @@
   unittest.group('obj-schema-BucketizedCount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketizedCount();
-      var od = api.BucketizedCount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketizedCount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketizedCount(od as api.BucketizedCount);
     });
   });
@@ -2670,7 +2678,9 @@
   unittest.group('obj-schema-ClientEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientEvent();
-      var od = api.ClientEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClientEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClientEvent(od as api.ClientEvent);
     });
   });
@@ -2678,7 +2688,9 @@
   unittest.group('obj-schema-CommuteFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommuteFilter();
-      var od = api.CommuteFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommuteFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommuteFilter(od as api.CommuteFilter);
     });
   });
@@ -2686,7 +2698,9 @@
   unittest.group('obj-schema-CommuteInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommuteInfo();
-      var od = api.CommuteInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommuteInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommuteInfo(od as api.CommuteInfo);
     });
   });
@@ -2694,7 +2708,9 @@
   unittest.group('obj-schema-Company', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompany();
-      var od = api.Company.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Company.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCompany(od as api.Company);
     });
   });
@@ -2702,7 +2718,9 @@
   unittest.group('obj-schema-CompanyDerivedInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompanyDerivedInfo();
-      var od = api.CompanyDerivedInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompanyDerivedInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompanyDerivedInfo(od as api.CompanyDerivedInfo);
     });
   });
@@ -2710,7 +2728,9 @@
   unittest.group('obj-schema-CompensationEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompensationEntry();
-      var od = api.CompensationEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompensationEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompensationEntry(od as api.CompensationEntry);
     });
   });
@@ -2718,7 +2738,9 @@
   unittest.group('obj-schema-CompensationFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompensationFilter();
-      var od = api.CompensationFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompensationFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompensationFilter(od as api.CompensationFilter);
     });
   });
@@ -2726,7 +2748,9 @@
   unittest.group('obj-schema-CompensationHistogramRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompensationHistogramRequest();
-      var od = api.CompensationHistogramRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompensationHistogramRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompensationHistogramRequest(od as api.CompensationHistogramRequest);
     });
   });
@@ -2734,7 +2758,9 @@
   unittest.group('obj-schema-CompensationHistogramResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompensationHistogramResult();
-      var od = api.CompensationHistogramResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompensationHistogramResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompensationHistogramResult(od as api.CompensationHistogramResult);
     });
   });
@@ -2742,7 +2768,9 @@
   unittest.group('obj-schema-CompensationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompensationInfo();
-      var od = api.CompensationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompensationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompensationInfo(od as api.CompensationInfo);
     });
   });
@@ -2750,7 +2778,9 @@
   unittest.group('obj-schema-CompensationRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompensationRange();
-      var od = api.CompensationRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompensationRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompensationRange(od as api.CompensationRange);
     });
   });
@@ -2758,7 +2788,9 @@
   unittest.group('obj-schema-CompleteQueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompleteQueryResponse();
-      var od = api.CompleteQueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompleteQueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompleteQueryResponse(od as api.CompleteQueryResponse);
     });
   });
@@ -2766,7 +2798,9 @@
   unittest.group('obj-schema-CompletionResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompletionResult();
-      var od = api.CompletionResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompletionResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompletionResult(od as api.CompletionResult);
     });
   });
@@ -2774,7 +2808,9 @@
   unittest.group('obj-schema-CreateClientEventRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateClientEventRequest();
-      var od = api.CreateClientEventRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateClientEventRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateClientEventRequest(od as api.CreateClientEventRequest);
     });
   });
@@ -2782,7 +2818,9 @@
   unittest.group('obj-schema-CreateCompanyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateCompanyRequest();
-      var od = api.CreateCompanyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateCompanyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateCompanyRequest(od as api.CreateCompanyRequest);
     });
   });
@@ -2790,7 +2828,9 @@
   unittest.group('obj-schema-CreateJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateJobRequest();
-      var od = api.CreateJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateJobRequest(od as api.CreateJobRequest);
     });
   });
@@ -2798,7 +2838,9 @@
   unittest.group('obj-schema-CustomAttribute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomAttribute();
-      var od = api.CustomAttribute.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomAttribute.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomAttribute(od as api.CustomAttribute);
     });
   });
@@ -2806,7 +2848,9 @@
   unittest.group('obj-schema-CustomAttributeHistogramRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomAttributeHistogramRequest();
-      var od = api.CustomAttributeHistogramRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomAttributeHistogramRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomAttributeHistogramRequest(
           od as api.CustomAttributeHistogramRequest);
     });
@@ -2815,7 +2859,9 @@
   unittest.group('obj-schema-CustomAttributeHistogramResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomAttributeHistogramResult();
-      var od = api.CustomAttributeHistogramResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomAttributeHistogramResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomAttributeHistogramResult(
           od as api.CustomAttributeHistogramResult);
     });
@@ -2824,7 +2870,9 @@
   unittest.group('obj-schema-DeviceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceInfo();
-      var od = api.DeviceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DeviceInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeviceInfo(od as api.DeviceInfo);
     });
   });
@@ -2832,7 +2880,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2840,7 +2889,9 @@
   unittest.group('obj-schema-HistogramFacets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistogramFacets();
-      var od = api.HistogramFacets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistogramFacets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistogramFacets(od as api.HistogramFacets);
     });
   });
@@ -2848,7 +2899,9 @@
   unittest.group('obj-schema-HistogramResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistogramResult();
-      var od = api.HistogramResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistogramResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistogramResult(od as api.HistogramResult);
     });
   });
@@ -2856,7 +2909,9 @@
   unittest.group('obj-schema-HistogramResults', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistogramResults();
-      var od = api.HistogramResults.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistogramResults.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistogramResults(od as api.HistogramResults);
     });
   });
@@ -2864,7 +2919,8 @@
   unittest.group('obj-schema-Job', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJob();
-      var od = api.Job.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Job.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJob(od as api.Job);
     });
   });
@@ -2872,7 +2928,9 @@
   unittest.group('obj-schema-JobDerivedInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobDerivedInfo();
-      var od = api.JobDerivedInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobDerivedInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobDerivedInfo(od as api.JobDerivedInfo);
     });
   });
@@ -2880,7 +2938,9 @@
   unittest.group('obj-schema-JobEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobEvent();
-      var od = api.JobEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobEvent.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobEvent(od as api.JobEvent);
     });
   });
@@ -2888,7 +2948,9 @@
   unittest.group('obj-schema-JobQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobQuery();
-      var od = api.JobQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobQuery.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobQuery(od as api.JobQuery);
     });
   });
@@ -2896,7 +2958,9 @@
   unittest.group('obj-schema-LatLng', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLatLng();
-      var od = api.LatLng.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LatLng.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLatLng(od as api.LatLng);
     });
   });
@@ -2904,7 +2968,9 @@
   unittest.group('obj-schema-ListCompaniesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCompaniesResponse();
-      var od = api.ListCompaniesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCompaniesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCompaniesResponse(od as api.ListCompaniesResponse);
     });
   });
@@ -2912,7 +2978,9 @@
   unittest.group('obj-schema-ListJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListJobsResponse();
-      var od = api.ListJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
@@ -2920,7 +2988,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2928,7 +2998,9 @@
   unittest.group('obj-schema-LocationFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationFilter();
-      var od = api.LocationFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationFilter(od as api.LocationFilter);
     });
   });
@@ -2936,7 +3008,9 @@
   unittest.group('obj-schema-MatchingJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMatchingJob();
-      var od = api.MatchingJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MatchingJob.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMatchingJob(od as api.MatchingJob);
     });
   });
@@ -2944,7 +3018,9 @@
   unittest.group('obj-schema-MendelDebugInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMendelDebugInput();
-      var od = api.MendelDebugInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MendelDebugInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMendelDebugInput(od as api.MendelDebugInput);
     });
   });
@@ -2952,7 +3028,8 @@
   unittest.group('obj-schema-Money', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoney();
-      var od = api.Money.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Money.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMoney(od as api.Money);
     });
   });
@@ -2960,7 +3037,9 @@
   unittest.group('obj-schema-NamespacedDebugInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamespacedDebugInput();
-      var od = api.NamespacedDebugInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NamespacedDebugInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNamespacedDebugInput(od as api.NamespacedDebugInput);
     });
   });
@@ -2968,7 +3047,9 @@
   unittest.group('obj-schema-NumericBucketingOption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNumericBucketingOption();
-      var od = api.NumericBucketingOption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NumericBucketingOption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNumericBucketingOption(od as api.NumericBucketingOption);
     });
   });
@@ -2976,7 +3057,9 @@
   unittest.group('obj-schema-NumericBucketingResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNumericBucketingResult();
-      var od = api.NumericBucketingResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NumericBucketingResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNumericBucketingResult(od as api.NumericBucketingResult);
     });
   });
@@ -2984,7 +3067,9 @@
   unittest.group('obj-schema-PostalAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostalAddress();
-      var od = api.PostalAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostalAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostalAddress(od as api.PostalAddress);
     });
   });
@@ -2992,7 +3077,9 @@
   unittest.group('obj-schema-ProcessingOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProcessingOptions();
-      var od = api.ProcessingOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProcessingOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProcessingOptions(od as api.ProcessingOptions);
     });
   });
@@ -3000,7 +3087,9 @@
   unittest.group('obj-schema-RequestMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestMetadata();
-      var od = api.RequestMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestMetadata(od as api.RequestMetadata);
     });
   });
@@ -3008,7 +3097,9 @@
   unittest.group('obj-schema-ResponseMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResponseMetadata();
-      var od = api.ResponseMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResponseMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResponseMetadata(od as api.ResponseMetadata);
     });
   });
@@ -3016,7 +3107,9 @@
   unittest.group('obj-schema-SearchJobsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchJobsRequest();
-      var od = api.SearchJobsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchJobsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchJobsRequest(od as api.SearchJobsRequest);
     });
   });
@@ -3024,7 +3117,9 @@
   unittest.group('obj-schema-SearchJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchJobsResponse();
-      var od = api.SearchJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchJobsResponse(od as api.SearchJobsResponse);
     });
   });
@@ -3032,7 +3127,9 @@
   unittest.group('obj-schema-SpellingCorrection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpellingCorrection();
-      var od = api.SpellingCorrection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpellingCorrection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpellingCorrection(od as api.SpellingCorrection);
     });
   });
@@ -3040,7 +3137,9 @@
   unittest.group('obj-schema-TimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeOfDay();
-      var od = api.TimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeOfDay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeOfDay(od as api.TimeOfDay);
     });
   });
@@ -3048,7 +3147,9 @@
   unittest.group('obj-schema-TimestampRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimestampRange();
-      var od = api.TimestampRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimestampRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimestampRange(od as api.TimestampRange);
     });
   });
@@ -3056,7 +3157,9 @@
   unittest.group('obj-schema-UpdateCompanyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateCompanyRequest();
-      var od = api.UpdateCompanyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateCompanyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateCompanyRequest(od as api.UpdateCompanyRequest);
     });
   });
@@ -3064,7 +3167,9 @@
   unittest.group('obj-schema-UpdateJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateJobRequest();
-      var od = api.UpdateJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateJobRequest(od as api.UpdateJobRequest);
     });
   });
diff --git a/generated/googleapis/test/jobs/v4_test.dart b/generated/googleapis/test/jobs/v4_test.dart
index f67da04..678b8b8 100644
--- a/generated/googleapis/test/jobs/v4_test.dart
+++ b/generated/googleapis/test/jobs/v4_test.dart
@@ -2760,7 +2760,9 @@
   unittest.group('obj-schema-ApplicationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplicationInfo();
-      var od = api.ApplicationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplicationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplicationInfo(od as api.ApplicationInfo);
     });
   });
@@ -2768,7 +2770,9 @@
   unittest.group('obj-schema-BatchCreateJobsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateJobsRequest();
-      var od = api.BatchCreateJobsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateJobsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateJobsRequest(od as api.BatchCreateJobsRequest);
     });
   });
@@ -2776,7 +2780,9 @@
   unittest.group('obj-schema-BatchCreateJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateJobsResponse();
-      var od = api.BatchCreateJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateJobsResponse(od as api.BatchCreateJobsResponse);
     });
   });
@@ -2784,7 +2790,9 @@
   unittest.group('obj-schema-BatchDeleteJobsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchDeleteJobsRequest();
-      var od = api.BatchDeleteJobsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchDeleteJobsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchDeleteJobsRequest(od as api.BatchDeleteJobsRequest);
     });
   });
@@ -2792,7 +2800,9 @@
   unittest.group('obj-schema-BatchDeleteJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchDeleteJobsResponse();
-      var od = api.BatchDeleteJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchDeleteJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchDeleteJobsResponse(od as api.BatchDeleteJobsResponse);
     });
   });
@@ -2800,7 +2810,9 @@
   unittest.group('obj-schema-BatchOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchOperationMetadata();
-      var od = api.BatchOperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchOperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchOperationMetadata(od as api.BatchOperationMetadata);
     });
   });
@@ -2808,7 +2820,9 @@
   unittest.group('obj-schema-BatchUpdateJobsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateJobsRequest();
-      var od = api.BatchUpdateJobsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateJobsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateJobsRequest(od as api.BatchUpdateJobsRequest);
     });
   });
@@ -2816,7 +2830,9 @@
   unittest.group('obj-schema-BatchUpdateJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateJobsResponse();
-      var od = api.BatchUpdateJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateJobsResponse(od as api.BatchUpdateJobsResponse);
     });
   });
@@ -2824,7 +2840,9 @@
   unittest.group('obj-schema-ClientEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientEvent();
-      var od = api.ClientEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClientEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClientEvent(od as api.ClientEvent);
     });
   });
@@ -2832,7 +2850,9 @@
   unittest.group('obj-schema-CommuteFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommuteFilter();
-      var od = api.CommuteFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommuteFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommuteFilter(od as api.CommuteFilter);
     });
   });
@@ -2840,7 +2860,9 @@
   unittest.group('obj-schema-CommuteInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommuteInfo();
-      var od = api.CommuteInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommuteInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommuteInfo(od as api.CommuteInfo);
     });
   });
@@ -2848,7 +2870,9 @@
   unittest.group('obj-schema-Company', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompany();
-      var od = api.Company.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Company.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCompany(od as api.Company);
     });
   });
@@ -2856,7 +2880,9 @@
   unittest.group('obj-schema-CompanyDerivedInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompanyDerivedInfo();
-      var od = api.CompanyDerivedInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompanyDerivedInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompanyDerivedInfo(od as api.CompanyDerivedInfo);
     });
   });
@@ -2864,7 +2890,9 @@
   unittest.group('obj-schema-CompensationEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompensationEntry();
-      var od = api.CompensationEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompensationEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompensationEntry(od as api.CompensationEntry);
     });
   });
@@ -2872,7 +2900,9 @@
   unittest.group('obj-schema-CompensationFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompensationFilter();
-      var od = api.CompensationFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompensationFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompensationFilter(od as api.CompensationFilter);
     });
   });
@@ -2880,7 +2910,9 @@
   unittest.group('obj-schema-CompensationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompensationInfo();
-      var od = api.CompensationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompensationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompensationInfo(od as api.CompensationInfo);
     });
   });
@@ -2888,7 +2920,9 @@
   unittest.group('obj-schema-CompensationRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompensationRange();
-      var od = api.CompensationRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompensationRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompensationRange(od as api.CompensationRange);
     });
   });
@@ -2896,7 +2930,9 @@
   unittest.group('obj-schema-CompleteQueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompleteQueryResponse();
-      var od = api.CompleteQueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompleteQueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompleteQueryResponse(od as api.CompleteQueryResponse);
     });
   });
@@ -2904,7 +2940,9 @@
   unittest.group('obj-schema-CompletionResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompletionResult();
-      var od = api.CompletionResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompletionResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompletionResult(od as api.CompletionResult);
     });
   });
@@ -2912,7 +2950,9 @@
   unittest.group('obj-schema-CustomAttribute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomAttribute();
-      var od = api.CustomAttribute.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomAttribute.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomAttribute(od as api.CustomAttribute);
     });
   });
@@ -2920,7 +2960,9 @@
   unittest.group('obj-schema-CustomRankingInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomRankingInfo();
-      var od = api.CustomRankingInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomRankingInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomRankingInfo(od as api.CustomRankingInfo);
     });
   });
@@ -2928,7 +2970,9 @@
   unittest.group('obj-schema-DeviceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceInfo();
-      var od = api.DeviceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DeviceInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeviceInfo(od as api.DeviceInfo);
     });
   });
@@ -2936,7 +2980,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2944,7 +2989,9 @@
   unittest.group('obj-schema-HistogramQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistogramQuery();
-      var od = api.HistogramQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistogramQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistogramQuery(od as api.HistogramQuery);
     });
   });
@@ -2952,7 +2999,9 @@
   unittest.group('obj-schema-HistogramQueryResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistogramQueryResult();
-      var od = api.HistogramQueryResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistogramQueryResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistogramQueryResult(od as api.HistogramQueryResult);
     });
   });
@@ -2960,7 +3009,8 @@
   unittest.group('obj-schema-Job', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJob();
-      var od = api.Job.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Job.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJob(od as api.Job);
     });
   });
@@ -2968,7 +3018,9 @@
   unittest.group('obj-schema-JobDerivedInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobDerivedInfo();
-      var od = api.JobDerivedInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobDerivedInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobDerivedInfo(od as api.JobDerivedInfo);
     });
   });
@@ -2976,7 +3028,9 @@
   unittest.group('obj-schema-JobEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobEvent();
-      var od = api.JobEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobEvent.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobEvent(od as api.JobEvent);
     });
   });
@@ -2984,7 +3038,9 @@
   unittest.group('obj-schema-JobQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobQuery();
-      var od = api.JobQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobQuery.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobQuery(od as api.JobQuery);
     });
   });
@@ -2992,7 +3048,9 @@
   unittest.group('obj-schema-JobResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobResult();
-      var od = api.JobResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobResult.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobResult(od as api.JobResult);
     });
   });
@@ -3000,7 +3058,9 @@
   unittest.group('obj-schema-LatLng', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLatLng();
-      var od = api.LatLng.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LatLng.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLatLng(od as api.LatLng);
     });
   });
@@ -3008,7 +3068,9 @@
   unittest.group('obj-schema-ListCompaniesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCompaniesResponse();
-      var od = api.ListCompaniesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCompaniesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCompaniesResponse(od as api.ListCompaniesResponse);
     });
   });
@@ -3016,7 +3078,9 @@
   unittest.group('obj-schema-ListJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListJobsResponse();
-      var od = api.ListJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
@@ -3024,7 +3088,9 @@
   unittest.group('obj-schema-ListTenantsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTenantsResponse();
-      var od = api.ListTenantsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTenantsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTenantsResponse(od as api.ListTenantsResponse);
     });
   });
@@ -3032,7 +3098,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -3040,7 +3108,9 @@
   unittest.group('obj-schema-LocationFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationFilter();
-      var od = api.LocationFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationFilter(od as api.LocationFilter);
     });
   });
@@ -3048,7 +3118,9 @@
   unittest.group('obj-schema-MatchingJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMatchingJob();
-      var od = api.MatchingJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MatchingJob.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMatchingJob(od as api.MatchingJob);
     });
   });
@@ -3056,7 +3128,9 @@
   unittest.group('obj-schema-MendelDebugInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMendelDebugInput();
-      var od = api.MendelDebugInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MendelDebugInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMendelDebugInput(od as api.MendelDebugInput);
     });
   });
@@ -3064,7 +3138,8 @@
   unittest.group('obj-schema-Money', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoney();
-      var od = api.Money.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Money.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMoney(od as api.Money);
     });
   });
@@ -3072,7 +3147,9 @@
   unittest.group('obj-schema-NamespacedDebugInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamespacedDebugInput();
-      var od = api.NamespacedDebugInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NamespacedDebugInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNamespacedDebugInput(od as api.NamespacedDebugInput);
     });
   });
@@ -3080,7 +3157,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -3088,7 +3167,9 @@
   unittest.group('obj-schema-PostalAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostalAddress();
-      var od = api.PostalAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostalAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostalAddress(od as api.PostalAddress);
     });
   });
@@ -3096,7 +3177,9 @@
   unittest.group('obj-schema-ProcessingOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProcessingOptions();
-      var od = api.ProcessingOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProcessingOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProcessingOptions(od as api.ProcessingOptions);
     });
   });
@@ -3104,7 +3187,9 @@
   unittest.group('obj-schema-RequestMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestMetadata();
-      var od = api.RequestMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestMetadata(od as api.RequestMetadata);
     });
   });
@@ -3112,7 +3197,9 @@
   unittest.group('obj-schema-ResponseMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResponseMetadata();
-      var od = api.ResponseMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResponseMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResponseMetadata(od as api.ResponseMetadata);
     });
   });
@@ -3120,7 +3207,9 @@
   unittest.group('obj-schema-SearchJobsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchJobsRequest();
-      var od = api.SearchJobsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchJobsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchJobsRequest(od as api.SearchJobsRequest);
     });
   });
@@ -3128,7 +3217,9 @@
   unittest.group('obj-schema-SearchJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchJobsResponse();
-      var od = api.SearchJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchJobsResponse(od as api.SearchJobsResponse);
     });
   });
@@ -3136,7 +3227,9 @@
   unittest.group('obj-schema-SpellingCorrection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpellingCorrection();
-      var od = api.SpellingCorrection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpellingCorrection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpellingCorrection(od as api.SpellingCorrection);
     });
   });
@@ -3144,7 +3237,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -3152,7 +3247,9 @@
   unittest.group('obj-schema-Tenant', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTenant();
-      var od = api.Tenant.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Tenant.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTenant(od as api.Tenant);
     });
   });
@@ -3160,7 +3257,9 @@
   unittest.group('obj-schema-TimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeOfDay();
-      var od = api.TimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeOfDay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeOfDay(od as api.TimeOfDay);
     });
   });
@@ -3168,7 +3267,9 @@
   unittest.group('obj-schema-TimestampRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimestampRange();
-      var od = api.TimestampRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimestampRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimestampRange(od as api.TimestampRange);
     });
   });
diff --git a/generated/googleapis/test/kgsearch/v1_test.dart b/generated/googleapis/test/kgsearch/v1_test.dart
index eb99a16..2934731 100644
--- a/generated/googleapis/test/kgsearch/v1_test.dart
+++ b/generated/googleapis/test/kgsearch/v1_test.dart
@@ -192,7 +192,9 @@
   unittest.group('obj-schema-SearchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchResponse();
-      var od = api.SearchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchResponse(od as api.SearchResponse);
     });
   });
diff --git a/generated/googleapis/test/language/v1_test.dart b/generated/googleapis/test/language/v1_test.dart
index f465eb9..bc24430 100644
--- a/generated/googleapis/test/language/v1_test.dart
+++ b/generated/googleapis/test/language/v1_test.dart
@@ -936,7 +936,9 @@
   unittest.group('obj-schema-AnalyzeEntitiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzeEntitiesRequest();
-      var od = api.AnalyzeEntitiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzeEntitiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzeEntitiesRequest(od as api.AnalyzeEntitiesRequest);
     });
   });
@@ -944,7 +946,9 @@
   unittest.group('obj-schema-AnalyzeEntitiesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzeEntitiesResponse();
-      var od = api.AnalyzeEntitiesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzeEntitiesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzeEntitiesResponse(od as api.AnalyzeEntitiesResponse);
     });
   });
@@ -952,7 +956,9 @@
   unittest.group('obj-schema-AnalyzeEntitySentimentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzeEntitySentimentRequest();
-      var od = api.AnalyzeEntitySentimentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzeEntitySentimentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzeEntitySentimentRequest(
           od as api.AnalyzeEntitySentimentRequest);
     });
@@ -961,7 +967,9 @@
   unittest.group('obj-schema-AnalyzeEntitySentimentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzeEntitySentimentResponse();
-      var od = api.AnalyzeEntitySentimentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzeEntitySentimentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzeEntitySentimentResponse(
           od as api.AnalyzeEntitySentimentResponse);
     });
@@ -970,7 +978,9 @@
   unittest.group('obj-schema-AnalyzeSentimentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzeSentimentRequest();
-      var od = api.AnalyzeSentimentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzeSentimentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzeSentimentRequest(od as api.AnalyzeSentimentRequest);
     });
   });
@@ -978,7 +988,9 @@
   unittest.group('obj-schema-AnalyzeSentimentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzeSentimentResponse();
-      var od = api.AnalyzeSentimentResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzeSentimentResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzeSentimentResponse(od as api.AnalyzeSentimentResponse);
     });
   });
@@ -986,7 +998,9 @@
   unittest.group('obj-schema-AnalyzeSyntaxRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzeSyntaxRequest();
-      var od = api.AnalyzeSyntaxRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzeSyntaxRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzeSyntaxRequest(od as api.AnalyzeSyntaxRequest);
     });
   });
@@ -994,7 +1008,9 @@
   unittest.group('obj-schema-AnalyzeSyntaxResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzeSyntaxResponse();
-      var od = api.AnalyzeSyntaxResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzeSyntaxResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzeSyntaxResponse(od as api.AnalyzeSyntaxResponse);
     });
   });
@@ -1002,7 +1018,9 @@
   unittest.group('obj-schema-AnnotateTextRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotateTextRequest();
-      var od = api.AnnotateTextRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotateTextRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotateTextRequest(od as api.AnnotateTextRequest);
     });
   });
@@ -1010,7 +1028,9 @@
   unittest.group('obj-schema-AnnotateTextResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotateTextResponse();
-      var od = api.AnnotateTextResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotateTextResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotateTextResponse(od as api.AnnotateTextResponse);
     });
   });
@@ -1018,7 +1038,9 @@
   unittest.group('obj-schema-ClassificationCategory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClassificationCategory();
-      var od = api.ClassificationCategory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClassificationCategory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClassificationCategory(od as api.ClassificationCategory);
     });
   });
@@ -1026,7 +1048,9 @@
   unittest.group('obj-schema-ClassifyTextRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClassifyTextRequest();
-      var od = api.ClassifyTextRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClassifyTextRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClassifyTextRequest(od as api.ClassifyTextRequest);
     });
   });
@@ -1034,7 +1058,9 @@
   unittest.group('obj-schema-ClassifyTextResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClassifyTextResponse();
-      var od = api.ClassifyTextResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClassifyTextResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClassifyTextResponse(od as api.ClassifyTextResponse);
     });
   });
@@ -1042,7 +1068,9 @@
   unittest.group('obj-schema-DependencyEdge', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDependencyEdge();
-      var od = api.DependencyEdge.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DependencyEdge.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDependencyEdge(od as api.DependencyEdge);
     });
   });
@@ -1050,7 +1078,9 @@
   unittest.group('obj-schema-Document', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocument();
-      var od = api.Document.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Document.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDocument(od as api.Document);
     });
   });
@@ -1058,7 +1088,9 @@
   unittest.group('obj-schema-Entity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntity();
-      var od = api.Entity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Entity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEntity(od as api.Entity);
     });
   });
@@ -1066,7 +1098,9 @@
   unittest.group('obj-schema-EntityMention', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityMention();
-      var od = api.EntityMention.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntityMention.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntityMention(od as api.EntityMention);
     });
   });
@@ -1074,7 +1108,9 @@
   unittest.group('obj-schema-Features', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeatures();
-      var od = api.Features.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Features.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFeatures(od as api.Features);
     });
   });
@@ -1082,7 +1118,9 @@
   unittest.group('obj-schema-PartOfSpeech', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartOfSpeech();
-      var od = api.PartOfSpeech.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartOfSpeech.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartOfSpeech(od as api.PartOfSpeech);
     });
   });
@@ -1090,7 +1128,9 @@
   unittest.group('obj-schema-Sentence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSentence();
-      var od = api.Sentence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Sentence.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSentence(od as api.Sentence);
     });
   });
@@ -1098,7 +1138,9 @@
   unittest.group('obj-schema-Sentiment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSentiment();
-      var od = api.Sentiment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Sentiment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSentiment(od as api.Sentiment);
     });
   });
@@ -1106,7 +1148,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1114,7 +1158,9 @@
   unittest.group('obj-schema-TextSpan', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextSpan();
-      var od = api.TextSpan.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextSpan.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextSpan(od as api.TextSpan);
     });
   });
@@ -1122,7 +1168,8 @@
   unittest.group('obj-schema-Token', () {
     unittest.test('to-json--from-json', () async {
       var o = buildToken();
-      var od = api.Token.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Token.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkToken(od as api.Token);
     });
   });
diff --git a/generated/googleapis/test/libraryagent/v1_test.dart b/generated/googleapis/test/libraryagent/v1_test.dart
index 668de05..41c92ee 100644
--- a/generated/googleapis/test/libraryagent/v1_test.dart
+++ b/generated/googleapis/test/libraryagent/v1_test.dart
@@ -176,7 +176,9 @@
   unittest.group('obj-schema-GoogleExampleLibraryagentV1Book', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleExampleLibraryagentV1Book();
-      var od = api.GoogleExampleLibraryagentV1Book.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleExampleLibraryagentV1Book.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleExampleLibraryagentV1Book(
           od as api.GoogleExampleLibraryagentV1Book);
     });
@@ -185,8 +187,9 @@
   unittest.group('obj-schema-GoogleExampleLibraryagentV1ListBooksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleExampleLibraryagentV1ListBooksResponse();
-      var od =
-          api.GoogleExampleLibraryagentV1ListBooksResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleExampleLibraryagentV1ListBooksResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleExampleLibraryagentV1ListBooksResponse(
           od as api.GoogleExampleLibraryagentV1ListBooksResponse);
     });
@@ -196,8 +199,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleExampleLibraryagentV1ListShelvesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleExampleLibraryagentV1ListShelvesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleExampleLibraryagentV1ListShelvesResponse(
           od as api.GoogleExampleLibraryagentV1ListShelvesResponse);
     });
@@ -206,7 +210,9 @@
   unittest.group('obj-schema-GoogleExampleLibraryagentV1Shelf', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleExampleLibraryagentV1Shelf();
-      var od = api.GoogleExampleLibraryagentV1Shelf.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleExampleLibraryagentV1Shelf.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleExampleLibraryagentV1Shelf(
           od as api.GoogleExampleLibraryagentV1Shelf);
     });
diff --git a/generated/googleapis/test/licensing/v1_test.dart b/generated/googleapis/test/licensing/v1_test.dart
index 8094fd0..7e3699e 100644
--- a/generated/googleapis/test/licensing/v1_test.dart
+++ b/generated/googleapis/test/licensing/v1_test.dart
@@ -172,7 +172,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -180,7 +181,9 @@
   unittest.group('obj-schema-LicenseAssignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicenseAssignment();
-      var od = api.LicenseAssignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LicenseAssignment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLicenseAssignment(od as api.LicenseAssignment);
     });
   });
@@ -188,7 +191,9 @@
   unittest.group('obj-schema-LicenseAssignmentInsert', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicenseAssignmentInsert();
-      var od = api.LicenseAssignmentInsert.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LicenseAssignmentInsert.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLicenseAssignmentInsert(od as api.LicenseAssignmentInsert);
     });
   });
@@ -196,7 +201,9 @@
   unittest.group('obj-schema-LicenseAssignmentList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLicenseAssignmentList();
-      var od = api.LicenseAssignmentList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LicenseAssignmentList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLicenseAssignmentList(od as api.LicenseAssignmentList);
     });
   });
diff --git a/generated/googleapis/test/localservices/v1_test.dart b/generated/googleapis/test/localservices/v1_test.dart
index 7711b50..5899da8 100644
--- a/generated/googleapis/test/localservices/v1_test.dart
+++ b/generated/googleapis/test/localservices/v1_test.dart
@@ -437,8 +437,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAdsHomeservicesLocalservicesV1AccountReport();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAdsHomeservicesLocalservicesV1AccountReport.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAdsHomeservicesLocalservicesV1AccountReport(
           od as api.GoogleAdsHomeservicesLocalservicesV1AccountReport);
     });
@@ -448,8 +449,9 @@
       'obj-schema-GoogleAdsHomeservicesLocalservicesV1AggregatorInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAdsHomeservicesLocalservicesV1AggregatorInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAdsHomeservicesLocalservicesV1AggregatorInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAdsHomeservicesLocalservicesV1AggregatorInfo(
           od as api.GoogleAdsHomeservicesLocalservicesV1AggregatorInfo);
     });
@@ -459,9 +461,10 @@
       'obj-schema-GoogleAdsHomeservicesLocalservicesV1DetailedLeadReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAdsHomeservicesLocalservicesV1DetailedLeadReport();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAdsHomeservicesLocalservicesV1DetailedLeadReport.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAdsHomeservicesLocalservicesV1DetailedLeadReport(
           od as api.GoogleAdsHomeservicesLocalservicesV1DetailedLeadReport);
     });
@@ -471,8 +474,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAdsHomeservicesLocalservicesV1MessageLead();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAdsHomeservicesLocalservicesV1MessageLead.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAdsHomeservicesLocalservicesV1MessageLead(
           od as api.GoogleAdsHomeservicesLocalservicesV1MessageLead);
     });
@@ -482,8 +486,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAdsHomeservicesLocalservicesV1PhoneLead();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAdsHomeservicesLocalservicesV1PhoneLead.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAdsHomeservicesLocalservicesV1PhoneLead(
           od as api.GoogleAdsHomeservicesLocalservicesV1PhoneLead);
     });
@@ -495,9 +500,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleAdsHomeservicesLocalservicesV1SearchAccountReportsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAdsHomeservicesLocalservicesV1SearchAccountReportsResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAdsHomeservicesLocalservicesV1SearchAccountReportsResponse(od
           as api
               .GoogleAdsHomeservicesLocalservicesV1SearchAccountReportsResponse);
@@ -510,9 +516,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleAdsHomeservicesLocalservicesV1SearchDetailedLeadReportsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAdsHomeservicesLocalservicesV1SearchDetailedLeadReportsResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAdsHomeservicesLocalservicesV1SearchDetailedLeadReportsResponse(
           od as api
               .GoogleAdsHomeservicesLocalservicesV1SearchDetailedLeadReportsResponse);
@@ -522,7 +529,9 @@
   unittest.group('obj-schema-GoogleTypeTimeZone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeTimeZone();
-      var od = api.GoogleTypeTimeZone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeTimeZone.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeTimeZone(od as api.GoogleTypeTimeZone);
     });
   });
diff --git a/generated/googleapis/test/logging/v2_test.dart b/generated/googleapis/test/logging/v2_test.dart
index 3cb66f8..2ea2b41 100644
--- a/generated/googleapis/test/logging/v2_test.dart
+++ b/generated/googleapis/test/logging/v2_test.dart
@@ -2312,7 +2312,9 @@
   unittest.group('obj-schema-BigQueryOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigQueryOptions();
-      var od = api.BigQueryOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigQueryOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigQueryOptions(od as api.BigQueryOptions);
     });
   });
@@ -2320,7 +2322,9 @@
   unittest.group('obj-schema-BucketOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketOptions();
-      var od = api.BucketOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketOptions(od as api.BucketOptions);
     });
   });
@@ -2328,7 +2332,9 @@
   unittest.group('obj-schema-CmekSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCmekSettings();
-      var od = api.CmekSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CmekSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCmekSettings(od as api.CmekSettings);
     });
   });
@@ -2336,7 +2342,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2344,7 +2351,9 @@
   unittest.group('obj-schema-Explicit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExplicit();
-      var od = api.Explicit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Explicit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExplicit(od as api.Explicit);
     });
   });
@@ -2352,7 +2361,9 @@
   unittest.group('obj-schema-Exponential', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExponential();
-      var od = api.Exponential.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Exponential.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExponential(od as api.Exponential);
     });
   });
@@ -2360,7 +2371,9 @@
   unittest.group('obj-schema-HttpRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRequest();
-      var od = api.HttpRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpRequest(od as api.HttpRequest);
     });
   });
@@ -2368,7 +2381,9 @@
   unittest.group('obj-schema-LabelDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabelDescriptor();
-      var od = api.LabelDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LabelDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
@@ -2376,7 +2391,9 @@
   unittest.group('obj-schema-Linear', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinear();
-      var od = api.Linear.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Linear.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLinear(od as api.Linear);
     });
   });
@@ -2384,7 +2401,9 @@
   unittest.group('obj-schema-ListBucketsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBucketsResponse();
-      var od = api.ListBucketsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBucketsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBucketsResponse(od as api.ListBucketsResponse);
     });
   });
@@ -2392,7 +2411,9 @@
   unittest.group('obj-schema-ListExclusionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListExclusionsResponse();
-      var od = api.ListExclusionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListExclusionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListExclusionsResponse(od as api.ListExclusionsResponse);
     });
   });
@@ -2400,7 +2421,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -2408,7 +2431,9 @@
   unittest.group('obj-schema-ListLogEntriesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLogEntriesRequest();
-      var od = api.ListLogEntriesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLogEntriesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLogEntriesRequest(od as api.ListLogEntriesRequest);
     });
   });
@@ -2416,7 +2441,9 @@
   unittest.group('obj-schema-ListLogEntriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLogEntriesResponse();
-      var od = api.ListLogEntriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLogEntriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLogEntriesResponse(od as api.ListLogEntriesResponse);
     });
   });
@@ -2424,7 +2451,9 @@
   unittest.group('obj-schema-ListLogMetricsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLogMetricsResponse();
-      var od = api.ListLogMetricsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLogMetricsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLogMetricsResponse(od as api.ListLogMetricsResponse);
     });
   });
@@ -2432,7 +2461,9 @@
   unittest.group('obj-schema-ListLogsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLogsResponse();
-      var od = api.ListLogsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLogsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLogsResponse(od as api.ListLogsResponse);
     });
   });
@@ -2440,8 +2471,9 @@
   unittest.group('obj-schema-ListMonitoredResourceDescriptorsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMonitoredResourceDescriptorsResponse();
-      var od =
-          api.ListMonitoredResourceDescriptorsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMonitoredResourceDescriptorsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMonitoredResourceDescriptorsResponse(
           od as api.ListMonitoredResourceDescriptorsResponse);
     });
@@ -2450,7 +2482,9 @@
   unittest.group('obj-schema-ListSinksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSinksResponse();
-      var od = api.ListSinksResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSinksResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSinksResponse(od as api.ListSinksResponse);
     });
   });
@@ -2458,7 +2492,9 @@
   unittest.group('obj-schema-ListViewsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListViewsResponse();
-      var od = api.ListViewsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListViewsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListViewsResponse(od as api.ListViewsResponse);
     });
   });
@@ -2466,7 +2502,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2474,7 +2512,9 @@
   unittest.group('obj-schema-LogBucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogBucket();
-      var od = api.LogBucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LogBucket.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogBucket(od as api.LogBucket);
     });
   });
@@ -2482,7 +2522,9 @@
   unittest.group('obj-schema-LogEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogEntry();
-      var od = api.LogEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LogEntry.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogEntry(od as api.LogEntry);
     });
   });
@@ -2490,7 +2532,9 @@
   unittest.group('obj-schema-LogEntryOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogEntryOperation();
-      var od = api.LogEntryOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogEntryOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogEntryOperation(od as api.LogEntryOperation);
     });
   });
@@ -2498,7 +2542,9 @@
   unittest.group('obj-schema-LogEntrySourceLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogEntrySourceLocation();
-      var od = api.LogEntrySourceLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogEntrySourceLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogEntrySourceLocation(od as api.LogEntrySourceLocation);
     });
   });
@@ -2506,7 +2552,9 @@
   unittest.group('obj-schema-LogExclusion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogExclusion();
-      var od = api.LogExclusion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogExclusion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogExclusion(od as api.LogExclusion);
     });
   });
@@ -2514,7 +2562,9 @@
   unittest.group('obj-schema-LogLine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogLine();
-      var od = api.LogLine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LogLine.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogLine(od as api.LogLine);
     });
   });
@@ -2522,7 +2572,9 @@
   unittest.group('obj-schema-LogMetric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogMetric();
-      var od = api.LogMetric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LogMetric.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogMetric(od as api.LogMetric);
     });
   });
@@ -2530,7 +2582,9 @@
   unittest.group('obj-schema-LogSink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogSink();
-      var od = api.LogSink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LogSink.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogSink(od as api.LogSink);
     });
   });
@@ -2538,7 +2592,9 @@
   unittest.group('obj-schema-LogView', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogView();
-      var od = api.LogView.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LogView.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogView(od as api.LogView);
     });
   });
@@ -2546,7 +2602,9 @@
   unittest.group('obj-schema-MetricDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptor();
-      var od = api.MetricDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
@@ -2554,7 +2612,9 @@
   unittest.group('obj-schema-MetricDescriptorMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptorMetadata();
-      var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptorMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
@@ -2562,7 +2622,9 @@
   unittest.group('obj-schema-MonitoredResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoredResource();
-      var od = api.MonitoredResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoredResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoredResource(od as api.MonitoredResource);
     });
   });
@@ -2570,7 +2632,9 @@
   unittest.group('obj-schema-MonitoredResourceDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoredResourceDescriptor();
-      var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoredResourceDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
@@ -2578,7 +2642,9 @@
   unittest.group('obj-schema-MonitoredResourceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoredResourceMetadata();
-      var od = api.MonitoredResourceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoredResourceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoredResourceMetadata(od as api.MonitoredResourceMetadata);
     });
   });
@@ -2586,7 +2652,9 @@
   unittest.group('obj-schema-RequestLog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestLog();
-      var od = api.RequestLog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RequestLog.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRequestLog(od as api.RequestLog);
     });
   });
@@ -2594,7 +2662,9 @@
   unittest.group('obj-schema-SourceLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceLocation();
-      var od = api.SourceLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceLocation(od as api.SourceLocation);
     });
   });
@@ -2602,7 +2672,9 @@
   unittest.group('obj-schema-SourceReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceReference();
-      var od = api.SourceReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceReference(od as api.SourceReference);
     });
   });
@@ -2610,7 +2682,9 @@
   unittest.group('obj-schema-SuppressionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuppressionInfo();
-      var od = api.SuppressionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuppressionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuppressionInfo(od as api.SuppressionInfo);
     });
   });
@@ -2618,7 +2692,9 @@
   unittest.group('obj-schema-TailLogEntriesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTailLogEntriesRequest();
-      var od = api.TailLogEntriesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TailLogEntriesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTailLogEntriesRequest(od as api.TailLogEntriesRequest);
     });
   });
@@ -2626,7 +2702,9 @@
   unittest.group('obj-schema-TailLogEntriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTailLogEntriesResponse();
-      var od = api.TailLogEntriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TailLogEntriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTailLogEntriesResponse(od as api.TailLogEntriesResponse);
     });
   });
@@ -2634,7 +2712,9 @@
   unittest.group('obj-schema-UndeleteBucketRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteBucketRequest();
-      var od = api.UndeleteBucketRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteBucketRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteBucketRequest(od as api.UndeleteBucketRequest);
     });
   });
@@ -2642,7 +2722,9 @@
   unittest.group('obj-schema-WriteLogEntriesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWriteLogEntriesRequest();
-      var od = api.WriteLogEntriesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WriteLogEntriesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWriteLogEntriesRequest(od as api.WriteLogEntriesRequest);
     });
   });
@@ -2650,7 +2732,9 @@
   unittest.group('obj-schema-WriteLogEntriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWriteLogEntriesResponse();
-      var od = api.WriteLogEntriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WriteLogEntriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWriteLogEntriesResponse(od as api.WriteLogEntriesResponse);
     });
   });
diff --git a/generated/googleapis/test/managedidentities/v1_test.dart b/generated/googleapis/test/managedidentities/v1_test.dart
index 9feb137..f4dd84e 100644
--- a/generated/googleapis/test/managedidentities/v1_test.dart
+++ b/generated/googleapis/test/managedidentities/v1_test.dart
@@ -2150,7 +2150,9 @@
   unittest.group('obj-schema-AttachTrustRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttachTrustRequest();
-      var od = api.AttachTrustRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttachTrustRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttachTrustRequest(od as api.AttachTrustRequest);
     });
   });
@@ -2158,7 +2160,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -2166,7 +2170,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -2174,7 +2180,9 @@
   unittest.group('obj-schema-DailyCycle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDailyCycle();
-      var od = api.DailyCycle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DailyCycle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDailyCycle(od as api.DailyCycle);
     });
   });
@@ -2182,7 +2190,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -2190,7 +2199,9 @@
   unittest.group('obj-schema-DenyMaintenancePeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDenyMaintenancePeriod();
-      var od = api.DenyMaintenancePeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DenyMaintenancePeriod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDenyMaintenancePeriod(od as api.DenyMaintenancePeriod);
     });
   });
@@ -2198,7 +2209,9 @@
   unittest.group('obj-schema-DetachTrustRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDetachTrustRequest();
-      var od = api.DetachTrustRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DetachTrustRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDetachTrustRequest(od as api.DetachTrustRequest);
     });
   });
@@ -2206,7 +2219,9 @@
   unittest.group('obj-schema-Domain', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomain();
-      var od = api.Domain.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Domain.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDomain(od as api.Domain);
     });
   });
@@ -2214,7 +2229,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2222,7 +2238,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -2230,8 +2247,9 @@
   unittest.group('obj-schema-GoogleCloudManagedidentitiesV1OpMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudManagedidentitiesV1OpMetadata();
-      var od =
-          api.GoogleCloudManagedidentitiesV1OpMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudManagedidentitiesV1OpMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudManagedidentitiesV1OpMetadata(
           od as api.GoogleCloudManagedidentitiesV1OpMetadata);
     });
@@ -2241,8 +2259,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudManagedidentitiesV1alpha1OpMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudManagedidentitiesV1alpha1OpMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudManagedidentitiesV1alpha1OpMetadata(
           od as api.GoogleCloudManagedidentitiesV1alpha1OpMetadata);
     });
@@ -2252,8 +2271,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudManagedidentitiesV1beta1OpMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudManagedidentitiesV1beta1OpMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudManagedidentitiesV1beta1OpMetadata(
           od as api.GoogleCloudManagedidentitiesV1beta1OpMetadata);
     });
@@ -2263,9 +2283,10 @@
       'obj-schema-GoogleCloudSaasacceleratorManagementProvidersV1Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSaasacceleratorManagementProvidersV1Instance();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1Instance.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1Instance(
           od as api.GoogleCloudSaasacceleratorManagementProvidersV1Instance);
     });
@@ -2277,9 +2298,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule);
@@ -2292,9 +2314,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings);
@@ -2307,9 +2330,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata);
@@ -2322,9 +2346,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1PerSliSloEligibility();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1PerSliSloEligibility
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1PerSliSloEligibility(
           od as api
               .GoogleCloudSaasacceleratorManagementProvidersV1PerSliSloEligibility);
@@ -2337,9 +2362,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource);
@@ -2352,8 +2378,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(od
           as api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility);
     });
@@ -2365,8 +2392,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(od
           as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
     });
@@ -2377,8 +2405,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata(
           od as api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata);
     });
@@ -2387,7 +2416,9 @@
   unittest.group('obj-schema-ListDomainsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDomainsResponse();
-      var od = api.ListDomainsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDomainsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDomainsResponse(od as api.ListDomainsResponse);
     });
   });
@@ -2395,7 +2426,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -2403,7 +2436,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -2411,7 +2446,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2419,7 +2456,9 @@
   unittest.group('obj-schema-MaintenancePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenancePolicy();
-      var od = api.MaintenancePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenancePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenancePolicy(od as api.MaintenancePolicy);
     });
   });
@@ -2427,7 +2466,9 @@
   unittest.group('obj-schema-MaintenanceWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenanceWindow();
-      var od = api.MaintenanceWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenanceWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenanceWindow(od as api.MaintenanceWindow);
     });
   });
@@ -2435,7 +2476,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2443,7 +2486,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -2451,7 +2496,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2459,7 +2506,9 @@
   unittest.group('obj-schema-ReconfigureTrustRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReconfigureTrustRequest();
-      var od = api.ReconfigureTrustRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReconfigureTrustRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReconfigureTrustRequest(od as api.ReconfigureTrustRequest);
     });
   });
@@ -2467,7 +2516,9 @@
   unittest.group('obj-schema-ResetAdminPasswordRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResetAdminPasswordRequest();
-      var od = api.ResetAdminPasswordRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResetAdminPasswordRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResetAdminPasswordRequest(od as api.ResetAdminPasswordRequest);
     });
   });
@@ -2475,7 +2526,9 @@
   unittest.group('obj-schema-ResetAdminPasswordResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResetAdminPasswordResponse();
-      var od = api.ResetAdminPasswordResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResetAdminPasswordResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResetAdminPasswordResponse(od as api.ResetAdminPasswordResponse);
     });
   });
@@ -2483,7 +2536,9 @@
   unittest.group('obj-schema-Schedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchedule();
-      var od = api.Schedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schedule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchedule(od as api.Schedule);
     });
   });
@@ -2491,7 +2546,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -2499,7 +2556,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2507,7 +2566,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2515,7 +2576,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -2523,7 +2586,9 @@
   unittest.group('obj-schema-TimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeOfDay();
-      var od = api.TimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeOfDay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeOfDay(od as api.TimeOfDay);
     });
   });
@@ -2531,7 +2596,8 @@
   unittest.group('obj-schema-Trust', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrust();
-      var od = api.Trust.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Trust.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTrust(od as api.Trust);
     });
   });
@@ -2539,7 +2605,9 @@
   unittest.group('obj-schema-UpdatePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdatePolicy();
-      var od = api.UpdatePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdatePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdatePolicy(od as api.UpdatePolicy);
     });
   });
@@ -2547,7 +2615,9 @@
   unittest.group('obj-schema-ValidateTrustRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValidateTrustRequest();
-      var od = api.ValidateTrustRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValidateTrustRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValidateTrustRequest(od as api.ValidateTrustRequest);
     });
   });
@@ -2555,7 +2625,9 @@
   unittest.group('obj-schema-WeeklyCycle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWeeklyCycle();
-      var od = api.WeeklyCycle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WeeklyCycle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWeeklyCycle(od as api.WeeklyCycle);
     });
   });
diff --git a/generated/googleapis/test/manufacturers/v1_test.dart b/generated/googleapis/test/manufacturers/v1_test.dart
index b9b94d3..89436fb 100644
--- a/generated/googleapis/test/manufacturers/v1_test.dart
+++ b/generated/googleapis/test/manufacturers/v1_test.dart
@@ -785,7 +785,9 @@
   unittest.group('obj-schema-Attributes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttributes();
-      var od = api.Attributes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Attributes.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAttributes(od as api.Attributes);
     });
   });
@@ -793,7 +795,9 @@
   unittest.group('obj-schema-Capacity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCapacity();
-      var od = api.Capacity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Capacity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCapacity(od as api.Capacity);
     });
   });
@@ -801,7 +805,8 @@
   unittest.group('obj-schema-Count', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCount();
-      var od = api.Count.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Count.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCount(od as api.Count);
     });
   });
@@ -809,7 +814,9 @@
   unittest.group('obj-schema-DestinationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDestinationStatus();
-      var od = api.DestinationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DestinationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDestinationStatus(od as api.DestinationStatus);
     });
   });
@@ -817,7 +824,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -825,7 +833,9 @@
   unittest.group('obj-schema-FeatureDescription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeatureDescription();
-      var od = api.FeatureDescription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FeatureDescription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFeatureDescription(od as api.FeatureDescription);
     });
   });
@@ -833,7 +843,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -841,7 +852,8 @@
   unittest.group('obj-schema-Issue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIssue();
-      var od = api.Issue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Issue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIssue(od as api.Issue);
     });
   });
@@ -849,7 +861,9 @@
   unittest.group('obj-schema-ListProductsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListProductsResponse();
-      var od = api.ListProductsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListProductsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListProductsResponse(od as api.ListProductsResponse);
     });
   });
@@ -857,7 +871,8 @@
   unittest.group('obj-schema-Price', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrice();
-      var od = api.Price.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Price.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPrice(od as api.Price);
     });
   });
@@ -865,7 +880,9 @@
   unittest.group('obj-schema-Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProduct();
-      var od = api.Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Product.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProduct(od as api.Product);
     });
   });
@@ -873,7 +890,9 @@
   unittest.group('obj-schema-ProductDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductDetail();
-      var od = api.ProductDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductDetail(od as api.ProductDetail);
     });
   });
diff --git a/generated/googleapis/test/memcache/v1_test.dart b/generated/googleapis/test/memcache/v1_test.dart
index 7d47ef1..b31529e 100644
--- a/generated/googleapis/test/memcache/v1_test.dart
+++ b/generated/googleapis/test/memcache/v1_test.dart
@@ -1830,7 +1830,9 @@
   unittest.group('obj-schema-ApplyParametersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplyParametersRequest();
-      var od = api.ApplyParametersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplyParametersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplyParametersRequest(od as api.ApplyParametersRequest);
     });
   });
@@ -1838,7 +1840,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -1846,7 +1850,9 @@
   unittest.group('obj-schema-DailyCycle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDailyCycle();
-      var od = api.DailyCycle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DailyCycle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDailyCycle(od as api.DailyCycle);
     });
   });
@@ -1854,7 +1860,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -1862,7 +1869,9 @@
   unittest.group('obj-schema-DenyMaintenancePeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDenyMaintenancePeriod();
-      var od = api.DenyMaintenancePeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DenyMaintenancePeriod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDenyMaintenancePeriod(od as api.DenyMaintenancePeriod);
     });
   });
@@ -1870,7 +1879,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1878,7 +1888,9 @@
   unittest.group('obj-schema-GoogleCloudMemcacheV1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMemcacheV1OperationMetadata();
-      var od = api.GoogleCloudMemcacheV1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMemcacheV1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMemcacheV1OperationMetadata(
           od as api.GoogleCloudMemcacheV1OperationMetadata);
     });
@@ -1888,9 +1900,10 @@
       'obj-schema-GoogleCloudSaasacceleratorManagementProvidersV1Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSaasacceleratorManagementProvidersV1Instance();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1Instance.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1Instance(
           od as api.GoogleCloudSaasacceleratorManagementProvidersV1Instance);
     });
@@ -1902,9 +1915,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule);
@@ -1917,9 +1931,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings);
@@ -1932,9 +1947,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata);
@@ -1947,9 +1963,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(od
           as api
               .GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource);
@@ -1962,8 +1979,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(od
           as api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility);
     });
@@ -1975,8 +1993,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(od
           as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
     });
@@ -1987,8 +2006,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata(
           od as api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata);
     });
@@ -1997,7 +2017,9 @@
   unittest.group('obj-schema-Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstance();
-      var od = api.Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Instance.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstance(od as api.Instance);
     });
   });
@@ -2005,7 +2027,9 @@
   unittest.group('obj-schema-InstanceMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceMessage();
-      var od = api.InstanceMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceMessage(od as api.InstanceMessage);
     });
   });
@@ -2013,7 +2037,9 @@
   unittest.group('obj-schema-ListInstancesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInstancesResponse();
-      var od = api.ListInstancesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInstancesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
@@ -2021,7 +2047,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -2029,7 +2057,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -2037,7 +2067,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2045,7 +2077,9 @@
   unittest.group('obj-schema-LocationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationMetadata();
-      var od = api.LocationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationMetadata(od as api.LocationMetadata);
     });
   });
@@ -2053,7 +2087,9 @@
   unittest.group('obj-schema-MaintenancePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenancePolicy();
-      var od = api.MaintenancePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenancePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenancePolicy(od as api.MaintenancePolicy);
     });
   });
@@ -2061,7 +2097,9 @@
   unittest.group('obj-schema-MaintenanceWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenanceWindow();
-      var od = api.MaintenanceWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenanceWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenanceWindow(od as api.MaintenanceWindow);
     });
   });
@@ -2069,7 +2107,9 @@
   unittest.group('obj-schema-MemcacheParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMemcacheParameters();
-      var od = api.MemcacheParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MemcacheParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMemcacheParameters(od as api.MemcacheParameters);
     });
   });
@@ -2077,7 +2117,8 @@
   unittest.group('obj-schema-Node', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNode();
-      var od = api.Node.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Node.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNode(od as api.Node);
     });
   });
@@ -2085,7 +2126,9 @@
   unittest.group('obj-schema-NodeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeConfig();
-      var od = api.NodeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NodeConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNodeConfig(od as api.NodeConfig);
     });
   });
@@ -2093,7 +2136,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2101,7 +2146,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -2109,7 +2156,9 @@
   unittest.group('obj-schema-Schedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchedule();
-      var od = api.Schedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schedule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchedule(od as api.Schedule);
     });
   });
@@ -2117,7 +2166,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2125,7 +2176,9 @@
   unittest.group('obj-schema-TimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeOfDay();
-      var od = api.TimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeOfDay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeOfDay(od as api.TimeOfDay);
     });
   });
@@ -2133,7 +2186,9 @@
   unittest.group('obj-schema-UpdateParametersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateParametersRequest();
-      var od = api.UpdateParametersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateParametersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateParametersRequest(od as api.UpdateParametersRequest);
     });
   });
@@ -2141,7 +2196,9 @@
   unittest.group('obj-schema-UpdatePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdatePolicy();
-      var od = api.UpdatePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdatePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdatePolicy(od as api.UpdatePolicy);
     });
   });
@@ -2149,7 +2206,9 @@
   unittest.group('obj-schema-WeeklyCycle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWeeklyCycle();
-      var od = api.WeeklyCycle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WeeklyCycle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWeeklyCycle(od as api.WeeklyCycle);
     });
   });
@@ -2157,7 +2216,9 @@
   unittest.group('obj-schema-ZoneMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZoneMetadata();
-      var od = api.ZoneMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ZoneMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkZoneMetadata(od as api.ZoneMetadata);
     });
   });
diff --git a/generated/googleapis/test/ml/v1_test.dart b/generated/googleapis/test/ml/v1_test.dart
index 24349b3..54cc63e 100644
--- a/generated/googleapis/test/ml/v1_test.dart
+++ b/generated/googleapis/test/ml/v1_test.dart
@@ -3847,7 +3847,9 @@
   unittest.group('obj-schema-GoogleApiHttpBody', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiHttpBody();
-      var od = api.GoogleApiHttpBody.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiHttpBody.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiHttpBody(od as api.GoogleApiHttpBody);
     });
   });
@@ -3858,9 +3860,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudMlV1AutomatedStoppingConfigDecayCurveAutomatedStoppingConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudMlV1AutomatedStoppingConfigDecayCurveAutomatedStoppingConfig
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1AutomatedStoppingConfigDecayCurveAutomatedStoppingConfig(
           od as api
               .GoogleCloudMlV1AutomatedStoppingConfigDecayCurveAutomatedStoppingConfig);
@@ -3873,9 +3876,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudMlV1AutomatedStoppingConfigMedianAutomatedStoppingConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudMlV1AutomatedStoppingConfigMedianAutomatedStoppingConfig
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1AutomatedStoppingConfigMedianAutomatedStoppingConfig(
           od as api
               .GoogleCloudMlV1AutomatedStoppingConfigMedianAutomatedStoppingConfig);
@@ -3886,9 +3890,10 @@
       'obj-schema-GoogleCloudMlV1HyperparameterOutputHyperparameterMetric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1HyperparameterOutputHyperparameterMetric();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(
           od as api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric);
     });
@@ -3897,7 +3902,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1MeasurementMetric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1MeasurementMetric();
-      var od = api.GoogleCloudMlV1MeasurementMetric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1MeasurementMetric.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1MeasurementMetric(
           od as api.GoogleCloudMlV1MeasurementMetric);
     });
@@ -3909,8 +3916,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec(od
           as api.GoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec);
     });
@@ -3921,9 +3929,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec(
           od as api.GoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec);
     });
@@ -3933,9 +3942,10 @@
       'obj-schema-GoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec(
           od as api.GoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec);
     });
@@ -3945,9 +3955,10 @@
       'obj-schema-GoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec(
           od as api.GoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec);
     });
@@ -3959,9 +3970,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec(
           od as api
               .GoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec);
@@ -3974,9 +3986,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec(
           od as api
               .GoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec);
@@ -3989,9 +4002,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec(od
           as api
               .GoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec);
@@ -4001,7 +4015,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1StudyConfigMetricSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1StudyConfigMetricSpec();
-      var od = api.GoogleCloudMlV1StudyConfigMetricSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1StudyConfigMetricSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StudyConfigMetricSpec(
           od as api.GoogleCloudMlV1StudyConfigMetricSpec);
     });
@@ -4010,7 +4026,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1StudyConfigParameterSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1StudyConfigParameterSpec();
-      var od = api.GoogleCloudMlV1StudyConfigParameterSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1StudyConfigParameterSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StudyConfigParameterSpec(
           od as api.GoogleCloudMlV1StudyConfigParameterSpec);
     });
@@ -4019,7 +4037,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1TrialParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1TrialParameter();
-      var od = api.GoogleCloudMlV1TrialParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1TrialParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1TrialParameter(
           od as api.GoogleCloudMlV1TrialParameter);
     });
@@ -4028,7 +4048,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1AcceleratorConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1AcceleratorConfig();
-      var od = api.GoogleCloudMlV1AcceleratorConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1AcceleratorConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1AcceleratorConfig(
           od as api.GoogleCloudMlV1AcceleratorConfig);
     });
@@ -4037,8 +4059,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1AddTrialMeasurementRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1AddTrialMeasurementRequest();
-      var od =
-          api.GoogleCloudMlV1AddTrialMeasurementRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1AddTrialMeasurementRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1AddTrialMeasurementRequest(
           od as api.GoogleCloudMlV1AddTrialMeasurementRequest);
     });
@@ -4047,7 +4070,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1AutoScaling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1AutoScaling();
-      var od = api.GoogleCloudMlV1AutoScaling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1AutoScaling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1AutoScaling(od as api.GoogleCloudMlV1AutoScaling);
     });
   });
@@ -4055,7 +4080,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1AutomatedStoppingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1AutomatedStoppingConfig();
-      var od = api.GoogleCloudMlV1AutomatedStoppingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1AutomatedStoppingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1AutomatedStoppingConfig(
           od as api.GoogleCloudMlV1AutomatedStoppingConfig);
     });
@@ -4064,7 +4091,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1BuiltInAlgorithmOutput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1BuiltInAlgorithmOutput();
-      var od = api.GoogleCloudMlV1BuiltInAlgorithmOutput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1BuiltInAlgorithmOutput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1BuiltInAlgorithmOutput(
           od as api.GoogleCloudMlV1BuiltInAlgorithmOutput);
     });
@@ -4073,7 +4102,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1CancelJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1CancelJobRequest();
-      var od = api.GoogleCloudMlV1CancelJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1CancelJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1CancelJobRequest(
           od as api.GoogleCloudMlV1CancelJobRequest);
     });
@@ -4082,7 +4113,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1Capability', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1Capability();
-      var od = api.GoogleCloudMlV1Capability.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1Capability.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1Capability(od as api.GoogleCloudMlV1Capability);
     });
   });
@@ -4091,9 +4124,10 @@
       'obj-schema-GoogleCloudMlV1CheckTrialEarlyStoppingStateMetatdata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1CheckTrialEarlyStoppingStateMetatdata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudMlV1CheckTrialEarlyStoppingStateMetatdata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1CheckTrialEarlyStoppingStateMetatdata(
           od as api.GoogleCloudMlV1CheckTrialEarlyStoppingStateMetatdata);
     });
@@ -4103,8 +4137,9 @@
       'obj-schema-GoogleCloudMlV1CheckTrialEarlyStoppingStateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1CheckTrialEarlyStoppingStateRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudMlV1CheckTrialEarlyStoppingStateRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1CheckTrialEarlyStoppingStateRequest(
           od as api.GoogleCloudMlV1CheckTrialEarlyStoppingStateRequest);
     });
@@ -4114,8 +4149,9 @@
       'obj-schema-GoogleCloudMlV1CheckTrialEarlyStoppingStateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1CheckTrialEarlyStoppingStateResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudMlV1CheckTrialEarlyStoppingStateResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1CheckTrialEarlyStoppingStateResponse(
           od as api.GoogleCloudMlV1CheckTrialEarlyStoppingStateResponse);
     });
@@ -4124,7 +4160,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1CompleteTrialRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1CompleteTrialRequest();
-      var od = api.GoogleCloudMlV1CompleteTrialRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1CompleteTrialRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1CompleteTrialRequest(
           od as api.GoogleCloudMlV1CompleteTrialRequest);
     });
@@ -4133,7 +4171,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1Config', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1Config();
-      var od = api.GoogleCloudMlV1Config.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1Config.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1Config(od as api.GoogleCloudMlV1Config);
     });
   });
@@ -4141,7 +4181,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ContainerPort', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ContainerPort();
-      var od = api.GoogleCloudMlV1ContainerPort.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ContainerPort.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ContainerPort(od as api.GoogleCloudMlV1ContainerPort);
     });
   });
@@ -4149,7 +4191,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ContainerSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ContainerSpec();
-      var od = api.GoogleCloudMlV1ContainerSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ContainerSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ContainerSpec(od as api.GoogleCloudMlV1ContainerSpec);
     });
   });
@@ -4157,7 +4201,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1DiskConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1DiskConfig();
-      var od = api.GoogleCloudMlV1DiskConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1DiskConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1DiskConfig(od as api.GoogleCloudMlV1DiskConfig);
     });
   });
@@ -4165,7 +4211,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1EncryptionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1EncryptionConfig();
-      var od = api.GoogleCloudMlV1EncryptionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1EncryptionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1EncryptionConfig(
           od as api.GoogleCloudMlV1EncryptionConfig);
     });
@@ -4174,7 +4222,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1EnvVar', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1EnvVar();
-      var od = api.GoogleCloudMlV1EnvVar.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1EnvVar.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1EnvVar(od as api.GoogleCloudMlV1EnvVar);
     });
   });
@@ -4182,7 +4232,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ExplainRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ExplainRequest();
-      var od = api.GoogleCloudMlV1ExplainRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ExplainRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ExplainRequest(
           od as api.GoogleCloudMlV1ExplainRequest);
     });
@@ -4191,7 +4243,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ExplanationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ExplanationConfig();
-      var od = api.GoogleCloudMlV1ExplanationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ExplanationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ExplanationConfig(
           od as api.GoogleCloudMlV1ExplanationConfig);
     });
@@ -4200,7 +4254,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1GetConfigResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1GetConfigResponse();
-      var od = api.GoogleCloudMlV1GetConfigResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1GetConfigResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1GetConfigResponse(
           od as api.GoogleCloudMlV1GetConfigResponse);
     });
@@ -4209,7 +4265,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1HyperparameterOutput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1HyperparameterOutput();
-      var od = api.GoogleCloudMlV1HyperparameterOutput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1HyperparameterOutput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1HyperparameterOutput(
           od as api.GoogleCloudMlV1HyperparameterOutput);
     });
@@ -4218,7 +4276,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1HyperparameterSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1HyperparameterSpec();
-      var od = api.GoogleCloudMlV1HyperparameterSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1HyperparameterSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1HyperparameterSpec(
           od as api.GoogleCloudMlV1HyperparameterSpec);
     });
@@ -4228,8 +4288,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1IntegratedGradientsAttribution();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudMlV1IntegratedGradientsAttribution.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1IntegratedGradientsAttribution(
           od as api.GoogleCloudMlV1IntegratedGradientsAttribution);
     });
@@ -4238,7 +4299,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1Job', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1Job();
-      var od = api.GoogleCloudMlV1Job.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1Job.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1Job(od as api.GoogleCloudMlV1Job);
     });
   });
@@ -4246,7 +4309,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ListJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ListJobsResponse();
-      var od = api.GoogleCloudMlV1ListJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ListJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ListJobsResponse(
           od as api.GoogleCloudMlV1ListJobsResponse);
     });
@@ -4255,7 +4320,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ListLocationsResponse();
-      var od = api.GoogleCloudMlV1ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ListLocationsResponse(
           od as api.GoogleCloudMlV1ListLocationsResponse);
     });
@@ -4264,7 +4331,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ListModelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ListModelsResponse();
-      var od = api.GoogleCloudMlV1ListModelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ListModelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ListModelsResponse(
           od as api.GoogleCloudMlV1ListModelsResponse);
     });
@@ -4273,7 +4342,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ListOptimalTrialsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ListOptimalTrialsRequest();
-      var od = api.GoogleCloudMlV1ListOptimalTrialsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ListOptimalTrialsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ListOptimalTrialsRequest(
           od as api.GoogleCloudMlV1ListOptimalTrialsRequest);
     });
@@ -4282,8 +4353,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ListOptimalTrialsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ListOptimalTrialsResponse();
-      var od =
-          api.GoogleCloudMlV1ListOptimalTrialsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ListOptimalTrialsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ListOptimalTrialsResponse(
           od as api.GoogleCloudMlV1ListOptimalTrialsResponse);
     });
@@ -4292,7 +4364,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ListStudiesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ListStudiesResponse();
-      var od = api.GoogleCloudMlV1ListStudiesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ListStudiesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ListStudiesResponse(
           od as api.GoogleCloudMlV1ListStudiesResponse);
     });
@@ -4301,7 +4375,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ListTrialsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ListTrialsResponse();
-      var od = api.GoogleCloudMlV1ListTrialsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ListTrialsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ListTrialsResponse(
           od as api.GoogleCloudMlV1ListTrialsResponse);
     });
@@ -4310,7 +4386,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ListVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ListVersionsResponse();
-      var od = api.GoogleCloudMlV1ListVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ListVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ListVersionsResponse(
           od as api.GoogleCloudMlV1ListVersionsResponse);
     });
@@ -4319,7 +4397,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1Location();
-      var od = api.GoogleCloudMlV1Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1Location.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1Location(od as api.GoogleCloudMlV1Location);
     });
   });
@@ -4327,7 +4407,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ManualScaling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ManualScaling();
-      var od = api.GoogleCloudMlV1ManualScaling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ManualScaling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ManualScaling(od as api.GoogleCloudMlV1ManualScaling);
     });
   });
@@ -4335,7 +4417,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1Measurement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1Measurement();
-      var od = api.GoogleCloudMlV1Measurement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1Measurement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1Measurement(od as api.GoogleCloudMlV1Measurement);
     });
   });
@@ -4343,7 +4427,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1MetricSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1MetricSpec();
-      var od = api.GoogleCloudMlV1MetricSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1MetricSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1MetricSpec(od as api.GoogleCloudMlV1MetricSpec);
     });
   });
@@ -4351,7 +4437,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1Model', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1Model();
-      var od = api.GoogleCloudMlV1Model.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1Model.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1Model(od as api.GoogleCloudMlV1Model);
     });
   });
@@ -4359,7 +4447,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1OperationMetadata();
-      var od = api.GoogleCloudMlV1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1OperationMetadata(
           od as api.GoogleCloudMlV1OperationMetadata);
     });
@@ -4368,7 +4458,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ParameterSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ParameterSpec();
-      var od = api.GoogleCloudMlV1ParameterSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ParameterSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ParameterSpec(od as api.GoogleCloudMlV1ParameterSpec);
     });
   });
@@ -4376,7 +4468,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1PredictRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1PredictRequest();
-      var od = api.GoogleCloudMlV1PredictRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1PredictRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1PredictRequest(
           od as api.GoogleCloudMlV1PredictRequest);
     });
@@ -4385,7 +4479,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1PredictionInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1PredictionInput();
-      var od = api.GoogleCloudMlV1PredictionInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1PredictionInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1PredictionInput(
           od as api.GoogleCloudMlV1PredictionInput);
     });
@@ -4394,7 +4490,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1PredictionOutput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1PredictionOutput();
-      var od = api.GoogleCloudMlV1PredictionOutput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1PredictionOutput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1PredictionOutput(
           od as api.GoogleCloudMlV1PredictionOutput);
     });
@@ -4403,7 +4501,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1ReplicaConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1ReplicaConfig();
-      var od = api.GoogleCloudMlV1ReplicaConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1ReplicaConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1ReplicaConfig(od as api.GoogleCloudMlV1ReplicaConfig);
     });
   });
@@ -4411,7 +4511,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1RequestLoggingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1RequestLoggingConfig();
-      var od = api.GoogleCloudMlV1RequestLoggingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1RequestLoggingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1RequestLoggingConfig(
           od as api.GoogleCloudMlV1RequestLoggingConfig);
     });
@@ -4420,7 +4522,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1RouteMap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1RouteMap();
-      var od = api.GoogleCloudMlV1RouteMap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1RouteMap.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1RouteMap(od as api.GoogleCloudMlV1RouteMap);
     });
   });
@@ -4428,8 +4532,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1SampledShapleyAttribution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1SampledShapleyAttribution();
-      var od =
-          api.GoogleCloudMlV1SampledShapleyAttribution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1SampledShapleyAttribution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1SampledShapleyAttribution(
           od as api.GoogleCloudMlV1SampledShapleyAttribution);
     });
@@ -4438,7 +4543,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1Scheduling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1Scheduling();
-      var od = api.GoogleCloudMlV1Scheduling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1Scheduling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1Scheduling(od as api.GoogleCloudMlV1Scheduling);
     });
   });
@@ -4446,7 +4553,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1SetDefaultVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1SetDefaultVersionRequest();
-      var od = api.GoogleCloudMlV1SetDefaultVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1SetDefaultVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1SetDefaultVersionRequest(
           od as api.GoogleCloudMlV1SetDefaultVersionRequest);
     });
@@ -4455,7 +4564,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1StopTrialRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1StopTrialRequest();
-      var od = api.GoogleCloudMlV1StopTrialRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1StopTrialRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StopTrialRequest(
           od as api.GoogleCloudMlV1StopTrialRequest);
     });
@@ -4464,7 +4575,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1Study', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1Study();
-      var od = api.GoogleCloudMlV1Study.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1Study.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1Study(od as api.GoogleCloudMlV1Study);
     });
   });
@@ -4472,7 +4585,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1StudyConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1StudyConfig();
-      var od = api.GoogleCloudMlV1StudyConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1StudyConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1StudyConfig(od as api.GoogleCloudMlV1StudyConfig);
     });
   });
@@ -4480,7 +4595,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1SuggestTrialsMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1SuggestTrialsMetadata();
-      var od = api.GoogleCloudMlV1SuggestTrialsMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1SuggestTrialsMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1SuggestTrialsMetadata(
           od as api.GoogleCloudMlV1SuggestTrialsMetadata);
     });
@@ -4489,7 +4606,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1SuggestTrialsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1SuggestTrialsRequest();
-      var od = api.GoogleCloudMlV1SuggestTrialsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1SuggestTrialsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1SuggestTrialsRequest(
           od as api.GoogleCloudMlV1SuggestTrialsRequest);
     });
@@ -4498,7 +4617,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1SuggestTrialsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1SuggestTrialsResponse();
-      var od = api.GoogleCloudMlV1SuggestTrialsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1SuggestTrialsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1SuggestTrialsResponse(
           od as api.GoogleCloudMlV1SuggestTrialsResponse);
     });
@@ -4507,7 +4628,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1TrainingInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1TrainingInput();
-      var od = api.GoogleCloudMlV1TrainingInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1TrainingInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1TrainingInput(od as api.GoogleCloudMlV1TrainingInput);
     });
   });
@@ -4515,7 +4638,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1TrainingOutput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1TrainingOutput();
-      var od = api.GoogleCloudMlV1TrainingOutput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1TrainingOutput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1TrainingOutput(
           od as api.GoogleCloudMlV1TrainingOutput);
     });
@@ -4524,7 +4649,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1Trial', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1Trial();
-      var od = api.GoogleCloudMlV1Trial.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1Trial.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1Trial(od as api.GoogleCloudMlV1Trial);
     });
   });
@@ -4532,7 +4659,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1Version', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1Version();
-      var od = api.GoogleCloudMlV1Version.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1Version.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1Version(od as api.GoogleCloudMlV1Version);
     });
   });
@@ -4540,7 +4669,9 @@
   unittest.group('obj-schema-GoogleCloudMlV1XraiAttribution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudMlV1XraiAttribution();
-      var od = api.GoogleCloudMlV1XraiAttribution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudMlV1XraiAttribution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudMlV1XraiAttribution(
           od as api.GoogleCloudMlV1XraiAttribution);
     });
@@ -4549,7 +4680,9 @@
   unittest.group('obj-schema-GoogleIamV1AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1AuditConfig();
-      var od = api.GoogleIamV1AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1AuditConfig(od as api.GoogleIamV1AuditConfig);
     });
   });
@@ -4557,7 +4690,9 @@
   unittest.group('obj-schema-GoogleIamV1AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1AuditLogConfig();
-      var od = api.GoogleIamV1AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1AuditLogConfig(od as api.GoogleIamV1AuditLogConfig);
     });
   });
@@ -4565,7 +4700,9 @@
   unittest.group('obj-schema-GoogleIamV1Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1Binding();
-      var od = api.GoogleIamV1Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1Binding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1Binding(od as api.GoogleIamV1Binding);
     });
   });
@@ -4573,7 +4710,9 @@
   unittest.group('obj-schema-GoogleIamV1Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1Policy();
-      var od = api.GoogleIamV1Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1Policy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1Policy(od as api.GoogleIamV1Policy);
     });
   });
@@ -4581,7 +4720,9 @@
   unittest.group('obj-schema-GoogleIamV1SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1SetIamPolicyRequest();
-      var od = api.GoogleIamV1SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1SetIamPolicyRequest(
           od as api.GoogleIamV1SetIamPolicyRequest);
     });
@@ -4590,7 +4731,9 @@
   unittest.group('obj-schema-GoogleIamV1TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1TestIamPermissionsRequest();
-      var od = api.GoogleIamV1TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1TestIamPermissionsRequest(
           od as api.GoogleIamV1TestIamPermissionsRequest);
     });
@@ -4599,7 +4742,9 @@
   unittest.group('obj-schema-GoogleIamV1TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1TestIamPermissionsResponse();
-      var od = api.GoogleIamV1TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1TestIamPermissionsResponse(
           od as api.GoogleIamV1TestIamPermissionsResponse);
     });
@@ -4608,7 +4753,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -4617,7 +4764,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -4625,7 +4774,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -4633,7 +4784,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
@@ -4641,7 +4794,9 @@
   unittest.group('obj-schema-GoogleTypeExpr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeExpr();
-      var od = api.GoogleTypeExpr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeExpr.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeExpr(od as api.GoogleTypeExpr);
     });
   });
diff --git a/generated/googleapis/test/monitoring/v3_test.dart b/generated/googleapis/test/monitoring/v3_test.dart
index 23ef24f..2b282d6 100644
--- a/generated/googleapis/test/monitoring/v3_test.dart
+++ b/generated/googleapis/test/monitoring/v3_test.dart
@@ -4170,7 +4170,9 @@
   unittest.group('obj-schema-Aggregation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAggregation();
-      var od = api.Aggregation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Aggregation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAggregation(od as api.Aggregation);
     });
   });
@@ -4178,7 +4180,9 @@
   unittest.group('obj-schema-AlertPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAlertPolicy();
-      var od = api.AlertPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AlertPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAlertPolicy(od as api.AlertPolicy);
     });
   });
@@ -4186,7 +4190,9 @@
   unittest.group('obj-schema-AppEngine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppEngine();
-      var od = api.AppEngine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AppEngine.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAppEngine(od as api.AppEngine);
     });
   });
@@ -4194,7 +4200,9 @@
   unittest.group('obj-schema-AvailabilityCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAvailabilityCriteria();
-      var od = api.AvailabilityCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AvailabilityCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAvailabilityCriteria(od as api.AvailabilityCriteria);
     });
   });
@@ -4202,7 +4210,9 @@
   unittest.group('obj-schema-BasicAuthentication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicAuthentication();
-      var od = api.BasicAuthentication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicAuthentication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicAuthentication(od as api.BasicAuthentication);
     });
   });
@@ -4210,7 +4220,9 @@
   unittest.group('obj-schema-BasicSli', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicSli();
-      var od = api.BasicSli.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BasicSli.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBasicSli(od as api.BasicSli);
     });
   });
@@ -4218,7 +4230,9 @@
   unittest.group('obj-schema-BucketOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketOptions();
-      var od = api.BucketOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketOptions(od as api.BucketOptions);
     });
   });
@@ -4226,7 +4240,9 @@
   unittest.group('obj-schema-CloudEndpoints', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudEndpoints();
-      var od = api.CloudEndpoints.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudEndpoints.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudEndpoints(od as api.CloudEndpoints);
     });
   });
@@ -4234,7 +4250,9 @@
   unittest.group('obj-schema-ClusterIstio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClusterIstio();
-      var od = api.ClusterIstio.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClusterIstio.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClusterIstio(od as api.ClusterIstio);
     });
   });
@@ -4242,7 +4260,9 @@
   unittest.group('obj-schema-CollectdPayload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCollectdPayload();
-      var od = api.CollectdPayload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CollectdPayload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCollectdPayload(od as api.CollectdPayload);
     });
   });
@@ -4250,7 +4270,9 @@
   unittest.group('obj-schema-CollectdPayloadError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCollectdPayloadError();
-      var od = api.CollectdPayloadError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CollectdPayloadError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCollectdPayloadError(od as api.CollectdPayloadError);
     });
   });
@@ -4258,7 +4280,9 @@
   unittest.group('obj-schema-CollectdValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCollectdValue();
-      var od = api.CollectdValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CollectdValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCollectdValue(od as api.CollectdValue);
     });
   });
@@ -4266,7 +4290,9 @@
   unittest.group('obj-schema-CollectdValueError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCollectdValueError();
-      var od = api.CollectdValueError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CollectdValueError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCollectdValueError(od as api.CollectdValueError);
     });
   });
@@ -4274,7 +4300,9 @@
   unittest.group('obj-schema-Condition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCondition();
-      var od = api.Condition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Condition.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCondition(od as api.Condition);
     });
   });
@@ -4282,7 +4310,9 @@
   unittest.group('obj-schema-ContentMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContentMatcher();
-      var od = api.ContentMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContentMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContentMatcher(od as api.ContentMatcher);
     });
   });
@@ -4290,7 +4320,9 @@
   unittest.group('obj-schema-CreateCollectdTimeSeriesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateCollectdTimeSeriesRequest();
-      var od = api.CreateCollectdTimeSeriesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateCollectdTimeSeriesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateCollectdTimeSeriesRequest(
           od as api.CreateCollectdTimeSeriesRequest);
     });
@@ -4299,7 +4331,9 @@
   unittest.group('obj-schema-CreateCollectdTimeSeriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateCollectdTimeSeriesResponse();
-      var od = api.CreateCollectdTimeSeriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateCollectdTimeSeriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateCollectdTimeSeriesResponse(
           od as api.CreateCollectdTimeSeriesResponse);
     });
@@ -4308,7 +4342,9 @@
   unittest.group('obj-schema-CreateTimeSeriesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTimeSeriesRequest();
-      var od = api.CreateTimeSeriesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTimeSeriesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTimeSeriesRequest(od as api.CreateTimeSeriesRequest);
     });
   });
@@ -4316,7 +4352,9 @@
   unittest.group('obj-schema-CreateTimeSeriesSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTimeSeriesSummary();
-      var od = api.CreateTimeSeriesSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTimeSeriesSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTimeSeriesSummary(od as api.CreateTimeSeriesSummary);
     });
   });
@@ -4324,7 +4362,9 @@
   unittest.group('obj-schema-Custom', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustom();
-      var od = api.Custom.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Custom.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCustom(od as api.Custom);
     });
   });
@@ -4332,7 +4372,9 @@
   unittest.group('obj-schema-Distribution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDistribution();
-      var od = api.Distribution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Distribution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDistribution(od as api.Distribution);
     });
   });
@@ -4340,7 +4382,9 @@
   unittest.group('obj-schema-DistributionCut', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDistributionCut();
-      var od = api.DistributionCut.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DistributionCut.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDistributionCut(od as api.DistributionCut);
     });
   });
@@ -4348,7 +4392,9 @@
   unittest.group('obj-schema-Documentation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentation();
-      var od = api.Documentation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Documentation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentation(od as api.Documentation);
     });
   });
@@ -4356,7 +4402,9 @@
   unittest.group('obj-schema-DroppedLabels', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDroppedLabels();
-      var od = api.DroppedLabels.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DroppedLabels.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDroppedLabels(od as api.DroppedLabels);
     });
   });
@@ -4364,7 +4412,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -4372,7 +4421,8 @@
   unittest.group('obj-schema-Error', () {
     unittest.test('to-json--from-json', () async {
       var o = buildError();
-      var od = api.Error.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Error.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkError(od as api.Error);
     });
   });
@@ -4380,7 +4430,9 @@
   unittest.group('obj-schema-Exemplar', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExemplar();
-      var od = api.Exemplar.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Exemplar.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExemplar(od as api.Exemplar);
     });
   });
@@ -4388,7 +4440,9 @@
   unittest.group('obj-schema-Explicit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExplicit();
-      var od = api.Explicit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Explicit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExplicit(od as api.Explicit);
     });
   });
@@ -4396,7 +4450,9 @@
   unittest.group('obj-schema-Exponential', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExponential();
-      var od = api.Exponential.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Exponential.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExponential(od as api.Exponential);
     });
   });
@@ -4404,7 +4460,8 @@
   unittest.group('obj-schema-Field', () {
     unittest.test('to-json--from-json', () async {
       var o = buildField();
-      var od = api.Field.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Field.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkField(od as api.Field);
     });
   });
@@ -4413,8 +4470,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetNotificationChannelVerificationCodeRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GetNotificationChannelVerificationCodeRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetNotificationChannelVerificationCodeRequest(
           od as api.GetNotificationChannelVerificationCodeRequest);
     });
@@ -4424,8 +4482,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetNotificationChannelVerificationCodeResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GetNotificationChannelVerificationCodeResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetNotificationChannelVerificationCodeResponse(
           od as api.GetNotificationChannelVerificationCodeResponse);
     });
@@ -4434,7 +4493,9 @@
   unittest.group('obj-schema-GoogleMonitoringV3Range', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMonitoringV3Range();
-      var od = api.GoogleMonitoringV3Range.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleMonitoringV3Range.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMonitoringV3Range(od as api.GoogleMonitoringV3Range);
     });
   });
@@ -4442,7 +4503,8 @@
   unittest.group('obj-schema-Group', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroup();
-      var od = api.Group.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Group.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGroup(od as api.Group);
     });
   });
@@ -4450,7 +4512,9 @@
   unittest.group('obj-schema-HttpCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpCheck();
-      var od = api.HttpCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpCheck.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpCheck(od as api.HttpCheck);
     });
   });
@@ -4458,7 +4522,9 @@
   unittest.group('obj-schema-InternalChecker', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInternalChecker();
-      var od = api.InternalChecker.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InternalChecker.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInternalChecker(od as api.InternalChecker);
     });
   });
@@ -4466,7 +4532,9 @@
   unittest.group('obj-schema-IstioCanonicalService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIstioCanonicalService();
-      var od = api.IstioCanonicalService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IstioCanonicalService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIstioCanonicalService(od as api.IstioCanonicalService);
     });
   });
@@ -4474,7 +4542,9 @@
   unittest.group('obj-schema-LabelDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabelDescriptor();
-      var od = api.LabelDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LabelDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
@@ -4482,7 +4552,9 @@
   unittest.group('obj-schema-LabelValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabelValue();
-      var od = api.LabelValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LabelValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLabelValue(od as api.LabelValue);
     });
   });
@@ -4490,7 +4562,9 @@
   unittest.group('obj-schema-LatencyCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLatencyCriteria();
-      var od = api.LatencyCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LatencyCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLatencyCriteria(od as api.LatencyCriteria);
     });
   });
@@ -4498,7 +4572,9 @@
   unittest.group('obj-schema-Linear', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinear();
-      var od = api.Linear.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Linear.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLinear(od as api.Linear);
     });
   });
@@ -4506,7 +4582,9 @@
   unittest.group('obj-schema-ListAlertPoliciesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAlertPoliciesResponse();
-      var od = api.ListAlertPoliciesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAlertPoliciesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAlertPoliciesResponse(od as api.ListAlertPoliciesResponse);
     });
   });
@@ -4514,7 +4592,9 @@
   unittest.group('obj-schema-ListGroupMembersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGroupMembersResponse();
-      var od = api.ListGroupMembersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGroupMembersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGroupMembersResponse(od as api.ListGroupMembersResponse);
     });
   });
@@ -4522,7 +4602,9 @@
   unittest.group('obj-schema-ListGroupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGroupsResponse();
-      var od = api.ListGroupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGroupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGroupsResponse(od as api.ListGroupsResponse);
     });
   });
@@ -4530,7 +4612,9 @@
   unittest.group('obj-schema-ListMetricDescriptorsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMetricDescriptorsResponse();
-      var od = api.ListMetricDescriptorsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMetricDescriptorsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMetricDescriptorsResponse(
           od as api.ListMetricDescriptorsResponse);
     });
@@ -4539,8 +4623,9 @@
   unittest.group('obj-schema-ListMonitoredResourceDescriptorsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMonitoredResourceDescriptorsResponse();
-      var od =
-          api.ListMonitoredResourceDescriptorsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMonitoredResourceDescriptorsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMonitoredResourceDescriptorsResponse(
           od as api.ListMonitoredResourceDescriptorsResponse);
     });
@@ -4549,8 +4634,9 @@
   unittest.group('obj-schema-ListNotificationChannelDescriptorsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNotificationChannelDescriptorsResponse();
-      var od =
-          api.ListNotificationChannelDescriptorsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNotificationChannelDescriptorsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNotificationChannelDescriptorsResponse(
           od as api.ListNotificationChannelDescriptorsResponse);
     });
@@ -4559,7 +4645,9 @@
   unittest.group('obj-schema-ListNotificationChannelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNotificationChannelsResponse();
-      var od = api.ListNotificationChannelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNotificationChannelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNotificationChannelsResponse(
           od as api.ListNotificationChannelsResponse);
     });
@@ -4568,7 +4656,9 @@
   unittest.group('obj-schema-ListServiceLevelObjectivesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServiceLevelObjectivesResponse();
-      var od = api.ListServiceLevelObjectivesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServiceLevelObjectivesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServiceLevelObjectivesResponse(
           od as api.ListServiceLevelObjectivesResponse);
     });
@@ -4577,7 +4667,9 @@
   unittest.group('obj-schema-ListServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServicesResponse();
-      var od = api.ListServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
@@ -4585,7 +4677,9 @@
   unittest.group('obj-schema-ListTimeSeriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTimeSeriesResponse();
-      var od = api.ListTimeSeriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTimeSeriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTimeSeriesResponse(od as api.ListTimeSeriesResponse);
     });
   });
@@ -4593,7 +4687,9 @@
   unittest.group('obj-schema-ListUptimeCheckConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListUptimeCheckConfigsResponse();
-      var od = api.ListUptimeCheckConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListUptimeCheckConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListUptimeCheckConfigsResponse(
           od as api.ListUptimeCheckConfigsResponse);
     });
@@ -4602,7 +4698,9 @@
   unittest.group('obj-schema-ListUptimeCheckIpsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListUptimeCheckIpsResponse();
-      var od = api.ListUptimeCheckIpsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListUptimeCheckIpsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListUptimeCheckIpsResponse(od as api.ListUptimeCheckIpsResponse);
     });
   });
@@ -4610,7 +4708,9 @@
   unittest.group('obj-schema-MeshIstio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMeshIstio();
-      var od = api.MeshIstio.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MeshIstio.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMeshIstio(od as api.MeshIstio);
     });
   });
@@ -4618,7 +4718,9 @@
   unittest.group('obj-schema-Metric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetric();
-      var od = api.Metric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metric.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetric(od as api.Metric);
     });
   });
@@ -4626,7 +4728,9 @@
   unittest.group('obj-schema-MetricAbsence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricAbsence();
-      var od = api.MetricAbsence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricAbsence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricAbsence(od as api.MetricAbsence);
     });
   });
@@ -4634,7 +4738,9 @@
   unittest.group('obj-schema-MetricDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptor();
-      var od = api.MetricDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
@@ -4642,7 +4748,9 @@
   unittest.group('obj-schema-MetricDescriptorMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptorMetadata();
-      var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptorMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
@@ -4650,7 +4758,9 @@
   unittest.group('obj-schema-MetricRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricRange();
-      var od = api.MetricRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricRange(od as api.MetricRange);
     });
   });
@@ -4658,7 +4768,9 @@
   unittest.group('obj-schema-MetricThreshold', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricThreshold();
-      var od = api.MetricThreshold.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricThreshold.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricThreshold(od as api.MetricThreshold);
     });
   });
@@ -4666,7 +4778,9 @@
   unittest.group('obj-schema-MonitoredResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoredResource();
-      var od = api.MonitoredResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoredResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoredResource(od as api.MonitoredResource);
     });
   });
@@ -4674,7 +4788,9 @@
   unittest.group('obj-schema-MonitoredResourceDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoredResourceDescriptor();
-      var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoredResourceDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
@@ -4682,7 +4798,9 @@
   unittest.group('obj-schema-MonitoredResourceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoredResourceMetadata();
-      var od = api.MonitoredResourceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoredResourceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoredResourceMetadata(od as api.MonitoredResourceMetadata);
     });
   });
@@ -4690,7 +4808,9 @@
   unittest.group('obj-schema-MonitoringQueryLanguageCondition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoringQueryLanguageCondition();
-      var od = api.MonitoringQueryLanguageCondition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoringQueryLanguageCondition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoringQueryLanguageCondition(
           od as api.MonitoringQueryLanguageCondition);
     });
@@ -4699,7 +4819,9 @@
   unittest.group('obj-schema-MutationRecord', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMutationRecord();
-      var od = api.MutationRecord.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MutationRecord.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMutationRecord(od as api.MutationRecord);
     });
   });
@@ -4707,7 +4829,9 @@
   unittest.group('obj-schema-NotificationChannel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationChannel();
-      var od = api.NotificationChannel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationChannel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationChannel(od as api.NotificationChannel);
     });
   });
@@ -4715,7 +4839,9 @@
   unittest.group('obj-schema-NotificationChannelDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationChannelDescriptor();
-      var od = api.NotificationChannelDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationChannelDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationChannelDescriptor(
           od as api.NotificationChannelDescriptor);
     });
@@ -4724,7 +4850,9 @@
   unittest.group('obj-schema-Option', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOption();
-      var od = api.Option.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Option.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOption(od as api.Option);
     });
   });
@@ -4732,7 +4860,9 @@
   unittest.group('obj-schema-PerformanceThreshold', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerformanceThreshold();
-      var od = api.PerformanceThreshold.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerformanceThreshold.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerformanceThreshold(od as api.PerformanceThreshold);
     });
   });
@@ -4740,7 +4870,8 @@
   unittest.group('obj-schema-Point', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPoint();
-      var od = api.Point.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Point.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPoint(od as api.Point);
     });
   });
@@ -4748,7 +4879,9 @@
   unittest.group('obj-schema-PointData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPointData();
-      var od = api.PointData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PointData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPointData(od as api.PointData);
     });
   });
@@ -4756,7 +4889,9 @@
   unittest.group('obj-schema-QueryTimeSeriesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryTimeSeriesRequest();
-      var od = api.QueryTimeSeriesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryTimeSeriesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryTimeSeriesRequest(od as api.QueryTimeSeriesRequest);
     });
   });
@@ -4764,7 +4899,9 @@
   unittest.group('obj-schema-QueryTimeSeriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryTimeSeriesResponse();
-      var od = api.QueryTimeSeriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryTimeSeriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryTimeSeriesResponse(od as api.QueryTimeSeriesResponse);
     });
   });
@@ -4772,7 +4909,8 @@
   unittest.group('obj-schema-Range', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRange();
-      var od = api.Range.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Range.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRange(od as api.Range);
     });
   });
@@ -4780,7 +4918,9 @@
   unittest.group('obj-schema-RequestBasedSli', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestBasedSli();
-      var od = api.RequestBasedSli.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestBasedSli.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestBasedSli(od as api.RequestBasedSli);
     });
   });
@@ -4788,7 +4928,9 @@
   unittest.group('obj-schema-ResourceGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceGroup();
-      var od = api.ResourceGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceGroup(od as api.ResourceGroup);
     });
   });
@@ -4797,8 +4939,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildSendNotificationChannelVerificationCodeRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.SendNotificationChannelVerificationCodeRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkSendNotificationChannelVerificationCodeRequest(
           od as api.SendNotificationChannelVerificationCodeRequest);
     });
@@ -4807,7 +4950,9 @@
   unittest.group('obj-schema-Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildService();
-      var od = api.Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Service.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkService(od as api.Service);
     });
   });
@@ -4815,7 +4960,9 @@
   unittest.group('obj-schema-ServiceLevelIndicator', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceLevelIndicator();
-      var od = api.ServiceLevelIndicator.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceLevelIndicator.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceLevelIndicator(od as api.ServiceLevelIndicator);
     });
   });
@@ -4823,7 +4970,9 @@
   unittest.group('obj-schema-ServiceLevelObjective', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceLevelObjective();
-      var od = api.ServiceLevelObjective.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceLevelObjective.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceLevelObjective(od as api.ServiceLevelObjective);
     });
   });
@@ -4831,7 +4980,9 @@
   unittest.group('obj-schema-SourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceContext();
-      var od = api.SourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceContext(od as api.SourceContext);
     });
   });
@@ -4839,7 +4990,9 @@
   unittest.group('obj-schema-SpanContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpanContext();
-      var od = api.SpanContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpanContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpanContext(od as api.SpanContext);
     });
   });
@@ -4847,7 +5000,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4855,7 +5010,9 @@
   unittest.group('obj-schema-TcpCheck', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTcpCheck();
-      var od = api.TcpCheck.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TcpCheck.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTcpCheck(od as api.TcpCheck);
     });
   });
@@ -4863,7 +5020,9 @@
   unittest.group('obj-schema-Telemetry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTelemetry();
-      var od = api.Telemetry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Telemetry.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTelemetry(od as api.Telemetry);
     });
   });
@@ -4871,7 +5030,9 @@
   unittest.group('obj-schema-TimeInterval', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeInterval();
-      var od = api.TimeInterval.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimeInterval.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimeInterval(od as api.TimeInterval);
     });
   });
@@ -4879,7 +5040,9 @@
   unittest.group('obj-schema-TimeSeries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeSeries();
-      var od = api.TimeSeries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeSeries.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeSeries(od as api.TimeSeries);
     });
   });
@@ -4887,7 +5050,9 @@
   unittest.group('obj-schema-TimeSeriesData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeSeriesData();
-      var od = api.TimeSeriesData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimeSeriesData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimeSeriesData(od as api.TimeSeriesData);
     });
   });
@@ -4895,7 +5060,9 @@
   unittest.group('obj-schema-TimeSeriesDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeSeriesDescriptor();
-      var od = api.TimeSeriesDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimeSeriesDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimeSeriesDescriptor(od as api.TimeSeriesDescriptor);
     });
   });
@@ -4903,7 +5070,9 @@
   unittest.group('obj-schema-TimeSeriesRatio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeSeriesRatio();
-      var od = api.TimeSeriesRatio.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimeSeriesRatio.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimeSeriesRatio(od as api.TimeSeriesRatio);
     });
   });
@@ -4911,7 +5080,9 @@
   unittest.group('obj-schema-Trigger', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrigger();
-      var od = api.Trigger.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Trigger.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTrigger(od as api.Trigger);
     });
   });
@@ -4919,7 +5090,8 @@
   unittest.group('obj-schema-Type', () {
     unittest.test('to-json--from-json', () async {
       var o = buildType();
-      var od = api.Type.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Type.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkType(od as api.Type);
     });
   });
@@ -4927,7 +5099,9 @@
   unittest.group('obj-schema-TypedValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTypedValue();
-      var od = api.TypedValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TypedValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTypedValue(od as api.TypedValue);
     });
   });
@@ -4935,7 +5109,9 @@
   unittest.group('obj-schema-UptimeCheckConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUptimeCheckConfig();
-      var od = api.UptimeCheckConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UptimeCheckConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUptimeCheckConfig(od as api.UptimeCheckConfig);
     });
   });
@@ -4943,7 +5119,9 @@
   unittest.group('obj-schema-UptimeCheckIp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUptimeCheckIp();
-      var od = api.UptimeCheckIp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UptimeCheckIp.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUptimeCheckIp(od as api.UptimeCheckIp);
     });
   });
@@ -4951,7 +5129,9 @@
   unittest.group('obj-schema-ValueDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValueDescriptor();
-      var od = api.ValueDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValueDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValueDescriptor(od as api.ValueDescriptor);
     });
   });
@@ -4959,7 +5139,9 @@
   unittest.group('obj-schema-VerifyNotificationChannelRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVerifyNotificationChannelRequest();
-      var od = api.VerifyNotificationChannelRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VerifyNotificationChannelRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVerifyNotificationChannelRequest(
           od as api.VerifyNotificationChannelRequest);
     });
@@ -4968,7 +5150,9 @@
   unittest.group('obj-schema-WindowsBasedSli', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWindowsBasedSli();
-      var od = api.WindowsBasedSli.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WindowsBasedSli.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWindowsBasedSli(od as api.WindowsBasedSli);
     });
   });
diff --git a/generated/googleapis/test/mybusinessaccountmanagement/v1_test.dart b/generated/googleapis/test/mybusinessaccountmanagement/v1_test.dart
index 584cef2..6271224 100644
--- a/generated/googleapis/test/mybusinessaccountmanagement/v1_test.dart
+++ b/generated/googleapis/test/mybusinessaccountmanagement/v1_test.dart
@@ -503,7 +503,9 @@
   unittest.group('obj-schema-AcceptInvitationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceptInvitationRequest();
-      var od = api.AcceptInvitationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceptInvitationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceptInvitationRequest(od as api.AcceptInvitationRequest);
     });
   });
@@ -511,7 +513,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -519,7 +523,8 @@
   unittest.group('obj-schema-Admin', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdmin();
-      var od = api.Admin.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Admin.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdmin(od as api.Admin);
     });
   });
@@ -527,7 +532,9 @@
   unittest.group('obj-schema-DeclineInvitationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeclineInvitationRequest();
-      var od = api.DeclineInvitationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeclineInvitationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeclineInvitationRequest(od as api.DeclineInvitationRequest);
     });
   });
@@ -535,7 +542,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -543,7 +551,9 @@
   unittest.group('obj-schema-Invitation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInvitation();
-      var od = api.Invitation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Invitation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInvitation(od as api.Invitation);
     });
   });
@@ -551,7 +561,9 @@
   unittest.group('obj-schema-ListAccountAdminsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAccountAdminsResponse();
-      var od = api.ListAccountAdminsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAccountAdminsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAccountAdminsResponse(od as api.ListAccountAdminsResponse);
     });
   });
@@ -559,7 +571,9 @@
   unittest.group('obj-schema-ListAccountsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAccountsResponse();
-      var od = api.ListAccountsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAccountsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAccountsResponse(od as api.ListAccountsResponse);
     });
   });
@@ -567,7 +581,9 @@
   unittest.group('obj-schema-ListInvitationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInvitationsResponse();
-      var od = api.ListInvitationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInvitationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInvitationsResponse(od as api.ListInvitationsResponse);
     });
   });
@@ -575,7 +591,9 @@
   unittest.group('obj-schema-ListLocationAdminsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationAdminsResponse();
-      var od = api.ListLocationAdminsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationAdminsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationAdminsResponse(od as api.ListLocationAdminsResponse);
     });
   });
@@ -583,7 +601,9 @@
   unittest.group('obj-schema-OrganizationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrganizationInfo();
-      var od = api.OrganizationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrganizationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrganizationInfo(od as api.OrganizationInfo);
     });
   });
@@ -591,7 +611,9 @@
   unittest.group('obj-schema-PostalAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostalAddress();
-      var od = api.PostalAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostalAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostalAddress(od as api.PostalAddress);
     });
   });
@@ -599,7 +621,9 @@
   unittest.group('obj-schema-TargetLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetLocation();
-      var od = api.TargetLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetLocation(od as api.TargetLocation);
     });
   });
diff --git a/generated/googleapis/test/networkmanagement/v1_test.dart b/generated/googleapis/test/networkmanagement/v1_test.dart
index fe18bd2..d5ccca7 100644
--- a/generated/googleapis/test/networkmanagement/v1_test.dart
+++ b/generated/googleapis/test/networkmanagement/v1_test.dart
@@ -1895,7 +1895,9 @@
   unittest.group('obj-schema-AbortInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAbortInfo();
-      var od = api.AbortInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AbortInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAbortInfo(od as api.AbortInfo);
     });
   });
@@ -1903,7 +1905,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1911,7 +1915,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1919,7 +1925,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1927,7 +1935,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -1935,7 +1945,9 @@
   unittest.group('obj-schema-ConnectivityTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConnectivityTest();
-      var od = api.ConnectivityTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConnectivityTest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConnectivityTest(od as api.ConnectivityTest);
     });
   });
@@ -1943,7 +1955,9 @@
   unittest.group('obj-schema-DeliverInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeliverInfo();
-      var od = api.DeliverInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeliverInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeliverInfo(od as api.DeliverInfo);
     });
   });
@@ -1951,7 +1965,9 @@
   unittest.group('obj-schema-DropInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDropInfo();
-      var od = api.DropInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DropInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDropInfo(od as api.DropInfo);
     });
   });
@@ -1959,7 +1975,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1967,7 +1984,9 @@
   unittest.group('obj-schema-Endpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndpoint();
-      var od = api.Endpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Endpoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEndpoint(od as api.Endpoint);
     });
   });
@@ -1975,7 +1994,9 @@
   unittest.group('obj-schema-EndpointInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndpointInfo();
-      var od = api.EndpointInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EndpointInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEndpointInfo(od as api.EndpointInfo);
     });
   });
@@ -1983,7 +2004,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1991,7 +2013,9 @@
   unittest.group('obj-schema-FirewallInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirewallInfo();
-      var od = api.FirewallInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirewallInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirewallInfo(od as api.FirewallInfo);
     });
   });
@@ -1999,7 +2023,9 @@
   unittest.group('obj-schema-ForwardInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardInfo();
-      var od = api.ForwardInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardInfo(od as api.ForwardInfo);
     });
   });
@@ -2007,7 +2033,9 @@
   unittest.group('obj-schema-ForwardingRuleInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForwardingRuleInfo();
-      var od = api.ForwardingRuleInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ForwardingRuleInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkForwardingRuleInfo(od as api.ForwardingRuleInfo);
     });
   });
@@ -2015,7 +2043,9 @@
   unittest.group('obj-schema-InstanceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceInfo();
-      var od = api.InstanceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceInfo(od as api.InstanceInfo);
     });
   });
@@ -2023,7 +2053,9 @@
   unittest.group('obj-schema-ListConnectivityTestsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListConnectivityTestsResponse();
-      var od = api.ListConnectivityTestsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListConnectivityTestsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListConnectivityTestsResponse(
           od as api.ListConnectivityTestsResponse);
     });
@@ -2032,7 +2064,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -2040,7 +2074,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -2048,7 +2084,9 @@
   unittest.group('obj-schema-LoadBalancerBackend', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLoadBalancerBackend();
-      var od = api.LoadBalancerBackend.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LoadBalancerBackend.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLoadBalancerBackend(od as api.LoadBalancerBackend);
     });
   });
@@ -2056,7 +2094,9 @@
   unittest.group('obj-schema-LoadBalancerInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLoadBalancerInfo();
-      var od = api.LoadBalancerInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LoadBalancerInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLoadBalancerInfo(od as api.LoadBalancerInfo);
     });
   });
@@ -2064,7 +2104,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2072,7 +2114,9 @@
   unittest.group('obj-schema-NetworkInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkInfo();
-      var od = api.NetworkInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkInfo(od as api.NetworkInfo);
     });
   });
@@ -2080,7 +2124,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2088,7 +2134,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -2096,7 +2144,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2104,7 +2154,9 @@
   unittest.group('obj-schema-ReachabilityDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReachabilityDetails();
-      var od = api.ReachabilityDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReachabilityDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReachabilityDetails(od as api.ReachabilityDetails);
     });
   });
@@ -2112,7 +2164,9 @@
   unittest.group('obj-schema-RerunConnectivityTestRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRerunConnectivityTestRequest();
-      var od = api.RerunConnectivityTestRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RerunConnectivityTestRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRerunConnectivityTestRequest(od as api.RerunConnectivityTestRequest);
     });
   });
@@ -2120,7 +2174,9 @@
   unittest.group('obj-schema-RouteInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouteInfo();
-      var od = api.RouteInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RouteInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRouteInfo(od as api.RouteInfo);
     });
   });
@@ -2128,7 +2184,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -2136,7 +2194,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2144,7 +2204,8 @@
   unittest.group('obj-schema-Step', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStep();
-      var od = api.Step.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Step.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStep(od as api.Step);
     });
   });
@@ -2152,7 +2213,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2160,7 +2223,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -2168,7 +2233,8 @@
   unittest.group('obj-schema-Trace', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrace();
-      var od = api.Trace.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Trace.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTrace(od as api.Trace);
     });
   });
@@ -2176,7 +2242,9 @@
   unittest.group('obj-schema-VpnGatewayInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnGatewayInfo();
-      var od = api.VpnGatewayInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnGatewayInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnGatewayInfo(od as api.VpnGatewayInfo);
     });
   });
@@ -2184,7 +2252,9 @@
   unittest.group('obj-schema-VpnTunnelInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpnTunnelInfo();
-      var od = api.VpnTunnelInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpnTunnelInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpnTunnelInfo(od as api.VpnTunnelInfo);
     });
   });
diff --git a/generated/googleapis/test/notebooks/v1_test.dart b/generated/googleapis/test/notebooks/v1_test.dart
index b901471..3141a64 100644
--- a/generated/googleapis/test/notebooks/v1_test.dart
+++ b/generated/googleapis/test/notebooks/v1_test.dart
@@ -2077,7 +2077,9 @@
   unittest.group('obj-schema-AcceleratorConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorConfig();
-      var od = api.AcceleratorConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorConfig(od as api.AcceleratorConfig);
     });
   });
@@ -2085,7 +2087,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -2093,7 +2097,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -2101,7 +2107,9 @@
   unittest.group('obj-schema-ContainerImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerImage();
-      var od = api.ContainerImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerImage(od as api.ContainerImage);
     });
   });
@@ -2109,7 +2117,8 @@
   unittest.group('obj-schema-Disk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisk();
-      var od = api.Disk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Disk.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDisk(od as api.Disk);
     });
   });
@@ -2117,7 +2126,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2125,7 +2135,9 @@
   unittest.group('obj-schema-Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironment();
-      var od = api.Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironment(od as api.Environment);
     });
   });
@@ -2133,7 +2145,9 @@
   unittest.group('obj-schema-Execution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecution();
-      var od = api.Execution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Execution.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExecution(od as api.Execution);
     });
   });
@@ -2141,7 +2155,9 @@
   unittest.group('obj-schema-ExecutionTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecutionTemplate();
-      var od = api.ExecutionTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecutionTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecutionTemplate(od as api.ExecutionTemplate);
     });
   });
@@ -2149,7 +2165,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -2157,7 +2174,9 @@
   unittest.group('obj-schema-GetInstanceHealthResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetInstanceHealthResponse();
-      var od = api.GetInstanceHealthResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetInstanceHealthResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetInstanceHealthResponse(od as api.GetInstanceHealthResponse);
     });
   });
@@ -2165,7 +2184,9 @@
   unittest.group('obj-schema-GuestOsFeature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGuestOsFeature();
-      var od = api.GuestOsFeature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GuestOsFeature.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGuestOsFeature(od as api.GuestOsFeature);
     });
   });
@@ -2173,7 +2194,9 @@
   unittest.group('obj-schema-Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstance();
-      var od = api.Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Instance.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstance(od as api.Instance);
     });
   });
@@ -2181,7 +2204,9 @@
   unittest.group('obj-schema-IsInstanceUpgradeableResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIsInstanceUpgradeableResponse();
-      var od = api.IsInstanceUpgradeableResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IsInstanceUpgradeableResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIsInstanceUpgradeableResponse(
           od as api.IsInstanceUpgradeableResponse);
     });
@@ -2190,7 +2215,9 @@
   unittest.group('obj-schema-ListEnvironmentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListEnvironmentsResponse();
-      var od = api.ListEnvironmentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListEnvironmentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListEnvironmentsResponse(od as api.ListEnvironmentsResponse);
     });
   });
@@ -2198,7 +2225,9 @@
   unittest.group('obj-schema-ListExecutionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListExecutionsResponse();
-      var od = api.ListExecutionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListExecutionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListExecutionsResponse(od as api.ListExecutionsResponse);
     });
   });
@@ -2206,7 +2235,9 @@
   unittest.group('obj-schema-ListInstancesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInstancesResponse();
-      var od = api.ListInstancesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInstancesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
@@ -2214,7 +2245,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -2222,7 +2255,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -2230,7 +2265,9 @@
   unittest.group('obj-schema-ListSchedulesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSchedulesResponse();
-      var od = api.ListSchedulesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSchedulesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSchedulesResponse(od as api.ListSchedulesResponse);
     });
   });
@@ -2238,7 +2275,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2246,7 +2285,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2254,7 +2295,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -2262,7 +2305,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2270,7 +2315,9 @@
   unittest.group('obj-schema-RegisterInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegisterInstanceRequest();
-      var od = api.RegisterInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegisterInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegisterInstanceRequest(od as api.RegisterInstanceRequest);
     });
   });
@@ -2278,7 +2325,9 @@
   unittest.group('obj-schema-ReportInstanceInfoRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportInstanceInfoRequest();
-      var od = api.ReportInstanceInfoRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportInstanceInfoRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportInstanceInfoRequest(od as api.ReportInstanceInfoRequest);
     });
   });
@@ -2286,7 +2335,9 @@
   unittest.group('obj-schema-ResetInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResetInstanceRequest();
-      var od = api.ResetInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResetInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResetInstanceRequest(od as api.ResetInstanceRequest);
     });
   });
@@ -2294,7 +2345,9 @@
   unittest.group('obj-schema-Schedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchedule();
-      var od = api.Schedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schedule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchedule(od as api.Schedule);
     });
   });
@@ -2302,7 +2355,9 @@
   unittest.group('obj-schema-SchedulerAcceleratorConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchedulerAcceleratorConfig();
-      var od = api.SchedulerAcceleratorConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SchedulerAcceleratorConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSchedulerAcceleratorConfig(od as api.SchedulerAcceleratorConfig);
     });
   });
@@ -2310,7 +2365,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -2318,7 +2375,9 @@
   unittest.group('obj-schema-SetInstanceAcceleratorRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetInstanceAcceleratorRequest();
-      var od = api.SetInstanceAcceleratorRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetInstanceAcceleratorRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetInstanceAcceleratorRequest(
           od as api.SetInstanceAcceleratorRequest);
     });
@@ -2327,7 +2386,9 @@
   unittest.group('obj-schema-SetInstanceLabelsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetInstanceLabelsRequest();
-      var od = api.SetInstanceLabelsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetInstanceLabelsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetInstanceLabelsRequest(od as api.SetInstanceLabelsRequest);
     });
   });
@@ -2335,7 +2396,9 @@
   unittest.group('obj-schema-SetInstanceMachineTypeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetInstanceMachineTypeRequest();
-      var od = api.SetInstanceMachineTypeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetInstanceMachineTypeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetInstanceMachineTypeRequest(
           od as api.SetInstanceMachineTypeRequest);
     });
@@ -2344,7 +2407,9 @@
   unittest.group('obj-schema-ShieldedInstanceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShieldedInstanceConfig();
-      var od = api.ShieldedInstanceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShieldedInstanceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShieldedInstanceConfig(od as api.ShieldedInstanceConfig);
     });
   });
@@ -2352,7 +2417,9 @@
   unittest.group('obj-schema-StartInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartInstanceRequest();
-      var od = api.StartInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartInstanceRequest(od as api.StartInstanceRequest);
     });
   });
@@ -2360,7 +2427,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2368,7 +2437,9 @@
   unittest.group('obj-schema-StopInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStopInstanceRequest();
-      var od = api.StopInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StopInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStopInstanceRequest(od as api.StopInstanceRequest);
     });
   });
@@ -2376,7 +2447,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2384,7 +2457,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -2392,7 +2467,9 @@
   unittest.group('obj-schema-TriggerScheduleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTriggerScheduleRequest();
-      var od = api.TriggerScheduleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TriggerScheduleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTriggerScheduleRequest(od as api.TriggerScheduleRequest);
     });
   });
@@ -2400,7 +2477,9 @@
   unittest.group('obj-schema-UpgradeHistoryEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpgradeHistoryEntry();
-      var od = api.UpgradeHistoryEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpgradeHistoryEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpgradeHistoryEntry(od as api.UpgradeHistoryEntry);
     });
   });
@@ -2408,7 +2487,9 @@
   unittest.group('obj-schema-UpgradeInstanceInternalRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpgradeInstanceInternalRequest();
-      var od = api.UpgradeInstanceInternalRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpgradeInstanceInternalRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpgradeInstanceInternalRequest(
           od as api.UpgradeInstanceInternalRequest);
     });
@@ -2417,7 +2498,9 @@
   unittest.group('obj-schema-UpgradeInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpgradeInstanceRequest();
-      var od = api.UpgradeInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpgradeInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpgradeInstanceRequest(od as api.UpgradeInstanceRequest);
     });
   });
@@ -2425,7 +2508,9 @@
   unittest.group('obj-schema-VmImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVmImage();
-      var od = api.VmImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.VmImage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVmImage(od as api.VmImage);
     });
   });
diff --git a/generated/googleapis/test/oauth2/v2_test.dart b/generated/googleapis/test/oauth2/v2_test.dart
index dc06006..93f16ab 100644
--- a/generated/googleapis/test/oauth2/v2_test.dart
+++ b/generated/googleapis/test/oauth2/v2_test.dart
@@ -149,7 +149,9 @@
   unittest.group('obj-schema-Tokeninfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTokeninfo();
-      var od = api.Tokeninfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Tokeninfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTokeninfo(od as api.Tokeninfo);
     });
   });
@@ -157,7 +159,9 @@
   unittest.group('obj-schema-Userinfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserinfo();
-      var od = api.Userinfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Userinfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserinfo(od as api.Userinfo);
     });
   });
diff --git a/generated/googleapis/test/osconfig/v1_test.dart b/generated/googleapis/test/osconfig/v1_test.dart
index 39d2e03..ef1bee7 100644
--- a/generated/googleapis/test/osconfig/v1_test.dart
+++ b/generated/googleapis/test/osconfig/v1_test.dart
@@ -1768,7 +1768,9 @@
   unittest.group('obj-schema-AptSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAptSettings();
-      var od = api.AptSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AptSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAptSettings(od as api.AptSettings);
     });
   });
@@ -1776,7 +1778,9 @@
   unittest.group('obj-schema-CancelPatchJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelPatchJobRequest();
-      var od = api.CancelPatchJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelPatchJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelPatchJobRequest(od as api.CancelPatchJobRequest);
     });
   });
@@ -1784,7 +1788,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1792,7 +1797,9 @@
   unittest.group('obj-schema-ExecStep', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecStep();
-      var od = api.ExecStep.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ExecStep.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExecStep(od as api.ExecStep);
     });
   });
@@ -1800,7 +1807,9 @@
   unittest.group('obj-schema-ExecStepConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecStepConfig();
-      var od = api.ExecStepConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecStepConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecStepConfig(od as api.ExecStepConfig);
     });
   });
@@ -1808,7 +1817,9 @@
   unittest.group('obj-schema-ExecutePatchJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecutePatchJobRequest();
-      var od = api.ExecutePatchJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecutePatchJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecutePatchJobRequest(od as api.ExecutePatchJobRequest);
     });
   });
@@ -1816,7 +1827,9 @@
   unittest.group('obj-schema-FixedOrPercent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFixedOrPercent();
-      var od = api.FixedOrPercent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FixedOrPercent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFixedOrPercent(od as api.FixedOrPercent);
     });
   });
@@ -1824,7 +1837,9 @@
   unittest.group('obj-schema-GcsObject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcsObject();
-      var od = api.GcsObject.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GcsObject.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGcsObject(od as api.GcsObject);
     });
   });
@@ -1832,7 +1847,9 @@
   unittest.group('obj-schema-GooSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGooSettings();
-      var od = api.GooSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GooSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGooSettings(od as api.GooSettings);
     });
   });
@@ -1840,7 +1857,9 @@
   unittest.group('obj-schema-Inventory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventory();
-      var od = api.Inventory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Inventory.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInventory(od as api.Inventory);
     });
   });
@@ -1848,7 +1867,9 @@
   unittest.group('obj-schema-InventoryItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventoryItem();
-      var od = api.InventoryItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventoryItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventoryItem(od as api.InventoryItem);
     });
   });
@@ -1856,7 +1877,9 @@
   unittest.group('obj-schema-InventoryOsInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventoryOsInfo();
-      var od = api.InventoryOsInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventoryOsInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventoryOsInfo(od as api.InventoryOsInfo);
     });
   });
@@ -1864,7 +1887,9 @@
   unittest.group('obj-schema-InventorySoftwarePackage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventorySoftwarePackage();
-      var od = api.InventorySoftwarePackage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventorySoftwarePackage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventorySoftwarePackage(od as api.InventorySoftwarePackage);
     });
   });
@@ -1872,7 +1897,9 @@
   unittest.group('obj-schema-InventoryVersionedPackage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventoryVersionedPackage();
-      var od = api.InventoryVersionedPackage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventoryVersionedPackage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventoryVersionedPackage(od as api.InventoryVersionedPackage);
     });
   });
@@ -1880,8 +1907,9 @@
   unittest.group('obj-schema-InventoryWindowsQuickFixEngineeringPackage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventoryWindowsQuickFixEngineeringPackage();
-      var od =
-          api.InventoryWindowsQuickFixEngineeringPackage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventoryWindowsQuickFixEngineeringPackage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventoryWindowsQuickFixEngineeringPackage(
           od as api.InventoryWindowsQuickFixEngineeringPackage);
     });
@@ -1890,7 +1918,9 @@
   unittest.group('obj-schema-InventoryWindowsUpdatePackage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventoryWindowsUpdatePackage();
-      var od = api.InventoryWindowsUpdatePackage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventoryWindowsUpdatePackage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventoryWindowsUpdatePackage(
           od as api.InventoryWindowsUpdatePackage);
     });
@@ -1900,8 +1930,9 @@
       'obj-schema-InventoryWindowsUpdatePackageWindowsUpdateCategory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventoryWindowsUpdatePackageWindowsUpdateCategory();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.InventoryWindowsUpdatePackageWindowsUpdateCategory.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventoryWindowsUpdatePackageWindowsUpdateCategory(
           od as api.InventoryWindowsUpdatePackageWindowsUpdateCategory);
     });
@@ -1910,7 +1941,9 @@
   unittest.group('obj-schema-InventoryZypperPatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventoryZypperPatch();
-      var od = api.InventoryZypperPatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventoryZypperPatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventoryZypperPatch(od as api.InventoryZypperPatch);
     });
   });
@@ -1918,7 +1951,9 @@
   unittest.group('obj-schema-ListPatchDeploymentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPatchDeploymentsResponse();
-      var od = api.ListPatchDeploymentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPatchDeploymentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPatchDeploymentsResponse(od as api.ListPatchDeploymentsResponse);
     });
   });
@@ -1926,7 +1961,9 @@
   unittest.group('obj-schema-ListPatchJobInstanceDetailsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPatchJobInstanceDetailsResponse();
-      var od = api.ListPatchJobInstanceDetailsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPatchJobInstanceDetailsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPatchJobInstanceDetailsResponse(
           od as api.ListPatchJobInstanceDetailsResponse);
     });
@@ -1935,7 +1972,9 @@
   unittest.group('obj-schema-ListPatchJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPatchJobsResponse();
-      var od = api.ListPatchJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPatchJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPatchJobsResponse(od as api.ListPatchJobsResponse);
     });
   });
@@ -1943,7 +1982,9 @@
   unittest.group('obj-schema-MonthlySchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonthlySchedule();
-      var od = api.MonthlySchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonthlySchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonthlySchedule(od as api.MonthlySchedule);
     });
   });
@@ -1951,7 +1992,9 @@
   unittest.group('obj-schema-OneTimeSchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOneTimeSchedule();
-      var od = api.OneTimeSchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OneTimeSchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOneTimeSchedule(od as api.OneTimeSchedule);
     });
   });
@@ -1959,7 +2002,9 @@
   unittest.group('obj-schema-PatchConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPatchConfig();
-      var od = api.PatchConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PatchConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPatchConfig(od as api.PatchConfig);
     });
   });
@@ -1967,7 +2012,9 @@
   unittest.group('obj-schema-PatchDeployment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPatchDeployment();
-      var od = api.PatchDeployment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PatchDeployment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPatchDeployment(od as api.PatchDeployment);
     });
   });
@@ -1975,7 +2022,9 @@
   unittest.group('obj-schema-PatchInstanceFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPatchInstanceFilter();
-      var od = api.PatchInstanceFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PatchInstanceFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPatchInstanceFilter(od as api.PatchInstanceFilter);
     });
   });
@@ -1983,7 +2032,9 @@
   unittest.group('obj-schema-PatchInstanceFilterGroupLabel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPatchInstanceFilterGroupLabel();
-      var od = api.PatchInstanceFilterGroupLabel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PatchInstanceFilterGroupLabel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPatchInstanceFilterGroupLabel(
           od as api.PatchInstanceFilterGroupLabel);
     });
@@ -1992,7 +2043,9 @@
   unittest.group('obj-schema-PatchJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPatchJob();
-      var od = api.PatchJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PatchJob.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPatchJob(od as api.PatchJob);
     });
   });
@@ -2000,7 +2053,9 @@
   unittest.group('obj-schema-PatchJobInstanceDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPatchJobInstanceDetails();
-      var od = api.PatchJobInstanceDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PatchJobInstanceDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPatchJobInstanceDetails(od as api.PatchJobInstanceDetails);
     });
   });
@@ -2008,7 +2063,9 @@
   unittest.group('obj-schema-PatchJobInstanceDetailsSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPatchJobInstanceDetailsSummary();
-      var od = api.PatchJobInstanceDetailsSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PatchJobInstanceDetailsSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPatchJobInstanceDetailsSummary(
           od as api.PatchJobInstanceDetailsSummary);
     });
@@ -2017,7 +2074,9 @@
   unittest.group('obj-schema-PatchRollout', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPatchRollout();
-      var od = api.PatchRollout.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PatchRollout.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPatchRollout(od as api.PatchRollout);
     });
   });
@@ -2025,7 +2084,9 @@
   unittest.group('obj-schema-RecurringSchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecurringSchedule();
-      var od = api.RecurringSchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RecurringSchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRecurringSchedule(od as api.RecurringSchedule);
     });
   });
@@ -2033,7 +2094,9 @@
   unittest.group('obj-schema-TimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeOfDay();
-      var od = api.TimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeOfDay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeOfDay(od as api.TimeOfDay);
     });
   });
@@ -2041,7 +2104,9 @@
   unittest.group('obj-schema-TimeZone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeZone();
-      var od = api.TimeZone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeZone.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeZone(od as api.TimeZone);
     });
   });
@@ -2049,7 +2114,9 @@
   unittest.group('obj-schema-WeekDayOfMonth', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWeekDayOfMonth();
-      var od = api.WeekDayOfMonth.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WeekDayOfMonth.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWeekDayOfMonth(od as api.WeekDayOfMonth);
     });
   });
@@ -2057,7 +2124,9 @@
   unittest.group('obj-schema-WeeklySchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWeeklySchedule();
-      var od = api.WeeklySchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WeeklySchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWeeklySchedule(od as api.WeeklySchedule);
     });
   });
@@ -2065,7 +2134,9 @@
   unittest.group('obj-schema-WindowsUpdateSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWindowsUpdateSettings();
-      var od = api.WindowsUpdateSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WindowsUpdateSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWindowsUpdateSettings(od as api.WindowsUpdateSettings);
     });
   });
@@ -2073,7 +2144,9 @@
   unittest.group('obj-schema-YumSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildYumSettings();
-      var od = api.YumSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.YumSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkYumSettings(od as api.YumSettings);
     });
   });
@@ -2081,7 +2154,9 @@
   unittest.group('obj-schema-ZypperSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZypperSettings();
-      var od = api.ZypperSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ZypperSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkZypperSettings(od as api.ZypperSettings);
     });
   });
diff --git a/generated/googleapis/test/oslogin/v1_test.dart b/generated/googleapis/test/oslogin/v1_test.dart
index 61f22e2..f74dd04 100644
--- a/generated/googleapis/test/oslogin/v1_test.dart
+++ b/generated/googleapis/test/oslogin/v1_test.dart
@@ -228,7 +228,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -236,7 +237,9 @@
   unittest.group('obj-schema-ImportSshPublicKeyResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportSshPublicKeyResponse();
-      var od = api.ImportSshPublicKeyResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportSshPublicKeyResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportSshPublicKeyResponse(od as api.ImportSshPublicKeyResponse);
     });
   });
@@ -244,7 +247,9 @@
   unittest.group('obj-schema-LoginProfile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLoginProfile();
-      var od = api.LoginProfile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LoginProfile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLoginProfile(od as api.LoginProfile);
     });
   });
@@ -252,7 +257,9 @@
   unittest.group('obj-schema-PosixAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosixAccount();
-      var od = api.PosixAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PosixAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPosixAccount(od as api.PosixAccount);
     });
   });
@@ -260,7 +267,9 @@
   unittest.group('obj-schema-SshPublicKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSshPublicKey();
-      var od = api.SshPublicKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SshPublicKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSshPublicKey(od as api.SshPublicKey);
     });
   });
diff --git a/generated/googleapis/test/pagespeedonline/v5_test.dart b/generated/googleapis/test/pagespeedonline/v5_test.dart
index 5ba4dde..d41839f 100644
--- a/generated/googleapis/test/pagespeedonline/v5_test.dart
+++ b/generated/googleapis/test/pagespeedonline/v5_test.dart
@@ -1020,7 +1020,9 @@
   unittest.group('obj-schema-AuditRefs', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditRefs();
-      var od = api.AuditRefs.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AuditRefs.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAuditRefs(od as api.AuditRefs);
     });
   });
@@ -1028,7 +1030,9 @@
   unittest.group('obj-schema-Bucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucket();
-      var od = api.Bucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Bucket.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBucket(od as api.Bucket);
     });
   });
@@ -1036,7 +1040,9 @@
   unittest.group('obj-schema-Categories', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategories();
-      var od = api.Categories.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Categories.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCategories(od as api.Categories);
     });
   });
@@ -1044,7 +1050,9 @@
   unittest.group('obj-schema-CategoryGroupV5', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategoryGroupV5();
-      var od = api.CategoryGroupV5.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CategoryGroupV5.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCategoryGroupV5(od as api.CategoryGroupV5);
     });
   });
@@ -1052,7 +1060,9 @@
   unittest.group('obj-schema-ConfigSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigSettings();
-      var od = api.ConfigSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigSettings(od as api.ConfigSettings);
     });
   });
@@ -1060,7 +1070,9 @@
   unittest.group('obj-schema-Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironment();
-      var od = api.Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironment(od as api.Environment);
     });
   });
@@ -1068,7 +1080,8 @@
   unittest.group('obj-schema-I18n', () {
     unittest.test('to-json--from-json', () async {
       var o = buildI18n();
-      var od = api.I18n.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.I18n.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkI18n(od as api.I18n);
     });
   });
@@ -1076,7 +1089,9 @@
   unittest.group('obj-schema-LighthouseAuditResultV5', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLighthouseAuditResultV5();
-      var od = api.LighthouseAuditResultV5.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LighthouseAuditResultV5.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLighthouseAuditResultV5(od as api.LighthouseAuditResultV5);
     });
   });
@@ -1084,7 +1099,9 @@
   unittest.group('obj-schema-LighthouseCategoryV5', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLighthouseCategoryV5();
-      var od = api.LighthouseCategoryV5.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LighthouseCategoryV5.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLighthouseCategoryV5(od as api.LighthouseCategoryV5);
     });
   });
@@ -1092,7 +1109,9 @@
   unittest.group('obj-schema-LighthouseResultV5', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLighthouseResultV5();
-      var od = api.LighthouseResultV5.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LighthouseResultV5.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLighthouseResultV5(od as api.LighthouseResultV5);
     });
   });
@@ -1100,7 +1119,9 @@
   unittest.group('obj-schema-PagespeedApiLoadingExperienceV5', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPagespeedApiLoadingExperienceV5();
-      var od = api.PagespeedApiLoadingExperienceV5.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PagespeedApiLoadingExperienceV5.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPagespeedApiLoadingExperienceV5(
           od as api.PagespeedApiLoadingExperienceV5);
     });
@@ -1109,7 +1130,9 @@
   unittest.group('obj-schema-PagespeedApiPagespeedResponseV5', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPagespeedApiPagespeedResponseV5();
-      var od = api.PagespeedApiPagespeedResponseV5.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PagespeedApiPagespeedResponseV5.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPagespeedApiPagespeedResponseV5(
           od as api.PagespeedApiPagespeedResponseV5);
     });
@@ -1118,7 +1141,9 @@
   unittest.group('obj-schema-PagespeedVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPagespeedVersion();
-      var od = api.PagespeedVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PagespeedVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPagespeedVersion(od as api.PagespeedVersion);
     });
   });
@@ -1126,7 +1151,9 @@
   unittest.group('obj-schema-RendererFormattedStrings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRendererFormattedStrings();
-      var od = api.RendererFormattedStrings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RendererFormattedStrings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRendererFormattedStrings(od as api.RendererFormattedStrings);
     });
   });
@@ -1134,7 +1161,9 @@
   unittest.group('obj-schema-RuntimeError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRuntimeError();
-      var od = api.RuntimeError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RuntimeError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRuntimeError(od as api.RuntimeError);
     });
   });
@@ -1142,7 +1171,9 @@
   unittest.group('obj-schema-StackPack', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStackPack();
-      var od = api.StackPack.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.StackPack.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStackPack(od as api.StackPack);
     });
   });
@@ -1150,7 +1181,9 @@
   unittest.group('obj-schema-Timing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTiming();
-      var od = api.Timing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Timing.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTiming(od as api.Timing);
     });
   });
@@ -1158,7 +1191,9 @@
   unittest.group('obj-schema-UserPageLoadMetricV5', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserPageLoadMetricV5();
-      var od = api.UserPageLoadMetricV5.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserPageLoadMetricV5.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserPageLoadMetricV5(od as api.UserPageLoadMetricV5);
     });
   });
diff --git a/generated/googleapis/test/people/v1_test.dart b/generated/googleapis/test/people/v1_test.dart
index a2b9ab5..b468cde 100644
--- a/generated/googleapis/test/people/v1_test.dart
+++ b/generated/googleapis/test/people/v1_test.dart
@@ -3187,7 +3187,9 @@
   unittest.group('obj-schema-Address', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddress();
-      var od = api.Address.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Address.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAddress(od as api.Address);
     });
   });
@@ -3195,7 +3197,9 @@
   unittest.group('obj-schema-AgeRangeType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAgeRangeType();
-      var od = api.AgeRangeType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AgeRangeType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAgeRangeType(od as api.AgeRangeType);
     });
   });
@@ -3203,7 +3207,9 @@
   unittest.group('obj-schema-BatchGetContactGroupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetContactGroupsResponse();
-      var od = api.BatchGetContactGroupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetContactGroupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetContactGroupsResponse(
           od as api.BatchGetContactGroupsResponse);
     });
@@ -3212,7 +3218,9 @@
   unittest.group('obj-schema-Biography', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBiography();
-      var od = api.Biography.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Biography.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBiography(od as api.Biography);
     });
   });
@@ -3220,7 +3228,9 @@
   unittest.group('obj-schema-Birthday', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBirthday();
-      var od = api.Birthday.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Birthday.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBirthday(od as api.Birthday);
     });
   });
@@ -3228,7 +3238,9 @@
   unittest.group('obj-schema-BraggingRights', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBraggingRights();
-      var od = api.BraggingRights.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BraggingRights.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBraggingRights(od as api.BraggingRights);
     });
   });
@@ -3236,7 +3248,9 @@
   unittest.group('obj-schema-CalendarUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCalendarUrl();
-      var od = api.CalendarUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CalendarUrl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCalendarUrl(od as api.CalendarUrl);
     });
   });
@@ -3244,7 +3258,9 @@
   unittest.group('obj-schema-ClientData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientData();
-      var od = api.ClientData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ClientData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkClientData(od as api.ClientData);
     });
   });
@@ -3252,7 +3268,9 @@
   unittest.group('obj-schema-ContactGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContactGroup();
-      var od = api.ContactGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContactGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContactGroup(od as api.ContactGroup);
     });
   });
@@ -3260,7 +3278,9 @@
   unittest.group('obj-schema-ContactGroupMembership', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContactGroupMembership();
-      var od = api.ContactGroupMembership.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContactGroupMembership.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContactGroupMembership(od as api.ContactGroupMembership);
     });
   });
@@ -3268,7 +3288,9 @@
   unittest.group('obj-schema-ContactGroupMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContactGroupMetadata();
-      var od = api.ContactGroupMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContactGroupMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContactGroupMetadata(od as api.ContactGroupMetadata);
     });
   });
@@ -3276,7 +3298,9 @@
   unittest.group('obj-schema-ContactGroupResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContactGroupResponse();
-      var od = api.ContactGroupResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContactGroupResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContactGroupResponse(od as api.ContactGroupResponse);
     });
   });
@@ -3284,8 +3308,9 @@
   unittest.group('obj-schema-CopyOtherContactToMyContactsGroupRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCopyOtherContactToMyContactsGroupRequest();
-      var od =
-          api.CopyOtherContactToMyContactsGroupRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CopyOtherContactToMyContactsGroupRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCopyOtherContactToMyContactsGroupRequest(
           od as api.CopyOtherContactToMyContactsGroupRequest);
     });
@@ -3294,7 +3319,9 @@
   unittest.group('obj-schema-CoverPhoto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCoverPhoto();
-      var od = api.CoverPhoto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CoverPhoto.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCoverPhoto(od as api.CoverPhoto);
     });
   });
@@ -3302,7 +3329,9 @@
   unittest.group('obj-schema-CreateContactGroupRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateContactGroupRequest();
-      var od = api.CreateContactGroupRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateContactGroupRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateContactGroupRequest(od as api.CreateContactGroupRequest);
     });
   });
@@ -3310,7 +3339,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -3318,7 +3348,9 @@
   unittest.group('obj-schema-DeleteContactPhotoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteContactPhotoResponse();
-      var od = api.DeleteContactPhotoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteContactPhotoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteContactPhotoResponse(od as api.DeleteContactPhotoResponse);
     });
   });
@@ -3326,7 +3358,9 @@
   unittest.group('obj-schema-DomainMembership', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainMembership();
-      var od = api.DomainMembership.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DomainMembership.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDomainMembership(od as api.DomainMembership);
     });
   });
@@ -3334,7 +3368,9 @@
   unittest.group('obj-schema-EmailAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmailAddress();
-      var od = api.EmailAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmailAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmailAddress(od as api.EmailAddress);
     });
   });
@@ -3342,7 +3378,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -3350,7 +3387,8 @@
   unittest.group('obj-schema-Event', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEvent();
-      var od = api.Event.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Event.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEvent(od as api.Event);
     });
   });
@@ -3358,7 +3396,9 @@
   unittest.group('obj-schema-ExternalId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExternalId();
-      var od = api.ExternalId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ExternalId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExternalId(od as api.ExternalId);
     });
   });
@@ -3366,7 +3406,9 @@
   unittest.group('obj-schema-FieldMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFieldMetadata();
-      var od = api.FieldMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FieldMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFieldMetadata(od as api.FieldMetadata);
     });
   });
@@ -3374,7 +3416,9 @@
   unittest.group('obj-schema-FileAs', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileAs();
-      var od = api.FileAs.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FileAs.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFileAs(od as api.FileAs);
     });
   });
@@ -3382,7 +3426,9 @@
   unittest.group('obj-schema-Gender', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGender();
-      var od = api.Gender.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Gender.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGender(od as api.Gender);
     });
   });
@@ -3390,7 +3436,9 @@
   unittest.group('obj-schema-GetPeopleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPeopleResponse();
-      var od = api.GetPeopleResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPeopleResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPeopleResponse(od as api.GetPeopleResponse);
     });
   });
@@ -3398,7 +3446,9 @@
   unittest.group('obj-schema-GroupClientData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupClientData();
-      var od = api.GroupClientData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupClientData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupClientData(od as api.GroupClientData);
     });
   });
@@ -3406,7 +3456,9 @@
   unittest.group('obj-schema-ImClient', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImClient();
-      var od = api.ImClient.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ImClient.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImClient(od as api.ImClient);
     });
   });
@@ -3414,7 +3466,9 @@
   unittest.group('obj-schema-Interest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterest();
-      var od = api.Interest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Interest.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInterest(od as api.Interest);
     });
   });
@@ -3422,7 +3476,9 @@
   unittest.group('obj-schema-ListConnectionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListConnectionsResponse();
-      var od = api.ListConnectionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListConnectionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListConnectionsResponse(od as api.ListConnectionsResponse);
     });
   });
@@ -3430,7 +3486,9 @@
   unittest.group('obj-schema-ListContactGroupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListContactGroupsResponse();
-      var od = api.ListContactGroupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListContactGroupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListContactGroupsResponse(od as api.ListContactGroupsResponse);
     });
   });
@@ -3438,7 +3496,9 @@
   unittest.group('obj-schema-ListDirectoryPeopleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDirectoryPeopleResponse();
-      var od = api.ListDirectoryPeopleResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDirectoryPeopleResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDirectoryPeopleResponse(od as api.ListDirectoryPeopleResponse);
     });
   });
@@ -3446,7 +3506,9 @@
   unittest.group('obj-schema-ListOtherContactsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOtherContactsResponse();
-      var od = api.ListOtherContactsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOtherContactsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOtherContactsResponse(od as api.ListOtherContactsResponse);
     });
   });
@@ -3454,7 +3516,9 @@
   unittest.group('obj-schema-Locale', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocale();
-      var od = api.Locale.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Locale.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocale(od as api.Locale);
     });
   });
@@ -3462,7 +3526,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -3470,7 +3536,9 @@
   unittest.group('obj-schema-Membership', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembership();
-      var od = api.Membership.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Membership.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMembership(od as api.Membership);
     });
   });
@@ -3478,7 +3546,9 @@
   unittest.group('obj-schema-MiscKeyword', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMiscKeyword();
-      var od = api.MiscKeyword.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MiscKeyword.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMiscKeyword(od as api.MiscKeyword);
     });
   });
@@ -3486,7 +3556,9 @@
   unittest.group('obj-schema-ModifyContactGroupMembersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyContactGroupMembersRequest();
-      var od = api.ModifyContactGroupMembersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyContactGroupMembersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyContactGroupMembersRequest(
           od as api.ModifyContactGroupMembersRequest);
     });
@@ -3495,7 +3567,9 @@
   unittest.group('obj-schema-ModifyContactGroupMembersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyContactGroupMembersResponse();
-      var od = api.ModifyContactGroupMembersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyContactGroupMembersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyContactGroupMembersResponse(
           od as api.ModifyContactGroupMembersResponse);
     });
@@ -3504,7 +3578,8 @@
   unittest.group('obj-schema-Name', () {
     unittest.test('to-json--from-json', () async {
       var o = buildName();
-      var od = api.Name.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Name.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkName(od as api.Name);
     });
   });
@@ -3512,7 +3587,9 @@
   unittest.group('obj-schema-Nickname', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNickname();
-      var od = api.Nickname.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Nickname.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNickname(od as api.Nickname);
     });
   });
@@ -3520,7 +3597,9 @@
   unittest.group('obj-schema-Occupation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOccupation();
-      var od = api.Occupation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Occupation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOccupation(od as api.Occupation);
     });
   });
@@ -3528,7 +3607,9 @@
   unittest.group('obj-schema-Organization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrganization();
-      var od = api.Organization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Organization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrganization(od as api.Organization);
     });
   });
@@ -3536,7 +3617,9 @@
   unittest.group('obj-schema-Person', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerson();
-      var od = api.Person.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Person.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPerson(od as api.Person);
     });
   });
@@ -3544,7 +3627,9 @@
   unittest.group('obj-schema-PersonMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPersonMetadata();
-      var od = api.PersonMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PersonMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPersonMetadata(od as api.PersonMetadata);
     });
   });
@@ -3552,7 +3637,9 @@
   unittest.group('obj-schema-PersonResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPersonResponse();
-      var od = api.PersonResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PersonResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPersonResponse(od as api.PersonResponse);
     });
   });
@@ -3560,7 +3647,9 @@
   unittest.group('obj-schema-PhoneNumber', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPhoneNumber();
-      var od = api.PhoneNumber.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PhoneNumber.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPhoneNumber(od as api.PhoneNumber);
     });
   });
@@ -3568,7 +3657,8 @@
   unittest.group('obj-schema-Photo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPhoto();
-      var od = api.Photo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Photo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPhoto(od as api.Photo);
     });
   });
@@ -3576,7 +3666,9 @@
   unittest.group('obj-schema-ProfileMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProfileMetadata();
-      var od = api.ProfileMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProfileMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProfileMetadata(od as api.ProfileMetadata);
     });
   });
@@ -3584,7 +3676,9 @@
   unittest.group('obj-schema-Relation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelation();
-      var od = api.Relation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Relation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRelation(od as api.Relation);
     });
   });
@@ -3592,7 +3686,9 @@
   unittest.group('obj-schema-RelationshipInterest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelationshipInterest();
-      var od = api.RelationshipInterest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RelationshipInterest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRelationshipInterest(od as api.RelationshipInterest);
     });
   });
@@ -3600,7 +3696,9 @@
   unittest.group('obj-schema-RelationshipStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelationshipStatus();
-      var od = api.RelationshipStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RelationshipStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRelationshipStatus(od as api.RelationshipStatus);
     });
   });
@@ -3608,7 +3706,9 @@
   unittest.group('obj-schema-Residence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResidence();
-      var od = api.Residence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Residence.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResidence(od as api.Residence);
     });
   });
@@ -3616,7 +3716,9 @@
   unittest.group('obj-schema-SearchDirectoryPeopleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchDirectoryPeopleResponse();
-      var od = api.SearchDirectoryPeopleResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchDirectoryPeopleResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchDirectoryPeopleResponse(
           od as api.SearchDirectoryPeopleResponse);
     });
@@ -3625,7 +3727,9 @@
   unittest.group('obj-schema-SearchResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchResponse();
-      var od = api.SearchResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchResponse(od as api.SearchResponse);
     });
   });
@@ -3633,7 +3737,9 @@
   unittest.group('obj-schema-SearchResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchResult();
-      var od = api.SearchResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchResult(od as api.SearchResult);
     });
   });
@@ -3641,7 +3747,9 @@
   unittest.group('obj-schema-SipAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSipAddress();
-      var od = api.SipAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SipAddress.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSipAddress(od as api.SipAddress);
     });
   });
@@ -3649,7 +3757,8 @@
   unittest.group('obj-schema-Skill', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSkill();
-      var od = api.Skill.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Skill.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSkill(od as api.Skill);
     });
   });
@@ -3657,7 +3766,9 @@
   unittest.group('obj-schema-Source', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSource();
-      var od = api.Source.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Source.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSource(od as api.Source);
     });
   });
@@ -3665,7 +3776,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -3673,7 +3786,9 @@
   unittest.group('obj-schema-Tagline', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTagline();
-      var od = api.Tagline.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Tagline.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTagline(od as api.Tagline);
     });
   });
@@ -3681,7 +3796,9 @@
   unittest.group('obj-schema-UpdateContactGroupRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateContactGroupRequest();
-      var od = api.UpdateContactGroupRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateContactGroupRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateContactGroupRequest(od as api.UpdateContactGroupRequest);
     });
   });
@@ -3689,7 +3806,9 @@
   unittest.group('obj-schema-UpdateContactPhotoRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateContactPhotoRequest();
-      var od = api.UpdateContactPhotoRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateContactPhotoRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateContactPhotoRequest(od as api.UpdateContactPhotoRequest);
     });
   });
@@ -3697,7 +3816,9 @@
   unittest.group('obj-schema-UpdateContactPhotoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateContactPhotoResponse();
-      var od = api.UpdateContactPhotoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateContactPhotoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateContactPhotoResponse(od as api.UpdateContactPhotoResponse);
     });
   });
@@ -3705,7 +3826,8 @@
   unittest.group('obj-schema-Url', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrl();
-      var od = api.Url.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Url.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUrl(od as api.Url);
     });
   });
@@ -3713,7 +3835,9 @@
   unittest.group('obj-schema-UserDefined', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserDefined();
-      var od = api.UserDefined.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserDefined.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserDefined(od as api.UserDefined);
     });
   });
diff --git a/generated/googleapis/test/playablelocations/v3_test.dart b/generated/googleapis/test/playablelocations/v3_test.dart
index 086fc3e..3e8c032 100644
--- a/generated/googleapis/test/playablelocations/v3_test.dart
+++ b/generated/googleapis/test/playablelocations/v3_test.dart
@@ -653,7 +653,9 @@
   unittest.group('obj-schema-GoogleMapsPlayablelocationsV3Impression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3Impression();
-      var od = api.GoogleMapsPlayablelocationsV3Impression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleMapsPlayablelocationsV3Impression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3Impression(
           od as api.GoogleMapsPlayablelocationsV3Impression);
     });
@@ -663,8 +665,9 @@
       'obj-schema-GoogleMapsPlayablelocationsV3LogImpressionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3LogImpressionsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleMapsPlayablelocationsV3LogImpressionsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3LogImpressionsRequest(
           od as api.GoogleMapsPlayablelocationsV3LogImpressionsRequest);
     });
@@ -674,8 +677,9 @@
       'obj-schema-GoogleMapsPlayablelocationsV3LogImpressionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3LogImpressionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleMapsPlayablelocationsV3LogImpressionsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3LogImpressionsResponse(
           od as api.GoogleMapsPlayablelocationsV3LogImpressionsResponse);
     });
@@ -685,9 +689,10 @@
       'obj-schema-GoogleMapsPlayablelocationsV3LogPlayerReportsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3LogPlayerReportsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleMapsPlayablelocationsV3LogPlayerReportsRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3LogPlayerReportsRequest(
           od as api.GoogleMapsPlayablelocationsV3LogPlayerReportsRequest);
     });
@@ -697,9 +702,10 @@
       'obj-schema-GoogleMapsPlayablelocationsV3LogPlayerReportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3LogPlayerReportsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleMapsPlayablelocationsV3LogPlayerReportsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3LogPlayerReportsResponse(
           od as api.GoogleMapsPlayablelocationsV3LogPlayerReportsResponse);
     });
@@ -708,8 +714,9 @@
   unittest.group('obj-schema-GoogleMapsPlayablelocationsV3PlayerReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3PlayerReport();
-      var od =
-          api.GoogleMapsPlayablelocationsV3PlayerReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleMapsPlayablelocationsV3PlayerReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3PlayerReport(
           od as api.GoogleMapsPlayablelocationsV3PlayerReport);
     });
@@ -719,8 +726,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3SampleAreaFilter();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleMapsPlayablelocationsV3SampleAreaFilter.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3SampleAreaFilter(
           od as api.GoogleMapsPlayablelocationsV3SampleAreaFilter);
     });
@@ -729,8 +737,9 @@
   unittest.group('obj-schema-GoogleMapsPlayablelocationsV3SampleCriterion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3SampleCriterion();
-      var od =
-          api.GoogleMapsPlayablelocationsV3SampleCriterion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleMapsPlayablelocationsV3SampleCriterion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3SampleCriterion(
           od as api.GoogleMapsPlayablelocationsV3SampleCriterion);
     });
@@ -739,8 +748,9 @@
   unittest.group('obj-schema-GoogleMapsPlayablelocationsV3SampleFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3SampleFilter();
-      var od =
-          api.GoogleMapsPlayablelocationsV3SampleFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleMapsPlayablelocationsV3SampleFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3SampleFilter(
           od as api.GoogleMapsPlayablelocationsV3SampleFilter);
     });
@@ -750,8 +760,9 @@
       'obj-schema-GoogleMapsPlayablelocationsV3SamplePlayableLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3SamplePlayableLocation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleMapsPlayablelocationsV3SamplePlayableLocation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3SamplePlayableLocation(
           od as api.GoogleMapsPlayablelocationsV3SamplePlayableLocation);
     });
@@ -761,9 +772,10 @@
       'obj-schema-GoogleMapsPlayablelocationsV3SamplePlayableLocationList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3SamplePlayableLocationList();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleMapsPlayablelocationsV3SamplePlayableLocationList.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3SamplePlayableLocationList(
           od as api.GoogleMapsPlayablelocationsV3SamplePlayableLocationList);
     });
@@ -775,8 +787,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleMapsPlayablelocationsV3SamplePlayableLocationsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleMapsPlayablelocationsV3SamplePlayableLocationsRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3SamplePlayableLocationsRequest(od
           as api.GoogleMapsPlayablelocationsV3SamplePlayableLocationsRequest);
     });
@@ -788,8 +801,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleMapsPlayablelocationsV3SamplePlayableLocationsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleMapsPlayablelocationsV3SamplePlayableLocationsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3SamplePlayableLocationsResponse(od
           as api.GoogleMapsPlayablelocationsV3SamplePlayableLocationsResponse);
     });
@@ -799,8 +813,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsPlayablelocationsV3SampleSpacingOptions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleMapsPlayablelocationsV3SampleSpacingOptions.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsPlayablelocationsV3SampleSpacingOptions(
           od as api.GoogleMapsPlayablelocationsV3SampleSpacingOptions);
     });
@@ -809,7 +824,9 @@
   unittest.group('obj-schema-GoogleMapsUnityClientInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleMapsUnityClientInfo();
-      var od = api.GoogleMapsUnityClientInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleMapsUnityClientInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleMapsUnityClientInfo(od as api.GoogleMapsUnityClientInfo);
     });
   });
@@ -817,7 +834,9 @@
   unittest.group('obj-schema-GoogleTypeLatLng', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeLatLng();
-      var od = api.GoogleTypeLatLng.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeLatLng.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeLatLng(od as api.GoogleTypeLatLng);
     });
   });
diff --git a/generated/googleapis/test/playcustomapp/v1_test.dart b/generated/googleapis/test/playcustomapp/v1_test.dart
index 7fd8c76..5a1b3f3 100644
--- a/generated/googleapis/test/playcustomapp/v1_test.dart
+++ b/generated/googleapis/test/playcustomapp/v1_test.dart
@@ -63,7 +63,9 @@
   unittest.group('obj-schema-CustomApp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomApp();
-      var od = api.CustomApp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CustomApp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCustomApp(od as api.CustomApp);
     });
   });
diff --git a/generated/googleapis/test/policytroubleshooter/v1_test.dart b/generated/googleapis/test/policytroubleshooter/v1_test.dart
index 60921db..a0f2cda 100644
--- a/generated/googleapis/test/policytroubleshooter/v1_test.dart
+++ b/generated/googleapis/test/policytroubleshooter/v1_test.dart
@@ -520,8 +520,9 @@
   unittest.group('obj-schema-GoogleCloudPolicytroubleshooterV1AccessTuple', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicytroubleshooterV1AccessTuple();
-      var od =
-          api.GoogleCloudPolicytroubleshooterV1AccessTuple.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudPolicytroubleshooterV1AccessTuple.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicytroubleshooterV1AccessTuple(
           od as api.GoogleCloudPolicytroubleshooterV1AccessTuple);
     });
@@ -531,8 +532,9 @@
       'obj-schema-GoogleCloudPolicytroubleshooterV1BindingExplanation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicytroubleshooterV1BindingExplanation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudPolicytroubleshooterV1BindingExplanation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicytroubleshooterV1BindingExplanation(
           od as api.GoogleCloudPolicytroubleshooterV1BindingExplanation);
     });
@@ -544,9 +546,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership(
           od as api
               .GoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership);
@@ -557,8 +560,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicytroubleshooterV1ExplainedPolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudPolicytroubleshooterV1ExplainedPolicy.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicytroubleshooterV1ExplainedPolicy(
           od as api.GoogleCloudPolicytroubleshooterV1ExplainedPolicy);
     });
@@ -570,8 +574,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest(od
           as api.GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest);
     });
@@ -583,9 +588,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse(od
           as api
               .GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse);
@@ -595,7 +601,9 @@
   unittest.group('obj-schema-GoogleIamV1AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1AuditConfig();
-      var od = api.GoogleIamV1AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1AuditConfig(od as api.GoogleIamV1AuditConfig);
     });
   });
@@ -603,7 +611,9 @@
   unittest.group('obj-schema-GoogleIamV1AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1AuditLogConfig();
-      var od = api.GoogleIamV1AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1AuditLogConfig(od as api.GoogleIamV1AuditLogConfig);
     });
   });
@@ -611,7 +621,9 @@
   unittest.group('obj-schema-GoogleIamV1Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1Binding();
-      var od = api.GoogleIamV1Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1Binding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1Binding(od as api.GoogleIamV1Binding);
     });
   });
@@ -619,7 +631,9 @@
   unittest.group('obj-schema-GoogleIamV1Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1Policy();
-      var od = api.GoogleIamV1Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1Policy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1Policy(od as api.GoogleIamV1Policy);
     });
   });
@@ -627,7 +641,9 @@
   unittest.group('obj-schema-GoogleTypeExpr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeExpr();
-      var od = api.GoogleTypeExpr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeExpr.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeExpr(od as api.GoogleTypeExpr);
     });
   });
diff --git a/generated/googleapis/test/poly/v1_test.dart b/generated/googleapis/test/poly/v1_test.dart
index 8bb320a..1249008 100644
--- a/generated/googleapis/test/poly/v1_test.dart
+++ b/generated/googleapis/test/poly/v1_test.dart
@@ -617,7 +617,8 @@
   unittest.group('obj-schema-Asset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsset();
-      var od = api.Asset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Asset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAsset(od as api.Asset);
     });
   });
@@ -625,7 +626,9 @@
   unittest.group('obj-schema-AssetImportMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssetImportMessage();
-      var od = api.AssetImportMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AssetImportMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAssetImportMessage(od as api.AssetImportMessage);
     });
   });
@@ -633,7 +636,8 @@
   unittest.group('obj-schema-File', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFile();
-      var od = api.File.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.File.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFile(od as api.File);
     });
   });
@@ -641,7 +645,9 @@
   unittest.group('obj-schema-Format', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFormat();
-      var od = api.Format.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Format.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFormat(od as api.Format);
     });
   });
@@ -649,7 +655,9 @@
   unittest.group('obj-schema-FormatComplexity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFormatComplexity();
-      var od = api.FormatComplexity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FormatComplexity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFormatComplexity(od as api.FormatComplexity);
     });
   });
@@ -657,7 +665,9 @@
   unittest.group('obj-schema-ImageError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageError();
-      var od = api.ImageError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ImageError.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImageError(od as api.ImageError);
     });
   });
@@ -665,7 +675,9 @@
   unittest.group('obj-schema-ListAssetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAssetsResponse();
-      var od = api.ListAssetsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAssetsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAssetsResponse(od as api.ListAssetsResponse);
     });
   });
@@ -673,7 +685,9 @@
   unittest.group('obj-schema-ListLikedAssetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLikedAssetsResponse();
-      var od = api.ListLikedAssetsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLikedAssetsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLikedAssetsResponse(od as api.ListLikedAssetsResponse);
     });
   });
@@ -681,7 +695,9 @@
   unittest.group('obj-schema-ListUserAssetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListUserAssetsResponse();
-      var od = api.ListUserAssetsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListUserAssetsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListUserAssetsResponse(od as api.ListUserAssetsResponse);
     });
   });
@@ -689,7 +705,9 @@
   unittest.group('obj-schema-ObjParseError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjParseError();
-      var od = api.ObjParseError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjParseError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjParseError(od as api.ObjParseError);
     });
   });
@@ -697,7 +715,9 @@
   unittest.group('obj-schema-PresentationParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPresentationParams();
-      var od = api.PresentationParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PresentationParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPresentationParams(od as api.PresentationParams);
     });
   });
@@ -705,7 +725,9 @@
   unittest.group('obj-schema-Quaternion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuaternion();
-      var od = api.Quaternion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Quaternion.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuaternion(od as api.Quaternion);
     });
   });
@@ -713,7 +735,9 @@
   unittest.group('obj-schema-RemixInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemixInfo();
-      var od = api.RemixInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RemixInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRemixInfo(od as api.RemixInfo);
     });
   });
@@ -721,7 +745,9 @@
   unittest.group('obj-schema-StartAssetImportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartAssetImportResponse();
-      var od = api.StartAssetImportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartAssetImportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartAssetImportResponse(od as api.StartAssetImportResponse);
     });
   });
@@ -729,7 +755,9 @@
   unittest.group('obj-schema-UserAsset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserAsset();
-      var od = api.UserAsset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserAsset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserAsset(od as api.UserAsset);
     });
   });
diff --git a/generated/googleapis/test/pubsub/v1_test.dart b/generated/googleapis/test/pubsub/v1_test.dart
index d8f68d2..5569f98 100644
--- a/generated/googleapis/test/pubsub/v1_test.dart
+++ b/generated/googleapis/test/pubsub/v1_test.dart
@@ -1497,7 +1497,9 @@
   unittest.group('obj-schema-AcknowledgeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcknowledgeRequest();
-      var od = api.AcknowledgeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcknowledgeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcknowledgeRequest(od as api.AcknowledgeRequest);
     });
   });
@@ -1505,7 +1507,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1513,7 +1517,9 @@
   unittest.group('obj-schema-CreateSnapshotRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateSnapshotRequest();
-      var od = api.CreateSnapshotRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateSnapshotRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateSnapshotRequest(od as api.CreateSnapshotRequest);
     });
   });
@@ -1521,7 +1527,9 @@
   unittest.group('obj-schema-DeadLetterPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeadLetterPolicy();
-      var od = api.DeadLetterPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeadLetterPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeadLetterPolicy(od as api.DeadLetterPolicy);
     });
   });
@@ -1529,7 +1537,9 @@
   unittest.group('obj-schema-DetachSubscriptionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDetachSubscriptionResponse();
-      var od = api.DetachSubscriptionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DetachSubscriptionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDetachSubscriptionResponse(od as api.DetachSubscriptionResponse);
     });
   });
@@ -1537,7 +1547,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1545,7 +1556,9 @@
   unittest.group('obj-schema-ExpirationPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpirationPolicy();
-      var od = api.ExpirationPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExpirationPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExpirationPolicy(od as api.ExpirationPolicy);
     });
   });
@@ -1553,7 +1566,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1561,7 +1575,9 @@
   unittest.group('obj-schema-ListSchemasResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSchemasResponse();
-      var od = api.ListSchemasResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSchemasResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSchemasResponse(od as api.ListSchemasResponse);
     });
   });
@@ -1569,7 +1585,9 @@
   unittest.group('obj-schema-ListSnapshotsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSnapshotsResponse();
-      var od = api.ListSnapshotsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSnapshotsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSnapshotsResponse(od as api.ListSnapshotsResponse);
     });
   });
@@ -1577,7 +1595,9 @@
   unittest.group('obj-schema-ListSubscriptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSubscriptionsResponse();
-      var od = api.ListSubscriptionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSubscriptionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSubscriptionsResponse(od as api.ListSubscriptionsResponse);
     });
   });
@@ -1585,7 +1605,9 @@
   unittest.group('obj-schema-ListTopicSnapshotsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTopicSnapshotsResponse();
-      var od = api.ListTopicSnapshotsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTopicSnapshotsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTopicSnapshotsResponse(od as api.ListTopicSnapshotsResponse);
     });
   });
@@ -1593,7 +1615,9 @@
   unittest.group('obj-schema-ListTopicSubscriptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTopicSubscriptionsResponse();
-      var od = api.ListTopicSubscriptionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTopicSubscriptionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTopicSubscriptionsResponse(
           od as api.ListTopicSubscriptionsResponse);
     });
@@ -1602,7 +1626,9 @@
   unittest.group('obj-schema-ListTopicsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTopicsResponse();
-      var od = api.ListTopicsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTopicsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTopicsResponse(od as api.ListTopicsResponse);
     });
   });
@@ -1610,7 +1636,9 @@
   unittest.group('obj-schema-MessageStoragePolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMessageStoragePolicy();
-      var od = api.MessageStoragePolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MessageStoragePolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMessageStoragePolicy(od as api.MessageStoragePolicy);
     });
   });
@@ -1618,7 +1646,9 @@
   unittest.group('obj-schema-ModifyAckDeadlineRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyAckDeadlineRequest();
-      var od = api.ModifyAckDeadlineRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyAckDeadlineRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyAckDeadlineRequest(od as api.ModifyAckDeadlineRequest);
     });
   });
@@ -1626,7 +1656,9 @@
   unittest.group('obj-schema-ModifyPushConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyPushConfigRequest();
-      var od = api.ModifyPushConfigRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyPushConfigRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyPushConfigRequest(od as api.ModifyPushConfigRequest);
     });
   });
@@ -1634,7 +1666,9 @@
   unittest.group('obj-schema-OidcToken', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOidcToken();
-      var od = api.OidcToken.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OidcToken.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOidcToken(od as api.OidcToken);
     });
   });
@@ -1642,7 +1676,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1650,7 +1686,9 @@
   unittest.group('obj-schema-PublishRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublishRequest();
-      var od = api.PublishRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublishRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublishRequest(od as api.PublishRequest);
     });
   });
@@ -1658,7 +1696,9 @@
   unittest.group('obj-schema-PublishResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublishResponse();
-      var od = api.PublishResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublishResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublishResponse(od as api.PublishResponse);
     });
   });
@@ -1666,7 +1706,9 @@
   unittest.group('obj-schema-PubsubMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubsubMessage();
-      var od = api.PubsubMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PubsubMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPubsubMessage(od as api.PubsubMessage);
     });
   });
@@ -1674,7 +1716,9 @@
   unittest.group('obj-schema-PullRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPullRequest();
-      var od = api.PullRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PullRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPullRequest(od as api.PullRequest);
     });
   });
@@ -1682,7 +1726,9 @@
   unittest.group('obj-schema-PullResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPullResponse();
-      var od = api.PullResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PullResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPullResponse(od as api.PullResponse);
     });
   });
@@ -1690,7 +1736,9 @@
   unittest.group('obj-schema-PushConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPushConfig();
-      var od = api.PushConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PushConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPushConfig(od as api.PushConfig);
     });
   });
@@ -1698,7 +1746,9 @@
   unittest.group('obj-schema-ReceivedMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReceivedMessage();
-      var od = api.ReceivedMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReceivedMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReceivedMessage(od as api.ReceivedMessage);
     });
   });
@@ -1706,7 +1756,9 @@
   unittest.group('obj-schema-RetryPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRetryPolicy();
-      var od = api.RetryPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RetryPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRetryPolicy(od as api.RetryPolicy);
     });
   });
@@ -1714,7 +1766,9 @@
   unittest.group('obj-schema-Schema', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchema();
-      var od = api.Schema.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schema.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchema(od as api.Schema);
     });
   });
@@ -1722,7 +1776,9 @@
   unittest.group('obj-schema-SchemaSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchemaSettings();
-      var od = api.SchemaSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SchemaSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSchemaSettings(od as api.SchemaSettings);
     });
   });
@@ -1730,7 +1786,9 @@
   unittest.group('obj-schema-SeekRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeekRequest();
-      var od = api.SeekRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SeekRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSeekRequest(od as api.SeekRequest);
     });
   });
@@ -1738,7 +1796,9 @@
   unittest.group('obj-schema-SeekResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeekResponse();
-      var od = api.SeekResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SeekResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSeekResponse(od as api.SeekResponse);
     });
   });
@@ -1746,7 +1806,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1754,7 +1816,9 @@
   unittest.group('obj-schema-Snapshot', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshot();
-      var od = api.Snapshot.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Snapshot.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSnapshot(od as api.Snapshot);
     });
   });
@@ -1762,7 +1826,9 @@
   unittest.group('obj-schema-Subscription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscription();
-      var od = api.Subscription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Subscription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscription(od as api.Subscription);
     });
   });
@@ -1770,7 +1836,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1778,7 +1846,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -1786,7 +1856,8 @@
   unittest.group('obj-schema-Topic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTopic();
-      var od = api.Topic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Topic.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTopic(od as api.Topic);
     });
   });
@@ -1794,7 +1865,9 @@
   unittest.group('obj-schema-UpdateSnapshotRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateSnapshotRequest();
-      var od = api.UpdateSnapshotRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateSnapshotRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateSnapshotRequest(od as api.UpdateSnapshotRequest);
     });
   });
@@ -1802,7 +1875,9 @@
   unittest.group('obj-schema-UpdateSubscriptionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateSubscriptionRequest();
-      var od = api.UpdateSubscriptionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateSubscriptionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateSubscriptionRequest(od as api.UpdateSubscriptionRequest);
     });
   });
@@ -1810,7 +1885,9 @@
   unittest.group('obj-schema-UpdateTopicRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTopicRequest();
-      var od = api.UpdateTopicRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTopicRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTopicRequest(od as api.UpdateTopicRequest);
     });
   });
@@ -1818,7 +1895,9 @@
   unittest.group('obj-schema-ValidateMessageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValidateMessageRequest();
-      var od = api.ValidateMessageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValidateMessageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValidateMessageRequest(od as api.ValidateMessageRequest);
     });
   });
@@ -1826,7 +1905,9 @@
   unittest.group('obj-schema-ValidateMessageResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValidateMessageResponse();
-      var od = api.ValidateMessageResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValidateMessageResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValidateMessageResponse(od as api.ValidateMessageResponse);
     });
   });
@@ -1834,7 +1915,9 @@
   unittest.group('obj-schema-ValidateSchemaRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValidateSchemaRequest();
-      var od = api.ValidateSchemaRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValidateSchemaRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValidateSchemaRequest(od as api.ValidateSchemaRequest);
     });
   });
@@ -1842,7 +1925,9 @@
   unittest.group('obj-schema-ValidateSchemaResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValidateSchemaResponse();
-      var od = api.ValidateSchemaResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValidateSchemaResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValidateSchemaResponse(od as api.ValidateSchemaResponse);
     });
   });
diff --git a/generated/googleapis/test/pubsublite/v1_test.dart b/generated/googleapis/test/pubsublite/v1_test.dart
index cc2c2a6..f98139f 100644
--- a/generated/googleapis/test/pubsublite/v1_test.dart
+++ b/generated/googleapis/test/pubsublite/v1_test.dart
@@ -532,7 +532,9 @@
   unittest.group('obj-schema-Capacity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCapacity();
-      var od = api.Capacity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Capacity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCapacity(od as api.Capacity);
     });
   });
@@ -540,7 +542,9 @@
   unittest.group('obj-schema-ComputeHeadCursorRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComputeHeadCursorRequest();
-      var od = api.ComputeHeadCursorRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComputeHeadCursorRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComputeHeadCursorRequest(od as api.ComputeHeadCursorRequest);
     });
   });
@@ -548,7 +552,9 @@
   unittest.group('obj-schema-ComputeHeadCursorResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComputeHeadCursorResponse();
-      var od = api.ComputeHeadCursorResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComputeHeadCursorResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComputeHeadCursorResponse(od as api.ComputeHeadCursorResponse);
     });
   });
@@ -556,7 +562,9 @@
   unittest.group('obj-schema-ComputeMessageStatsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComputeMessageStatsRequest();
-      var od = api.ComputeMessageStatsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComputeMessageStatsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComputeMessageStatsRequest(od as api.ComputeMessageStatsRequest);
     });
   });
@@ -564,7 +572,9 @@
   unittest.group('obj-schema-ComputeMessageStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComputeMessageStatsResponse();
-      var od = api.ComputeMessageStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComputeMessageStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComputeMessageStatsResponse(od as api.ComputeMessageStatsResponse);
     });
   });
@@ -572,7 +582,9 @@
   unittest.group('obj-schema-Cursor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCursor();
-      var od = api.Cursor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Cursor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCursor(od as api.Cursor);
     });
   });
@@ -580,7 +592,9 @@
   unittest.group('obj-schema-DeliveryConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeliveryConfig();
-      var od = api.DeliveryConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeliveryConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeliveryConfig(od as api.DeliveryConfig);
     });
   });
@@ -588,7 +602,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -596,7 +611,9 @@
   unittest.group('obj-schema-ListPartitionCursorsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPartitionCursorsResponse();
-      var od = api.ListPartitionCursorsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPartitionCursorsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPartitionCursorsResponse(od as api.ListPartitionCursorsResponse);
     });
   });
@@ -604,7 +621,9 @@
   unittest.group('obj-schema-ListSubscriptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSubscriptionsResponse();
-      var od = api.ListSubscriptionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSubscriptionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSubscriptionsResponse(od as api.ListSubscriptionsResponse);
     });
   });
@@ -612,7 +631,9 @@
   unittest.group('obj-schema-ListTopicSubscriptionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTopicSubscriptionsResponse();
-      var od = api.ListTopicSubscriptionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTopicSubscriptionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTopicSubscriptionsResponse(
           od as api.ListTopicSubscriptionsResponse);
     });
@@ -621,7 +642,9 @@
   unittest.group('obj-schema-ListTopicsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTopicsResponse();
-      var od = api.ListTopicsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTopicsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTopicsResponse(od as api.ListTopicsResponse);
     });
   });
@@ -629,7 +652,9 @@
   unittest.group('obj-schema-PartitionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionConfig();
-      var od = api.PartitionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionConfig(od as api.PartitionConfig);
     });
   });
@@ -637,7 +662,9 @@
   unittest.group('obj-schema-PartitionCursor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionCursor();
-      var od = api.PartitionCursor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionCursor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionCursor(od as api.PartitionCursor);
     });
   });
@@ -645,7 +672,9 @@
   unittest.group('obj-schema-RetentionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRetentionConfig();
-      var od = api.RetentionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RetentionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRetentionConfig(od as api.RetentionConfig);
     });
   });
@@ -653,7 +682,9 @@
   unittest.group('obj-schema-Subscription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscription();
-      var od = api.Subscription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Subscription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscription(od as api.Subscription);
     });
   });
@@ -661,7 +692,8 @@
   unittest.group('obj-schema-Topic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTopic();
-      var od = api.Topic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Topic.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTopic(od as api.Topic);
     });
   });
@@ -669,7 +701,9 @@
   unittest.group('obj-schema-TopicPartitions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTopicPartitions();
-      var od = api.TopicPartitions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TopicPartitions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTopicPartitions(od as api.TopicPartitions);
     });
   });
diff --git a/generated/googleapis/test/realtimebidding/v1_test.dart b/generated/googleapis/test/realtimebidding/v1_test.dart
index 9a5874b..a44ae1c 100644
--- a/generated/googleapis/test/realtimebidding/v1_test.dart
+++ b/generated/googleapis/test/realtimebidding/v1_test.dart
@@ -2182,7 +2182,9 @@
   unittest.group('obj-schema-ActivatePretargetingConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivatePretargetingConfigRequest();
-      var od = api.ActivatePretargetingConfigRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivatePretargetingConfigRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivatePretargetingConfigRequest(
           od as api.ActivatePretargetingConfigRequest);
     });
@@ -2191,7 +2193,9 @@
   unittest.group('obj-schema-AddTargetedAppsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddTargetedAppsRequest();
-      var od = api.AddTargetedAppsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddTargetedAppsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddTargetedAppsRequest(od as api.AddTargetedAppsRequest);
     });
   });
@@ -2199,7 +2203,9 @@
   unittest.group('obj-schema-AddTargetedPublishersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddTargetedPublishersRequest();
-      var od = api.AddTargetedPublishersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddTargetedPublishersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddTargetedPublishersRequest(od as api.AddTargetedPublishersRequest);
     });
   });
@@ -2207,7 +2213,9 @@
   unittest.group('obj-schema-AddTargetedSitesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddTargetedSitesRequest();
-      var od = api.AddTargetedSitesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddTargetedSitesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddTargetedSitesRequest(od as api.AddTargetedSitesRequest);
     });
   });
@@ -2215,7 +2223,9 @@
   unittest.group('obj-schema-AdvertiserAndBrand', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvertiserAndBrand();
-      var od = api.AdvertiserAndBrand.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdvertiserAndBrand.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdvertiserAndBrand(od as api.AdvertiserAndBrand);
     });
   });
@@ -2223,7 +2233,9 @@
   unittest.group('obj-schema-AppTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppTargeting();
-      var od = api.AppTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppTargeting(od as api.AppTargeting);
     });
   });
@@ -2231,7 +2243,9 @@
   unittest.group('obj-schema-CloseUserListRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloseUserListRequest();
-      var od = api.CloseUserListRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloseUserListRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloseUserListRequest(od as api.CloseUserListRequest);
     });
   });
@@ -2239,7 +2253,9 @@
   unittest.group('obj-schema-Creative', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreative();
-      var od = api.Creative.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Creative.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCreative(od as api.Creative);
     });
   });
@@ -2247,7 +2263,9 @@
   unittest.group('obj-schema-CreativeDimensions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeDimensions();
-      var od = api.CreativeDimensions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeDimensions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeDimensions(od as api.CreativeDimensions);
     });
   });
@@ -2255,7 +2273,9 @@
   unittest.group('obj-schema-CreativeServingDecision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeServingDecision();
-      var od = api.CreativeServingDecision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeServingDecision.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeServingDecision(od as api.CreativeServingDecision);
     });
   });
@@ -2263,7 +2283,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -2271,7 +2292,9 @@
   unittest.group('obj-schema-DestinationNotCrawlableEvidence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDestinationNotCrawlableEvidence();
-      var od = api.DestinationNotCrawlableEvidence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DestinationNotCrawlableEvidence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDestinationNotCrawlableEvidence(
           od as api.DestinationNotCrawlableEvidence);
     });
@@ -2280,7 +2303,9 @@
   unittest.group('obj-schema-DestinationNotWorkingEvidence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDestinationNotWorkingEvidence();
-      var od = api.DestinationNotWorkingEvidence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DestinationNotWorkingEvidence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDestinationNotWorkingEvidence(
           od as api.DestinationNotWorkingEvidence);
     });
@@ -2289,7 +2314,9 @@
   unittest.group('obj-schema-DestinationUrlEvidence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDestinationUrlEvidence();
-      var od = api.DestinationUrlEvidence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DestinationUrlEvidence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDestinationUrlEvidence(od as api.DestinationUrlEvidence);
     });
   });
@@ -2297,7 +2324,9 @@
   unittest.group('obj-schema-DomainCallEvidence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainCallEvidence();
-      var od = api.DomainCallEvidence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DomainCallEvidence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDomainCallEvidence(od as api.DomainCallEvidence);
     });
   });
@@ -2305,7 +2334,9 @@
   unittest.group('obj-schema-DomainCalls', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainCalls();
-      var od = api.DomainCalls.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DomainCalls.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDomainCalls(od as api.DomainCalls);
     });
   });
@@ -2313,7 +2344,9 @@
   unittest.group('obj-schema-DownloadSizeEvidence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDownloadSizeEvidence();
-      var od = api.DownloadSizeEvidence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DownloadSizeEvidence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDownloadSizeEvidence(od as api.DownloadSizeEvidence);
     });
   });
@@ -2321,7 +2354,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2329,7 +2363,9 @@
   unittest.group('obj-schema-GetRemarketingTagResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetRemarketingTagResponse();
-      var od = api.GetRemarketingTagResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetRemarketingTagResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetRemarketingTagResponse(od as api.GetRemarketingTagResponse);
     });
   });
@@ -2337,7 +2373,9 @@
   unittest.group('obj-schema-HtmlContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHtmlContent();
-      var od = api.HtmlContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HtmlContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHtmlContent(od as api.HtmlContent);
     });
   });
@@ -2345,7 +2383,9 @@
   unittest.group('obj-schema-HttpCallEvidence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpCallEvidence();
-      var od = api.HttpCallEvidence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpCallEvidence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpCallEvidence(od as api.HttpCallEvidence);
     });
   });
@@ -2353,7 +2393,9 @@
   unittest.group('obj-schema-HttpCookieEvidence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpCookieEvidence();
-      var od = api.HttpCookieEvidence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpCookieEvidence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpCookieEvidence(od as api.HttpCookieEvidence);
     });
   });
@@ -2361,7 +2403,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -2369,7 +2412,9 @@
   unittest.group('obj-schema-ListCreativesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCreativesResponse();
-      var od = api.ListCreativesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCreativesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCreativesResponse(od as api.ListCreativesResponse);
     });
   });
@@ -2377,7 +2422,9 @@
   unittest.group('obj-schema-ListPretargetingConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPretargetingConfigsResponse();
-      var od = api.ListPretargetingConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPretargetingConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPretargetingConfigsResponse(
           od as api.ListPretargetingConfigsResponse);
     });
@@ -2386,7 +2433,9 @@
   unittest.group('obj-schema-ListUserListsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListUserListsResponse();
-      var od = api.ListUserListsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListUserListsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListUserListsResponse(od as api.ListUserListsResponse);
     });
   });
@@ -2394,7 +2443,9 @@
   unittest.group('obj-schema-MediaFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMediaFile();
-      var od = api.MediaFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MediaFile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMediaFile(od as api.MediaFile);
     });
   });
@@ -2402,7 +2453,9 @@
   unittest.group('obj-schema-NativeContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNativeContent();
-      var od = api.NativeContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NativeContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNativeContent(od as api.NativeContent);
     });
   });
@@ -2410,7 +2463,9 @@
   unittest.group('obj-schema-NumericTargetingDimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNumericTargetingDimension();
-      var od = api.NumericTargetingDimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NumericTargetingDimension.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNumericTargetingDimension(od as api.NumericTargetingDimension);
     });
   });
@@ -2418,7 +2473,9 @@
   unittest.group('obj-schema-OpenUserListRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOpenUserListRequest();
-      var od = api.OpenUserListRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OpenUserListRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOpenUserListRequest(od as api.OpenUserListRequest);
     });
   });
@@ -2426,7 +2483,9 @@
   unittest.group('obj-schema-PolicyCompliance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyCompliance();
-      var od = api.PolicyCompliance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyCompliance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyCompliance(od as api.PolicyCompliance);
     });
   });
@@ -2434,7 +2493,9 @@
   unittest.group('obj-schema-PolicyTopicEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyTopicEntry();
-      var od = api.PolicyTopicEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyTopicEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyTopicEntry(od as api.PolicyTopicEntry);
     });
   });
@@ -2442,7 +2503,9 @@
   unittest.group('obj-schema-PolicyTopicEvidence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyTopicEvidence();
-      var od = api.PolicyTopicEvidence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyTopicEvidence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyTopicEvidence(od as api.PolicyTopicEvidence);
     });
   });
@@ -2450,7 +2513,9 @@
   unittest.group('obj-schema-PretargetingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPretargetingConfig();
-      var od = api.PretargetingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PretargetingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPretargetingConfig(od as api.PretargetingConfig);
     });
   });
@@ -2458,7 +2523,9 @@
   unittest.group('obj-schema-RemoveTargetedAppsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveTargetedAppsRequest();
-      var od = api.RemoveTargetedAppsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveTargetedAppsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveTargetedAppsRequest(od as api.RemoveTargetedAppsRequest);
     });
   });
@@ -2466,7 +2533,9 @@
   unittest.group('obj-schema-RemoveTargetedPublishersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveTargetedPublishersRequest();
-      var od = api.RemoveTargetedPublishersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveTargetedPublishersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveTargetedPublishersRequest(
           od as api.RemoveTargetedPublishersRequest);
     });
@@ -2475,7 +2544,9 @@
   unittest.group('obj-schema-RemoveTargetedSitesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveTargetedSitesRequest();
-      var od = api.RemoveTargetedSitesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveTargetedSitesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveTargetedSitesRequest(od as api.RemoveTargetedSitesRequest);
     });
   });
@@ -2483,7 +2554,9 @@
   unittest.group('obj-schema-StringTargetingDimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStringTargetingDimension();
-      var od = api.StringTargetingDimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StringTargetingDimension.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStringTargetingDimension(od as api.StringTargetingDimension);
     });
   });
@@ -2491,7 +2564,9 @@
   unittest.group('obj-schema-SuspendPretargetingConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuspendPretargetingConfigRequest();
-      var od = api.SuspendPretargetingConfigRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuspendPretargetingConfigRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuspendPretargetingConfigRequest(
           od as api.SuspendPretargetingConfigRequest);
     });
@@ -2500,7 +2575,9 @@
   unittest.group('obj-schema-UrlDownloadSize', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlDownloadSize();
-      var od = api.UrlDownloadSize.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlDownloadSize.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlDownloadSize(od as api.UrlDownloadSize);
     });
   });
@@ -2508,7 +2585,9 @@
   unittest.group('obj-schema-UrlRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlRestriction();
-      var od = api.UrlRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlRestriction(od as api.UrlRestriction);
     });
   });
@@ -2516,7 +2595,9 @@
   unittest.group('obj-schema-UserList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserList();
-      var od = api.UserList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserList(od as api.UserList);
     });
   });
@@ -2524,7 +2605,9 @@
   unittest.group('obj-schema-VideoContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoContent();
-      var od = api.VideoContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoContent(od as api.VideoContent);
     });
   });
@@ -2532,7 +2615,9 @@
   unittest.group('obj-schema-VideoMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoMetadata();
-      var od = api.VideoMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoMetadata(od as api.VideoMetadata);
     });
   });
@@ -2540,7 +2625,9 @@
   unittest.group('obj-schema-WatchCreativesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWatchCreativesRequest();
-      var od = api.WatchCreativesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WatchCreativesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWatchCreativesRequest(od as api.WatchCreativesRequest);
     });
   });
@@ -2548,7 +2635,9 @@
   unittest.group('obj-schema-WatchCreativesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWatchCreativesResponse();
-      var od = api.WatchCreativesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WatchCreativesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWatchCreativesResponse(od as api.WatchCreativesResponse);
     });
   });
diff --git a/generated/googleapis/test/recommender/v1_test.dart b/generated/googleapis/test/recommender/v1_test.dart
index 3ae8b1b..7fb9191 100644
--- a/generated/googleapis/test/recommender/v1_test.dart
+++ b/generated/googleapis/test/recommender/v1_test.dart
@@ -989,7 +989,9 @@
   unittest.group('obj-schema-GoogleCloudRecommenderV1CostProjection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1CostProjection();
-      var od = api.GoogleCloudRecommenderV1CostProjection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRecommenderV1CostProjection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1CostProjection(
           od as api.GoogleCloudRecommenderV1CostProjection);
     });
@@ -998,7 +1000,9 @@
   unittest.group('obj-schema-GoogleCloudRecommenderV1Impact', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1Impact();
-      var od = api.GoogleCloudRecommenderV1Impact.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRecommenderV1Impact.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1Impact(
           od as api.GoogleCloudRecommenderV1Impact);
     });
@@ -1007,7 +1011,9 @@
   unittest.group('obj-schema-GoogleCloudRecommenderV1Insight', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1Insight();
-      var od = api.GoogleCloudRecommenderV1Insight.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRecommenderV1Insight.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1Insight(
           od as api.GoogleCloudRecommenderV1Insight);
     });
@@ -1017,9 +1023,10 @@
       'obj-schema-GoogleCloudRecommenderV1InsightRecommendationReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1InsightRecommendationReference();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommenderV1InsightRecommendationReference.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1InsightRecommendationReference(
           od as api.GoogleCloudRecommenderV1InsightRecommendationReference);
     });
@@ -1028,8 +1035,9 @@
   unittest.group('obj-schema-GoogleCloudRecommenderV1InsightStateInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1InsightStateInfo();
-      var od =
-          api.GoogleCloudRecommenderV1InsightStateInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRecommenderV1InsightStateInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1InsightStateInfo(
           od as api.GoogleCloudRecommenderV1InsightStateInfo);
     });
@@ -1038,8 +1046,9 @@
   unittest.group('obj-schema-GoogleCloudRecommenderV1ListInsightsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1ListInsightsResponse();
-      var od =
-          api.GoogleCloudRecommenderV1ListInsightsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRecommenderV1ListInsightsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1ListInsightsResponse(
           od as api.GoogleCloudRecommenderV1ListInsightsResponse);
     });
@@ -1049,8 +1058,9 @@
       'obj-schema-GoogleCloudRecommenderV1ListRecommendationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1ListRecommendationsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommenderV1ListRecommendationsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1ListRecommendationsResponse(
           od as api.GoogleCloudRecommenderV1ListRecommendationsResponse);
     });
@@ -1060,8 +1070,9 @@
       'obj-schema-GoogleCloudRecommenderV1MarkInsightAcceptedRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1MarkInsightAcceptedRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommenderV1MarkInsightAcceptedRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1MarkInsightAcceptedRequest(
           od as api.GoogleCloudRecommenderV1MarkInsightAcceptedRequest);
     });
@@ -1072,9 +1083,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1MarkRecommendationClaimedRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommenderV1MarkRecommendationClaimedRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1MarkRecommendationClaimedRequest(
           od as api.GoogleCloudRecommenderV1MarkRecommendationClaimedRequest);
     });
@@ -1084,9 +1096,10 @@
       'obj-schema-GoogleCloudRecommenderV1MarkRecommendationFailedRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1MarkRecommendationFailedRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommenderV1MarkRecommendationFailedRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1MarkRecommendationFailedRequest(
           od as api.GoogleCloudRecommenderV1MarkRecommendationFailedRequest);
     });
@@ -1097,8 +1110,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1MarkRecommendationSucceededRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommenderV1MarkRecommendationSucceededRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1MarkRecommendationSucceededRequest(
           od as api.GoogleCloudRecommenderV1MarkRecommendationSucceededRequest);
     });
@@ -1107,7 +1121,9 @@
   unittest.group('obj-schema-GoogleCloudRecommenderV1Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1Operation();
-      var od = api.GoogleCloudRecommenderV1Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRecommenderV1Operation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1Operation(
           od as api.GoogleCloudRecommenderV1Operation);
     });
@@ -1116,7 +1132,9 @@
   unittest.group('obj-schema-GoogleCloudRecommenderV1OperationGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1OperationGroup();
-      var od = api.GoogleCloudRecommenderV1OperationGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRecommenderV1OperationGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1OperationGroup(
           od as api.GoogleCloudRecommenderV1OperationGroup);
     });
@@ -1125,7 +1143,9 @@
   unittest.group('obj-schema-GoogleCloudRecommenderV1Recommendation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1Recommendation();
-      var od = api.GoogleCloudRecommenderV1Recommendation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRecommenderV1Recommendation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1Recommendation(
           od as api.GoogleCloudRecommenderV1Recommendation);
     });
@@ -1135,8 +1155,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1RecommendationContent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommenderV1RecommendationContent.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1RecommendationContent(
           od as api.GoogleCloudRecommenderV1RecommendationContent);
     });
@@ -1146,9 +1167,10 @@
       'obj-schema-GoogleCloudRecommenderV1RecommendationInsightReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1RecommendationInsightReference();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommenderV1RecommendationInsightReference.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1RecommendationInsightReference(
           od as api.GoogleCloudRecommenderV1RecommendationInsightReference);
     });
@@ -1158,8 +1180,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1RecommendationStateInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommenderV1RecommendationStateInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1RecommendationStateInfo(
           od as api.GoogleCloudRecommenderV1RecommendationStateInfo);
     });
@@ -1168,7 +1191,9 @@
   unittest.group('obj-schema-GoogleCloudRecommenderV1ValueMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommenderV1ValueMatcher();
-      var od = api.GoogleCloudRecommenderV1ValueMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRecommenderV1ValueMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommenderV1ValueMatcher(
           od as api.GoogleCloudRecommenderV1ValueMatcher);
     });
@@ -1177,7 +1202,9 @@
   unittest.group('obj-schema-GoogleTypeMoney', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeMoney();
-      var od = api.GoogleTypeMoney.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeMoney.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeMoney(od as api.GoogleTypeMoney);
     });
   });
diff --git a/generated/googleapis/test/redis/v1_test.dart b/generated/googleapis/test/redis/v1_test.dart
index e3f7ea3..097e30e 100644
--- a/generated/googleapis/test/redis/v1_test.dart
+++ b/generated/googleapis/test/redis/v1_test.dart
@@ -990,7 +990,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -998,7 +999,9 @@
   unittest.group('obj-schema-ExportInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportInstanceRequest();
-      var od = api.ExportInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportInstanceRequest(od as api.ExportInstanceRequest);
     });
   });
@@ -1006,7 +1009,9 @@
   unittest.group('obj-schema-FailoverInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFailoverInstanceRequest();
-      var od = api.FailoverInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FailoverInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFailoverInstanceRequest(od as api.FailoverInstanceRequest);
     });
   });
@@ -1014,7 +1019,9 @@
   unittest.group('obj-schema-GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcsDestination();
-      var od = api.GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGcsDestination(od as api.GcsDestination);
     });
   });
@@ -1022,7 +1029,9 @@
   unittest.group('obj-schema-GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcsSource();
-      var od = api.GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GcsSource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGcsSource(od as api.GcsSource);
     });
   });
@@ -1030,7 +1039,9 @@
   unittest.group('obj-schema-GoogleCloudRedisV1LocationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRedisV1LocationMetadata();
-      var od = api.GoogleCloudRedisV1LocationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRedisV1LocationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRedisV1LocationMetadata(
           od as api.GoogleCloudRedisV1LocationMetadata);
     });
@@ -1039,7 +1050,9 @@
   unittest.group('obj-schema-GoogleCloudRedisV1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRedisV1OperationMetadata();
-      var od = api.GoogleCloudRedisV1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRedisV1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRedisV1OperationMetadata(
           od as api.GoogleCloudRedisV1OperationMetadata);
     });
@@ -1048,7 +1061,9 @@
   unittest.group('obj-schema-GoogleCloudRedisV1ZoneMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRedisV1ZoneMetadata();
-      var od = api.GoogleCloudRedisV1ZoneMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRedisV1ZoneMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRedisV1ZoneMetadata(
           od as api.GoogleCloudRedisV1ZoneMetadata);
     });
@@ -1057,7 +1072,9 @@
   unittest.group('obj-schema-ImportInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportInstanceRequest();
-      var od = api.ImportInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportInstanceRequest(od as api.ImportInstanceRequest);
     });
   });
@@ -1065,7 +1082,9 @@
   unittest.group('obj-schema-InputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInputConfig();
-      var od = api.InputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInputConfig(od as api.InputConfig);
     });
   });
@@ -1073,7 +1092,9 @@
   unittest.group('obj-schema-Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstance();
-      var od = api.Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Instance.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstance(od as api.Instance);
     });
   });
@@ -1081,7 +1102,9 @@
   unittest.group('obj-schema-InstanceAuthString', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceAuthString();
-      var od = api.InstanceAuthString.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceAuthString.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceAuthString(od as api.InstanceAuthString);
     });
   });
@@ -1089,7 +1112,9 @@
   unittest.group('obj-schema-ListInstancesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInstancesResponse();
-      var od = api.ListInstancesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInstancesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
@@ -1097,7 +1122,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1105,7 +1132,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1113,7 +1142,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1121,7 +1152,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1129,7 +1162,9 @@
   unittest.group('obj-schema-OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOutputConfig();
-      var od = api.OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOutputConfig(od as api.OutputConfig);
     });
   });
@@ -1137,7 +1172,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1145,7 +1182,9 @@
   unittest.group('obj-schema-TlsCertificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTlsCertificate();
-      var od = api.TlsCertificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TlsCertificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTlsCertificate(od as api.TlsCertificate);
     });
   });
@@ -1153,7 +1192,9 @@
   unittest.group('obj-schema-UpgradeInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpgradeInstanceRequest();
-      var od = api.UpgradeInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpgradeInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpgradeInstanceRequest(od as api.UpgradeInstanceRequest);
     });
   });
diff --git a/generated/googleapis/test/remotebuildexecution/v2_test.dart b/generated/googleapis/test/remotebuildexecution/v2_test.dart
index 028f813..ea278a7 100644
--- a/generated/googleapis/test/remotebuildexecution/v2_test.dart
+++ b/generated/googleapis/test/remotebuildexecution/v2_test.dart
@@ -3710,7 +3710,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2Action', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2Action();
-      var od = api.BuildBazelRemoteExecutionV2Action.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2Action.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2Action(
           od as api.BuildBazelRemoteExecutionV2Action);
     });
@@ -3721,9 +3723,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.BuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities(
           od as api.BuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities);
     });
@@ -3732,7 +3735,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2ActionResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ActionResult();
-      var od = api.BuildBazelRemoteExecutionV2ActionResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2ActionResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ActionResult(
           od as api.BuildBazelRemoteExecutionV2ActionResult);
     });
@@ -3742,8 +3747,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2BatchReadBlobsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2BatchReadBlobsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2BatchReadBlobsRequest(
           od as api.BuildBazelRemoteExecutionV2BatchReadBlobsRequest);
     });
@@ -3753,8 +3759,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2BatchReadBlobsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2BatchReadBlobsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2BatchReadBlobsResponse(
           od as api.BuildBazelRemoteExecutionV2BatchReadBlobsResponse);
     });
@@ -3765,8 +3772,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse(
           od as api.BuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse);
     });
@@ -3776,8 +3784,9 @@
       'obj-schema-BuildBazelRemoteExecutionV2BatchUpdateBlobsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2BatchUpdateBlobsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequest(
           od as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequest);
     });
@@ -3788,8 +3797,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest(
           od as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest);
     });
@@ -3799,8 +3809,9 @@
       'obj-schema-BuildBazelRemoteExecutionV2BatchUpdateBlobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2BatchUpdateBlobsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponse(
           od as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponse);
     });
@@ -3812,8 +3823,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse(od
           as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse);
     });
@@ -3822,8 +3834,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2CacheCapabilities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2CacheCapabilities();
-      var od =
-          api.BuildBazelRemoteExecutionV2CacheCapabilities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2CacheCapabilities.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2CacheCapabilities(
           od as api.BuildBazelRemoteExecutionV2CacheCapabilities);
     });
@@ -3832,7 +3845,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2Command', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2Command();
-      var od = api.BuildBazelRemoteExecutionV2Command.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2Command.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2Command(
           od as api.BuildBazelRemoteExecutionV2Command);
     });
@@ -3842,9 +3857,10 @@
       'obj-schema-BuildBazelRemoteExecutionV2CommandEnvironmentVariable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2CommandEnvironmentVariable();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.BuildBazelRemoteExecutionV2CommandEnvironmentVariable.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2CommandEnvironmentVariable(
           od as api.BuildBazelRemoteExecutionV2CommandEnvironmentVariable);
     });
@@ -3853,7 +3869,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2Digest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2Digest();
-      var od = api.BuildBazelRemoteExecutionV2Digest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2Digest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2Digest(
           od as api.BuildBazelRemoteExecutionV2Digest);
     });
@@ -3862,7 +3880,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2Directory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2Directory();
-      var od = api.BuildBazelRemoteExecutionV2Directory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2Directory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2Directory(
           od as api.BuildBazelRemoteExecutionV2Directory);
     });
@@ -3871,8 +3891,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2DirectoryNode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2DirectoryNode();
-      var od =
-          api.BuildBazelRemoteExecutionV2DirectoryNode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2DirectoryNode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2DirectoryNode(
           od as api.BuildBazelRemoteExecutionV2DirectoryNode);
     });
@@ -3882,8 +3903,9 @@
       'obj-schema-BuildBazelRemoteExecutionV2ExecuteOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ExecuteOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2ExecuteOperationMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ExecuteOperationMetadata(
           od as api.BuildBazelRemoteExecutionV2ExecuteOperationMetadata);
     });
@@ -3892,8 +3914,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2ExecuteRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ExecuteRequest();
-      var od =
-          api.BuildBazelRemoteExecutionV2ExecuteRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2ExecuteRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ExecuteRequest(
           od as api.BuildBazelRemoteExecutionV2ExecuteRequest);
     });
@@ -3902,8 +3925,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2ExecuteResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ExecuteResponse();
-      var od =
-          api.BuildBazelRemoteExecutionV2ExecuteResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2ExecuteResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ExecuteResponse(
           od as api.BuildBazelRemoteExecutionV2ExecuteResponse);
     });
@@ -3913,8 +3937,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ExecutedActionMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2ExecutedActionMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ExecutedActionMetadata(
           od as api.BuildBazelRemoteExecutionV2ExecutedActionMetadata);
     });
@@ -3924,8 +3949,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ExecutionCapabilities();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2ExecutionCapabilities.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ExecutionCapabilities(
           od as api.BuildBazelRemoteExecutionV2ExecutionCapabilities);
     });
@@ -3934,8 +3960,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2ExecutionPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ExecutionPolicy();
-      var od =
-          api.BuildBazelRemoteExecutionV2ExecutionPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2ExecutionPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ExecutionPolicy(
           od as api.BuildBazelRemoteExecutionV2ExecutionPolicy);
     });
@@ -3944,7 +3971,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2FileNode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2FileNode();
-      var od = api.BuildBazelRemoteExecutionV2FileNode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2FileNode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2FileNode(
           od as api.BuildBazelRemoteExecutionV2FileNode);
     });
@@ -3954,8 +3983,9 @@
       'obj-schema-BuildBazelRemoteExecutionV2FindMissingBlobsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2FindMissingBlobsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2FindMissingBlobsRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2FindMissingBlobsRequest(
           od as api.BuildBazelRemoteExecutionV2FindMissingBlobsRequest);
     });
@@ -3965,8 +3995,9 @@
       'obj-schema-BuildBazelRemoteExecutionV2FindMissingBlobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2FindMissingBlobsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2FindMissingBlobsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2FindMissingBlobsResponse(
           od as api.BuildBazelRemoteExecutionV2FindMissingBlobsResponse);
     });
@@ -3975,8 +4006,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2GetTreeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2GetTreeResponse();
-      var od =
-          api.BuildBazelRemoteExecutionV2GetTreeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2GetTreeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2GetTreeResponse(
           od as api.BuildBazelRemoteExecutionV2GetTreeResponse);
     });
@@ -3985,7 +4017,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2LogFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2LogFile();
-      var od = api.BuildBazelRemoteExecutionV2LogFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2LogFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2LogFile(
           od as api.BuildBazelRemoteExecutionV2LogFile);
     });
@@ -3994,7 +4028,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2NodeProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2NodeProperty();
-      var od = api.BuildBazelRemoteExecutionV2NodeProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2NodeProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2NodeProperty(
           od as api.BuildBazelRemoteExecutionV2NodeProperty);
     });
@@ -4003,8 +4039,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2OutputDirectory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2OutputDirectory();
-      var od =
-          api.BuildBazelRemoteExecutionV2OutputDirectory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2OutputDirectory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2OutputDirectory(
           od as api.BuildBazelRemoteExecutionV2OutputDirectory);
     });
@@ -4013,7 +4050,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2OutputFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2OutputFile();
-      var od = api.BuildBazelRemoteExecutionV2OutputFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2OutputFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2OutputFile(
           od as api.BuildBazelRemoteExecutionV2OutputFile);
     });
@@ -4022,8 +4061,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2OutputSymlink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2OutputSymlink();
-      var od =
-          api.BuildBazelRemoteExecutionV2OutputSymlink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2OutputSymlink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2OutputSymlink(
           od as api.BuildBazelRemoteExecutionV2OutputSymlink);
     });
@@ -4032,7 +4072,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2Platform', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2Platform();
-      var od = api.BuildBazelRemoteExecutionV2Platform.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2Platform.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2Platform(
           od as api.BuildBazelRemoteExecutionV2Platform);
     });
@@ -4041,8 +4083,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2PlatformProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2PlatformProperty();
-      var od =
-          api.BuildBazelRemoteExecutionV2PlatformProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2PlatformProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2PlatformProperty(
           od as api.BuildBazelRemoteExecutionV2PlatformProperty);
     });
@@ -4052,8 +4095,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2PriorityCapabilities();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2PriorityCapabilities.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2PriorityCapabilities(
           od as api.BuildBazelRemoteExecutionV2PriorityCapabilities);
     });
@@ -4065,8 +4109,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildBuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange(od
           as api.BuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange);
     });
@@ -4075,8 +4120,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2RequestMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2RequestMetadata();
-      var od =
-          api.BuildBazelRemoteExecutionV2RequestMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2RequestMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2RequestMetadata(
           od as api.BuildBazelRemoteExecutionV2RequestMetadata);
     });
@@ -4086,8 +4132,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ResultsCachePolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2ResultsCachePolicy.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ResultsCachePolicy(
           od as api.BuildBazelRemoteExecutionV2ResultsCachePolicy);
     });
@@ -4097,8 +4144,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ServerCapabilities();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2ServerCapabilities.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ServerCapabilities(
           od as api.BuildBazelRemoteExecutionV2ServerCapabilities);
     });
@@ -4107,7 +4155,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2SymlinkNode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2SymlinkNode();
-      var od = api.BuildBazelRemoteExecutionV2SymlinkNode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2SymlinkNode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2SymlinkNode(
           od as api.BuildBazelRemoteExecutionV2SymlinkNode);
     });
@@ -4116,7 +4166,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2ToolDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2ToolDetails();
-      var od = api.BuildBazelRemoteExecutionV2ToolDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2ToolDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2ToolDetails(
           od as api.BuildBazelRemoteExecutionV2ToolDetails);
     });
@@ -4125,7 +4177,9 @@
   unittest.group('obj-schema-BuildBazelRemoteExecutionV2Tree', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2Tree();
-      var od = api.BuildBazelRemoteExecutionV2Tree.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelRemoteExecutionV2Tree.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2Tree(
           od as api.BuildBazelRemoteExecutionV2Tree);
     });
@@ -4135,8 +4189,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelRemoteExecutionV2WaitExecutionRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BuildBazelRemoteExecutionV2WaitExecutionRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelRemoteExecutionV2WaitExecutionRequest(
           od as api.BuildBazelRemoteExecutionV2WaitExecutionRequest);
     });
@@ -4145,7 +4200,9 @@
   unittest.group('obj-schema-BuildBazelSemverSemVer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildBazelSemverSemVer();
-      var od = api.BuildBazelSemverSemVer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildBazelSemverSemVer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildBazelSemverSemVer(od as api.BuildBazelSemverSemVer);
     });
   });
@@ -4153,8 +4210,9 @@
   unittest.group('obj-schema-GoogleDevtoolsRemotebuildbotCommandDurations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemotebuildbotCommandDurations();
-      var od =
-          api.GoogleDevtoolsRemotebuildbotCommandDurations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDevtoolsRemotebuildbotCommandDurations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildbotCommandDurations(
           od as api.GoogleDevtoolsRemotebuildbotCommandDurations);
     });
@@ -4163,8 +4221,9 @@
   unittest.group('obj-schema-GoogleDevtoolsRemotebuildbotCommandEvents', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemotebuildbotCommandEvents();
-      var od =
-          api.GoogleDevtoolsRemotebuildbotCommandEvents.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDevtoolsRemotebuildbotCommandEvents.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildbotCommandEvents(
           od as api.GoogleDevtoolsRemotebuildbotCommandEvents);
     });
@@ -4173,8 +4232,9 @@
   unittest.group('obj-schema-GoogleDevtoolsRemotebuildbotCommandStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemotebuildbotCommandStatus();
-      var od =
-          api.GoogleDevtoolsRemotebuildbotCommandStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDevtoolsRemotebuildbotCommandStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildbotCommandStatus(
           od as api.GoogleDevtoolsRemotebuildbotCommandStatus);
     });
@@ -4183,8 +4243,9 @@
   unittest.group('obj-schema-GoogleDevtoolsRemotebuildbotResourceUsage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemotebuildbotResourceUsage();
-      var od =
-          api.GoogleDevtoolsRemotebuildbotResourceUsage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDevtoolsRemotebuildbotResourceUsage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildbotResourceUsage(
           od as api.GoogleDevtoolsRemotebuildbotResourceUsage);
     });
@@ -4194,8 +4255,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemotebuildbotResourceUsageStat();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDevtoolsRemotebuildbotResourceUsageStat.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildbotResourceUsageStat(
           od as api.GoogleDevtoolsRemotebuildbotResourceUsageStat);
     });
@@ -4207,9 +4269,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig(od
           as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig);
@@ -4220,9 +4283,10 @@
       'obj-schema-GoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale(
           od as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale);
     });
@@ -4234,9 +4298,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateInstanceRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateInstanceRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateInstanceRequest(
           od as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateInstanceRequest);
@@ -4249,9 +4314,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateWorkerPoolRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateWorkerPoolRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateWorkerPoolRequest(
           od as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateWorkerPoolRequest);
@@ -4264,9 +4330,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteInstanceRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteInstanceRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteInstanceRequest(
           od as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteInstanceRequest);
@@ -4279,9 +4346,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteWorkerPoolRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteWorkerPoolRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteWorkerPoolRequest(
           od as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteWorkerPoolRequest);
@@ -4294,8 +4362,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy(od
           as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy);
     });
@@ -4307,9 +4376,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(od
           as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature);
@@ -4322,9 +4392,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaGetInstanceRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaGetInstanceRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaGetInstanceRequest(od
           as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaGetInstanceRequest);
@@ -4337,9 +4408,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaGetWorkerPoolRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaGetWorkerPoolRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaGetWorkerPoolRequest(od
           as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaGetWorkerPoolRequest);
@@ -4350,9 +4422,10 @@
       'obj-schema-GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(
           od as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance);
     });
@@ -4364,9 +4437,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesRequest(od
           as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesRequest);
@@ -4379,9 +4453,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesResponse(
           od as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesResponse);
@@ -4394,9 +4469,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsRequest(
           od as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsRequest);
@@ -4409,9 +4485,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsResponse(
           od as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsResponse);
@@ -4424,9 +4501,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateInstanceRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateInstanceRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateInstanceRequest(
           od as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateInstanceRequest);
@@ -4439,9 +4517,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateWorkerPoolRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateWorkerPoolRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateWorkerPoolRequest(
           od as api
               .GoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateWorkerPoolRequest);
@@ -4453,8 +4532,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig(
           od as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig);
     });
@@ -4465,9 +4545,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(
           od as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool);
     });
@@ -4476,8 +4557,9 @@
   unittest.group('obj-schema-GoogleDevtoolsRemoteworkersV1test2AdminTemp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2AdminTemp();
-      var od =
-          api.GoogleDevtoolsRemoteworkersV1test2AdminTemp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDevtoolsRemoteworkersV1test2AdminTemp.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2AdminTemp(
           od as api.GoogleDevtoolsRemoteworkersV1test2AdminTemp);
     });
@@ -4486,7 +4568,9 @@
   unittest.group('obj-schema-GoogleDevtoolsRemoteworkersV1test2Blob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2Blob();
-      var od = api.GoogleDevtoolsRemoteworkersV1test2Blob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDevtoolsRemoteworkersV1test2Blob.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2Blob(
           od as api.GoogleDevtoolsRemoteworkersV1test2Blob);
     });
@@ -4496,8 +4580,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandOutputs();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDevtoolsRemoteworkersV1test2CommandOutputs.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2CommandOutputs(
           od as api.GoogleDevtoolsRemoteworkersV1test2CommandOutputs);
     });
@@ -4507,8 +4592,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandOverhead();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDevtoolsRemoteworkersV1test2CommandOverhead.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2CommandOverhead(
           od as api.GoogleDevtoolsRemoteworkersV1test2CommandOverhead);
     });
@@ -4518,8 +4604,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDevtoolsRemoteworkersV1test2CommandResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2CommandResult(
           od as api.GoogleDevtoolsRemoteworkersV1test2CommandResult);
     });
@@ -4529,8 +4616,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandTask();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDevtoolsRemoteworkersV1test2CommandTask.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2CommandTask(
           od as api.GoogleDevtoolsRemoteworkersV1test2CommandTask);
     });
@@ -4540,8 +4628,9 @@
       'obj-schema-GoogleDevtoolsRemoteworkersV1test2CommandTaskInputs', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandTaskInputs();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDevtoolsRemoteworkersV1test2CommandTaskInputs.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2CommandTaskInputs(
           od as api.GoogleDevtoolsRemoteworkersV1test2CommandTaskInputs);
     });
@@ -4553,9 +4642,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable(
           od as api
               .GoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable);
@@ -4566,9 +4656,10 @@
       'obj-schema-GoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs(
           od as api.GoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs);
     });
@@ -4578,9 +4669,10 @@
       'obj-schema-GoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts(
           od as api.GoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts);
     });
@@ -4589,8 +4681,9 @@
   unittest.group('obj-schema-GoogleDevtoolsRemoteworkersV1test2Digest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2Digest();
-      var od =
-          api.GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2Digest(
           od as api.GoogleDevtoolsRemoteworkersV1test2Digest);
     });
@@ -4599,8 +4692,9 @@
   unittest.group('obj-schema-GoogleDevtoolsRemoteworkersV1test2Directory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2Directory();
-      var od =
-          api.GoogleDevtoolsRemoteworkersV1test2Directory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDevtoolsRemoteworkersV1test2Directory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2Directory(
           od as api.GoogleDevtoolsRemoteworkersV1test2Directory);
     });
@@ -4610,8 +4704,9 @@
       'obj-schema-GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata(
           od as api.GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata);
     });
@@ -4621,8 +4716,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsRemoteworkersV1test2FileMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleDevtoolsRemoteworkersV1test2FileMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsRemoteworkersV1test2FileMetadata(
           od as api.GoogleDevtoolsRemoteworkersV1test2FileMetadata);
     });
@@ -4631,7 +4727,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -4639,7 +4737,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
diff --git a/generated/googleapis/test/reseller/v1_test.dart b/generated/googleapis/test/reseller/v1_test.dart
index 43bd869..58d36fd 100644
--- a/generated/googleapis/test/reseller/v1_test.dart
+++ b/generated/googleapis/test/reseller/v1_test.dart
@@ -578,7 +578,9 @@
   unittest.group('obj-schema-Address', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddress();
-      var od = api.Address.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Address.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAddress(od as api.Address);
     });
   });
@@ -586,7 +588,9 @@
   unittest.group('obj-schema-ChangePlanRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChangePlanRequest();
-      var od = api.ChangePlanRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChangePlanRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChangePlanRequest(od as api.ChangePlanRequest);
     });
   });
@@ -594,7 +598,9 @@
   unittest.group('obj-schema-Customer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomer();
-      var od = api.Customer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Customer.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCustomer(od as api.Customer);
     });
   });
@@ -602,7 +608,9 @@
   unittest.group('obj-schema-RenewalSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRenewalSettings();
-      var od = api.RenewalSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RenewalSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRenewalSettings(od as api.RenewalSettings);
     });
   });
@@ -610,7 +618,9 @@
   unittest.group('obj-schema-ResellernotifyGetwatchdetailsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResellernotifyGetwatchdetailsResponse();
-      var od = api.ResellernotifyGetwatchdetailsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResellernotifyGetwatchdetailsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResellernotifyGetwatchdetailsResponse(
           od as api.ResellernotifyGetwatchdetailsResponse);
     });
@@ -619,7 +629,9 @@
   unittest.group('obj-schema-ResellernotifyResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResellernotifyResource();
-      var od = api.ResellernotifyResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResellernotifyResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResellernotifyResource(od as api.ResellernotifyResource);
     });
   });
@@ -627,7 +639,8 @@
   unittest.group('obj-schema-Seats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeats();
-      var od = api.Seats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Seats.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSeats(od as api.Seats);
     });
   });
@@ -635,7 +648,9 @@
   unittest.group('obj-schema-SubscriptionPlanCommitmentInterval', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionPlanCommitmentInterval();
-      var od = api.SubscriptionPlanCommitmentInterval.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionPlanCommitmentInterval.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionPlanCommitmentInterval(
           od as api.SubscriptionPlanCommitmentInterval);
     });
@@ -644,7 +659,9 @@
   unittest.group('obj-schema-SubscriptionPlan', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionPlan();
-      var od = api.SubscriptionPlan.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionPlan.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionPlan(od as api.SubscriptionPlan);
     });
   });
@@ -652,7 +669,9 @@
   unittest.group('obj-schema-SubscriptionTransferInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionTransferInfo();
-      var od = api.SubscriptionTransferInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionTransferInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionTransferInfo(od as api.SubscriptionTransferInfo);
     });
   });
@@ -660,7 +679,9 @@
   unittest.group('obj-schema-SubscriptionTrialSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionTrialSettings();
-      var od = api.SubscriptionTrialSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionTrialSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionTrialSettings(od as api.SubscriptionTrialSettings);
     });
   });
@@ -668,7 +689,9 @@
   unittest.group('obj-schema-Subscription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscription();
-      var od = api.Subscription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Subscription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscription(od as api.Subscription);
     });
   });
@@ -676,7 +699,9 @@
   unittest.group('obj-schema-Subscriptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptions();
-      var od = api.Subscriptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Subscriptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptions(od as api.Subscriptions);
     });
   });
diff --git a/generated/googleapis/test/retail/v2_test.dart b/generated/googleapis/test/retail/v2_test.dart
index a28a795..77082b6 100644
--- a/generated/googleapis/test/retail/v2_test.dart
+++ b/generated/googleapis/test/retail/v2_test.dart
@@ -3234,7 +3234,9 @@
   unittest.group('obj-schema-GoogleApiHttpBody', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiHttpBody();
-      var od = api.GoogleApiHttpBody.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiHttpBody.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiHttpBody(od as api.GoogleApiHttpBody);
     });
   });
@@ -3242,7 +3244,9 @@
   unittest.group('obj-schema-GoogleCloudRetailLoggingErrorContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailLoggingErrorContext();
-      var od = api.GoogleCloudRetailLoggingErrorContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailLoggingErrorContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailLoggingErrorContext(
           od as api.GoogleCloudRetailLoggingErrorContext);
     });
@@ -3251,7 +3255,9 @@
   unittest.group('obj-schema-GoogleCloudRetailLoggingErrorLog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailLoggingErrorLog();
-      var od = api.GoogleCloudRetailLoggingErrorLog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailLoggingErrorLog.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailLoggingErrorLog(
           od as api.GoogleCloudRetailLoggingErrorLog);
     });
@@ -3260,8 +3266,9 @@
   unittest.group('obj-schema-GoogleCloudRetailLoggingHttpRequestContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailLoggingHttpRequestContext();
-      var od =
-          api.GoogleCloudRetailLoggingHttpRequestContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailLoggingHttpRequestContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailLoggingHttpRequestContext(
           od as api.GoogleCloudRetailLoggingHttpRequestContext);
     });
@@ -3270,8 +3277,9 @@
   unittest.group('obj-schema-GoogleCloudRetailLoggingImportErrorContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailLoggingImportErrorContext();
-      var od =
-          api.GoogleCloudRetailLoggingImportErrorContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailLoggingImportErrorContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailLoggingImportErrorContext(
           od as api.GoogleCloudRetailLoggingImportErrorContext);
     });
@@ -3280,7 +3288,9 @@
   unittest.group('obj-schema-GoogleCloudRetailLoggingServiceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailLoggingServiceContext();
-      var od = api.GoogleCloudRetailLoggingServiceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailLoggingServiceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailLoggingServiceContext(
           od as api.GoogleCloudRetailLoggingServiceContext);
     });
@@ -3289,7 +3299,9 @@
   unittest.group('obj-schema-GoogleCloudRetailLoggingSourceLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailLoggingSourceLocation();
-      var od = api.GoogleCloudRetailLoggingSourceLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailLoggingSourceLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailLoggingSourceLocation(
           od as api.GoogleCloudRetailLoggingSourceLocation);
     });
@@ -3298,7 +3310,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2BigQuerySource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2BigQuerySource();
-      var od = api.GoogleCloudRetailV2BigQuerySource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2BigQuerySource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2BigQuerySource(
           od as api.GoogleCloudRetailV2BigQuerySource);
     });
@@ -3307,7 +3321,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2Catalog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2Catalog();
-      var od = api.GoogleCloudRetailV2Catalog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2Catalog.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2Catalog(od as api.GoogleCloudRetailV2Catalog);
     });
   });
@@ -3315,7 +3331,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2CustomAttribute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2CustomAttribute();
-      var od = api.GoogleCloudRetailV2CustomAttribute.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2CustomAttribute.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2CustomAttribute(
           od as api.GoogleCloudRetailV2CustomAttribute);
     });
@@ -3324,7 +3342,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2GcsSource();
-      var od = api.GoogleCloudRetailV2GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2GcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2GcsSource(od as api.GoogleCloudRetailV2GcsSource);
     });
   });
@@ -3332,7 +3352,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2Image();
-      var od = api.GoogleCloudRetailV2Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2Image.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2Image(od as api.GoogleCloudRetailV2Image);
     });
   });
@@ -3340,7 +3362,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ImportErrorsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ImportErrorsConfig();
-      var od = api.GoogleCloudRetailV2ImportErrorsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ImportErrorsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ImportErrorsConfig(
           od as api.GoogleCloudRetailV2ImportErrorsConfig);
     });
@@ -3349,7 +3373,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ImportMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ImportMetadata();
-      var od = api.GoogleCloudRetailV2ImportMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ImportMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ImportMetadata(
           od as api.GoogleCloudRetailV2ImportMetadata);
     });
@@ -3358,8 +3384,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ImportProductsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ImportProductsRequest();
-      var od =
-          api.GoogleCloudRetailV2ImportProductsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ImportProductsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ImportProductsRequest(
           od as api.GoogleCloudRetailV2ImportProductsRequest);
     });
@@ -3368,8 +3395,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ImportProductsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ImportProductsResponse();
-      var od =
-          api.GoogleCloudRetailV2ImportProductsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ImportProductsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ImportProductsResponse(
           od as api.GoogleCloudRetailV2ImportProductsResponse);
     });
@@ -3378,8 +3406,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ImportUserEventsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ImportUserEventsRequest();
-      var od =
-          api.GoogleCloudRetailV2ImportUserEventsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ImportUserEventsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ImportUserEventsRequest(
           od as api.GoogleCloudRetailV2ImportUserEventsRequest);
     });
@@ -3388,8 +3417,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ImportUserEventsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ImportUserEventsResponse();
-      var od =
-          api.GoogleCloudRetailV2ImportUserEventsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ImportUserEventsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ImportUserEventsResponse(
           od as api.GoogleCloudRetailV2ImportUserEventsResponse);
     });
@@ -3398,7 +3428,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ListCatalogsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ListCatalogsResponse();
-      var od = api.GoogleCloudRetailV2ListCatalogsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ListCatalogsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ListCatalogsResponse(
           od as api.GoogleCloudRetailV2ListCatalogsResponse);
     });
@@ -3407,7 +3439,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2PredictRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2PredictRequest();
-      var od = api.GoogleCloudRetailV2PredictRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2PredictRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2PredictRequest(
           od as api.GoogleCloudRetailV2PredictRequest);
     });
@@ -3416,7 +3450,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2PredictResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2PredictResponse();
-      var od = api.GoogleCloudRetailV2PredictResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2PredictResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2PredictResponse(
           od as api.GoogleCloudRetailV2PredictResponse);
     });
@@ -3426,8 +3462,9 @@
       'obj-schema-GoogleCloudRetailV2PredictResponsePredictionResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2PredictResponsePredictionResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2PredictResponsePredictionResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2PredictResponsePredictionResult(
           od as api.GoogleCloudRetailV2PredictResponsePredictionResult);
     });
@@ -3436,7 +3473,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2PriceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2PriceInfo();
-      var od = api.GoogleCloudRetailV2PriceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2PriceInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2PriceInfo(od as api.GoogleCloudRetailV2PriceInfo);
     });
   });
@@ -3444,7 +3483,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2Product();
-      var od = api.GoogleCloudRetailV2Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2Product.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2Product(od as api.GoogleCloudRetailV2Product);
     });
   });
@@ -3452,7 +3493,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ProductDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ProductDetail();
-      var od = api.GoogleCloudRetailV2ProductDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ProductDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ProductDetail(
           od as api.GoogleCloudRetailV2ProductDetail);
     });
@@ -3461,7 +3504,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ProductInlineSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ProductInlineSource();
-      var od = api.GoogleCloudRetailV2ProductInlineSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ProductInlineSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ProductInlineSource(
           od as api.GoogleCloudRetailV2ProductInlineSource);
     });
@@ -3470,7 +3515,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ProductInputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ProductInputConfig();
-      var od = api.GoogleCloudRetailV2ProductInputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ProductInputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ProductInputConfig(
           od as api.GoogleCloudRetailV2ProductInputConfig);
     });
@@ -3479,7 +3526,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2ProductLevelConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2ProductLevelConfig();
-      var od = api.GoogleCloudRetailV2ProductLevelConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2ProductLevelConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2ProductLevelConfig(
           od as api.GoogleCloudRetailV2ProductLevelConfig);
     });
@@ -3488,7 +3537,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2PurchaseTransaction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2PurchaseTransaction();
-      var od = api.GoogleCloudRetailV2PurchaseTransaction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2PurchaseTransaction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2PurchaseTransaction(
           od as api.GoogleCloudRetailV2PurchaseTransaction);
     });
@@ -3497,7 +3548,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2PurgeMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2PurgeMetadata();
-      var od = api.GoogleCloudRetailV2PurgeMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2PurgeMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2PurgeMetadata(
           od as api.GoogleCloudRetailV2PurgeMetadata);
     });
@@ -3506,8 +3559,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2PurgeUserEventsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2PurgeUserEventsRequest();
-      var od =
-          api.GoogleCloudRetailV2PurgeUserEventsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2PurgeUserEventsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2PurgeUserEventsRequest(
           od as api.GoogleCloudRetailV2PurgeUserEventsRequest);
     });
@@ -3516,8 +3570,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2PurgeUserEventsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2PurgeUserEventsResponse();
-      var od =
-          api.GoogleCloudRetailV2PurgeUserEventsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2PurgeUserEventsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2PurgeUserEventsResponse(
           od as api.GoogleCloudRetailV2PurgeUserEventsResponse);
     });
@@ -3526,8 +3581,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2RejoinUserEventsMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2RejoinUserEventsMetadata();
-      var od =
-          api.GoogleCloudRetailV2RejoinUserEventsMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2RejoinUserEventsMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2RejoinUserEventsMetadata(
           od as api.GoogleCloudRetailV2RejoinUserEventsMetadata);
     });
@@ -3536,8 +3592,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2RejoinUserEventsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2RejoinUserEventsRequest();
-      var od =
-          api.GoogleCloudRetailV2RejoinUserEventsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2RejoinUserEventsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2RejoinUserEventsRequest(
           od as api.GoogleCloudRetailV2RejoinUserEventsRequest);
     });
@@ -3546,8 +3603,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2RejoinUserEventsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2RejoinUserEventsResponse();
-      var od =
-          api.GoogleCloudRetailV2RejoinUserEventsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2RejoinUserEventsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2RejoinUserEventsResponse(
           od as api.GoogleCloudRetailV2RejoinUserEventsResponse);
     });
@@ -3556,7 +3614,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2UserEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2UserEvent();
-      var od = api.GoogleCloudRetailV2UserEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2UserEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2UserEvent(od as api.GoogleCloudRetailV2UserEvent);
     });
   });
@@ -3564,8 +3624,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2UserEventImportSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2UserEventImportSummary();
-      var od =
-          api.GoogleCloudRetailV2UserEventImportSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2UserEventImportSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2UserEventImportSummary(
           od as api.GoogleCloudRetailV2UserEventImportSummary);
     });
@@ -3574,8 +3635,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2UserEventInlineSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2UserEventInlineSource();
-      var od =
-          api.GoogleCloudRetailV2UserEventInlineSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2UserEventInlineSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2UserEventInlineSource(
           od as api.GoogleCloudRetailV2UserEventInlineSource);
     });
@@ -3584,7 +3646,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2UserEventInputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2UserEventInputConfig();
-      var od = api.GoogleCloudRetailV2UserEventInputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2UserEventInputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2UserEventInputConfig(
           od as api.GoogleCloudRetailV2UserEventInputConfig);
     });
@@ -3593,7 +3657,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2UserInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2UserInfo();
-      var od = api.GoogleCloudRetailV2UserInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2UserInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2UserInfo(od as api.GoogleCloudRetailV2UserInfo);
     });
   });
@@ -3601,8 +3667,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2alphaExportErrorsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaExportErrorsConfig();
-      var od =
-          api.GoogleCloudRetailV2alphaExportErrorsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2alphaExportErrorsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaExportErrorsConfig(
           od as api.GoogleCloudRetailV2alphaExportErrorsConfig);
     });
@@ -3611,7 +3678,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2alphaExportMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaExportMetadata();
-      var od = api.GoogleCloudRetailV2alphaExportMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2alphaExportMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaExportMetadata(
           od as api.GoogleCloudRetailV2alphaExportMetadata);
     });
@@ -3621,8 +3690,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaExportProductsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2alphaExportProductsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaExportProductsResponse(
           od as api.GoogleCloudRetailV2alphaExportProductsResponse);
     });
@@ -3632,8 +3702,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaExportUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2alphaExportUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaExportUserEventsResponse(
           od as api.GoogleCloudRetailV2alphaExportUserEventsResponse);
     });
@@ -3642,8 +3713,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2alphaImportErrorsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaImportErrorsConfig();
-      var od =
-          api.GoogleCloudRetailV2alphaImportErrorsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2alphaImportErrorsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaImportErrorsConfig(
           od as api.GoogleCloudRetailV2alphaImportErrorsConfig);
     });
@@ -3652,7 +3724,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2alphaImportMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaImportMetadata();
-      var od = api.GoogleCloudRetailV2alphaImportMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2alphaImportMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaImportMetadata(
           od as api.GoogleCloudRetailV2alphaImportMetadata);
     });
@@ -3662,8 +3736,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaImportProductsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2alphaImportProductsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaImportProductsResponse(
           od as api.GoogleCloudRetailV2alphaImportProductsResponse);
     });
@@ -3673,8 +3748,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaImportUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2alphaImportUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaImportUserEventsResponse(
           od as api.GoogleCloudRetailV2alphaImportUserEventsResponse);
     });
@@ -3683,7 +3759,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2alphaPurgeMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaPurgeMetadata();
-      var od = api.GoogleCloudRetailV2alphaPurgeMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2alphaPurgeMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaPurgeMetadata(
           od as api.GoogleCloudRetailV2alphaPurgeMetadata);
     });
@@ -3693,8 +3771,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaPurgeUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2alphaPurgeUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaPurgeUserEventsResponse(
           od as api.GoogleCloudRetailV2alphaPurgeUserEventsResponse);
     });
@@ -3704,8 +3783,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaRejoinUserEventsMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2alphaRejoinUserEventsMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaRejoinUserEventsMetadata(
           od as api.GoogleCloudRetailV2alphaRejoinUserEventsMetadata);
     });
@@ -3715,8 +3795,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaRejoinUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2alphaRejoinUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaRejoinUserEventsResponse(
           od as api.GoogleCloudRetailV2alphaRejoinUserEventsResponse);
     });
@@ -3726,8 +3807,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2alphaUserEventImportSummary();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2alphaUserEventImportSummary.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2alphaUserEventImportSummary(
           od as api.GoogleCloudRetailV2alphaUserEventImportSummary);
     });
@@ -3736,8 +3818,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2betaExportErrorsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaExportErrorsConfig();
-      var od =
-          api.GoogleCloudRetailV2betaExportErrorsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2betaExportErrorsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaExportErrorsConfig(
           od as api.GoogleCloudRetailV2betaExportErrorsConfig);
     });
@@ -3746,7 +3829,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2betaExportMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaExportMetadata();
-      var od = api.GoogleCloudRetailV2betaExportMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2betaExportMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaExportMetadata(
           od as api.GoogleCloudRetailV2betaExportMetadata);
     });
@@ -3756,8 +3841,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaExportProductsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2betaExportProductsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaExportProductsResponse(
           od as api.GoogleCloudRetailV2betaExportProductsResponse);
     });
@@ -3767,8 +3853,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaExportUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2betaExportUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaExportUserEventsResponse(
           od as api.GoogleCloudRetailV2betaExportUserEventsResponse);
     });
@@ -3777,8 +3864,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2betaImportErrorsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaImportErrorsConfig();
-      var od =
-          api.GoogleCloudRetailV2betaImportErrorsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2betaImportErrorsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaImportErrorsConfig(
           od as api.GoogleCloudRetailV2betaImportErrorsConfig);
     });
@@ -3787,7 +3875,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2betaImportMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaImportMetadata();
-      var od = api.GoogleCloudRetailV2betaImportMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2betaImportMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaImportMetadata(
           od as api.GoogleCloudRetailV2betaImportMetadata);
     });
@@ -3797,8 +3887,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaImportProductsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2betaImportProductsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaImportProductsResponse(
           od as api.GoogleCloudRetailV2betaImportProductsResponse);
     });
@@ -3808,8 +3899,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaImportUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2betaImportUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaImportUserEventsResponse(
           od as api.GoogleCloudRetailV2betaImportUserEventsResponse);
     });
@@ -3818,7 +3910,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2betaPurgeMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaPurgeMetadata();
-      var od = api.GoogleCloudRetailV2betaPurgeMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2betaPurgeMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaPurgeMetadata(
           od as api.GoogleCloudRetailV2betaPurgeMetadata);
     });
@@ -3828,8 +3922,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaPurgeUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2betaPurgeUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaPurgeUserEventsResponse(
           od as api.GoogleCloudRetailV2betaPurgeUserEventsResponse);
     });
@@ -3839,8 +3934,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaRejoinUserEventsMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2betaRejoinUserEventsMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaRejoinUserEventsMetadata(
           od as api.GoogleCloudRetailV2betaRejoinUserEventsMetadata);
     });
@@ -3850,8 +3946,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaRejoinUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2betaRejoinUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaRejoinUserEventsResponse(
           od as api.GoogleCloudRetailV2betaRejoinUserEventsResponse);
     });
@@ -3861,8 +3958,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2betaUserEventImportSummary();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2betaUserEventImportSummary.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2betaUserEventImportSummary(
           od as api.GoogleCloudRetailV2betaUserEventImportSummary);
     });
@@ -3871,8 +3969,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2mainExportErrorsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainExportErrorsConfig();
-      var od =
-          api.GoogleCloudRetailV2mainExportErrorsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2mainExportErrorsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainExportErrorsConfig(
           od as api.GoogleCloudRetailV2mainExportErrorsConfig);
     });
@@ -3881,7 +3980,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2mainExportMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainExportMetadata();
-      var od = api.GoogleCloudRetailV2mainExportMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2mainExportMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainExportMetadata(
           od as api.GoogleCloudRetailV2mainExportMetadata);
     });
@@ -3891,8 +3992,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainExportProductsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2mainExportProductsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainExportProductsResponse(
           od as api.GoogleCloudRetailV2mainExportProductsResponse);
     });
@@ -3902,8 +4004,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainExportUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2mainExportUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainExportUserEventsResponse(
           od as api.GoogleCloudRetailV2mainExportUserEventsResponse);
     });
@@ -3912,8 +4015,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2mainImportErrorsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainImportErrorsConfig();
-      var od =
-          api.GoogleCloudRetailV2mainImportErrorsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2mainImportErrorsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainImportErrorsConfig(
           od as api.GoogleCloudRetailV2mainImportErrorsConfig);
     });
@@ -3922,7 +4026,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2mainImportMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainImportMetadata();
-      var od = api.GoogleCloudRetailV2mainImportMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2mainImportMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainImportMetadata(
           od as api.GoogleCloudRetailV2mainImportMetadata);
     });
@@ -3932,8 +4038,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainImportProductsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2mainImportProductsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainImportProductsResponse(
           od as api.GoogleCloudRetailV2mainImportProductsResponse);
     });
@@ -3943,8 +4050,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainImportUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2mainImportUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainImportUserEventsResponse(
           od as api.GoogleCloudRetailV2mainImportUserEventsResponse);
     });
@@ -3953,7 +4061,9 @@
   unittest.group('obj-schema-GoogleCloudRetailV2mainPurgeMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainPurgeMetadata();
-      var od = api.GoogleCloudRetailV2mainPurgeMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRetailV2mainPurgeMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainPurgeMetadata(
           od as api.GoogleCloudRetailV2mainPurgeMetadata);
     });
@@ -3963,8 +4073,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainPurgeUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2mainPurgeUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainPurgeUserEventsResponse(
           od as api.GoogleCloudRetailV2mainPurgeUserEventsResponse);
     });
@@ -3974,8 +4085,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainRejoinUserEventsMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2mainRejoinUserEventsMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainRejoinUserEventsMetadata(
           od as api.GoogleCloudRetailV2mainRejoinUserEventsMetadata);
     });
@@ -3985,8 +4097,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainRejoinUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2mainRejoinUserEventsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainRejoinUserEventsResponse(
           od as api.GoogleCloudRetailV2mainRejoinUserEventsResponse);
     });
@@ -3996,8 +4109,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRetailV2mainUserEventImportSummary();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRetailV2mainUserEventImportSummary.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRetailV2mainUserEventImportSummary(
           od as api.GoogleCloudRetailV2mainUserEventImportSummary);
     });
@@ -4006,7 +4120,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -4015,7 +4131,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -4023,7 +4141,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -4031,7 +4151,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
diff --git a/generated/googleapis/test/run/v1_test.dart b/generated/googleapis/test/run/v1_test.dart
index c4959e9..bcb0c10 100644
--- a/generated/googleapis/test/run/v1_test.dart
+++ b/generated/googleapis/test/run/v1_test.dart
@@ -2880,7 +2880,9 @@
   unittest.group('obj-schema-Addressable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddressable();
-      var od = api.Addressable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Addressable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddressable(od as api.Addressable);
     });
   });
@@ -2888,7 +2890,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -2896,7 +2900,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -2904,7 +2910,9 @@
   unittest.group('obj-schema-AuthorizedDomain', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizedDomain();
-      var od = api.AuthorizedDomain.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizedDomain.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizedDomain(od as api.AuthorizedDomain);
     });
   });
@@ -2912,7 +2920,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -2920,7 +2930,9 @@
   unittest.group('obj-schema-ConfigMapEnvSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigMapEnvSource();
-      var od = api.ConfigMapEnvSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigMapEnvSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigMapEnvSource(od as api.ConfigMapEnvSource);
     });
   });
@@ -2928,7 +2940,9 @@
   unittest.group('obj-schema-ConfigMapKeySelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigMapKeySelector();
-      var od = api.ConfigMapKeySelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigMapKeySelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigMapKeySelector(od as api.ConfigMapKeySelector);
     });
   });
@@ -2936,7 +2950,9 @@
   unittest.group('obj-schema-ConfigMapVolumeSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigMapVolumeSource();
-      var od = api.ConfigMapVolumeSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigMapVolumeSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigMapVolumeSource(od as api.ConfigMapVolumeSource);
     });
   });
@@ -2944,7 +2960,9 @@
   unittest.group('obj-schema-Configuration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfiguration();
-      var od = api.Configuration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Configuration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfiguration(od as api.Configuration);
     });
   });
@@ -2952,7 +2970,9 @@
   unittest.group('obj-schema-ConfigurationSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigurationSpec();
-      var od = api.ConfigurationSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigurationSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigurationSpec(od as api.ConfigurationSpec);
     });
   });
@@ -2960,7 +2980,9 @@
   unittest.group('obj-schema-ConfigurationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigurationStatus();
-      var od = api.ConfigurationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigurationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigurationStatus(od as api.ConfigurationStatus);
     });
   });
@@ -2968,7 +2990,9 @@
   unittest.group('obj-schema-Container', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainer();
-      var od = api.Container.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Container.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkContainer(od as api.Container);
     });
   });
@@ -2976,7 +3000,9 @@
   unittest.group('obj-schema-ContainerPort', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerPort();
-      var od = api.ContainerPort.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerPort.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerPort(od as api.ContainerPort);
     });
   });
@@ -2984,7 +3010,9 @@
   unittest.group('obj-schema-DomainMapping', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainMapping();
-      var od = api.DomainMapping.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DomainMapping.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDomainMapping(od as api.DomainMapping);
     });
   });
@@ -2992,7 +3020,9 @@
   unittest.group('obj-schema-DomainMappingSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainMappingSpec();
-      var od = api.DomainMappingSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DomainMappingSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDomainMappingSpec(od as api.DomainMappingSpec);
     });
   });
@@ -3000,7 +3030,9 @@
   unittest.group('obj-schema-DomainMappingStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainMappingStatus();
-      var od = api.DomainMappingStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DomainMappingStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDomainMappingStatus(od as api.DomainMappingStatus);
     });
   });
@@ -3008,7 +3040,9 @@
   unittest.group('obj-schema-EnvFromSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvFromSource();
-      var od = api.EnvFromSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnvFromSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvFromSource(od as api.EnvFromSource);
     });
   });
@@ -3016,7 +3050,9 @@
   unittest.group('obj-schema-EnvVar', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvVar();
-      var od = api.EnvVar.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EnvVar.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnvVar(od as api.EnvVar);
     });
   });
@@ -3024,7 +3060,9 @@
   unittest.group('obj-schema-EnvVarSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvVarSource();
-      var od = api.EnvVarSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnvVarSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvVarSource(od as api.EnvVarSource);
     });
   });
@@ -3032,7 +3070,9 @@
   unittest.group('obj-schema-ExecAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecAction();
-      var od = api.ExecAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ExecAction.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExecAction(od as api.ExecAction);
     });
   });
@@ -3040,7 +3080,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -3048,7 +3089,9 @@
   unittest.group('obj-schema-GoogleCloudRunV1Condition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRunV1Condition();
-      var od = api.GoogleCloudRunV1Condition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRunV1Condition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRunV1Condition(od as api.GoogleCloudRunV1Condition);
     });
   });
@@ -3056,7 +3099,9 @@
   unittest.group('obj-schema-HTTPGetAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHTTPGetAction();
-      var od = api.HTTPGetAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HTTPGetAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHTTPGetAction(od as api.HTTPGetAction);
     });
   });
@@ -3064,7 +3109,9 @@
   unittest.group('obj-schema-HTTPHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHTTPHeader();
-      var od = api.HTTPHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HTTPHeader.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHTTPHeader(od as api.HTTPHeader);
     });
   });
@@ -3072,7 +3119,9 @@
   unittest.group('obj-schema-KeyToPath', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyToPath();
-      var od = api.KeyToPath.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.KeyToPath.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKeyToPath(od as api.KeyToPath);
     });
   });
@@ -3080,7 +3129,9 @@
   unittest.group('obj-schema-ListAuthorizedDomainsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAuthorizedDomainsResponse();
-      var od = api.ListAuthorizedDomainsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAuthorizedDomainsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAuthorizedDomainsResponse(
           od as api.ListAuthorizedDomainsResponse);
     });
@@ -3089,7 +3140,9 @@
   unittest.group('obj-schema-ListConfigurationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListConfigurationsResponse();
-      var od = api.ListConfigurationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListConfigurationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListConfigurationsResponse(od as api.ListConfigurationsResponse);
     });
   });
@@ -3097,7 +3150,9 @@
   unittest.group('obj-schema-ListDomainMappingsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDomainMappingsResponse();
-      var od = api.ListDomainMappingsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDomainMappingsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDomainMappingsResponse(od as api.ListDomainMappingsResponse);
     });
   });
@@ -3105,7 +3160,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -3113,7 +3170,9 @@
   unittest.group('obj-schema-ListMeta', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMeta();
-      var od = api.ListMeta.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ListMeta.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkListMeta(od as api.ListMeta);
     });
   });
@@ -3121,7 +3180,9 @@
   unittest.group('obj-schema-ListRevisionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRevisionsResponse();
-      var od = api.ListRevisionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRevisionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRevisionsResponse(od as api.ListRevisionsResponse);
     });
   });
@@ -3129,7 +3190,9 @@
   unittest.group('obj-schema-ListRoutesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRoutesResponse();
-      var od = api.ListRoutesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRoutesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRoutesResponse(od as api.ListRoutesResponse);
     });
   });
@@ -3137,7 +3200,9 @@
   unittest.group('obj-schema-ListServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServicesResponse();
-      var od = api.ListServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
@@ -3145,7 +3210,9 @@
   unittest.group('obj-schema-LocalObjectReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalObjectReference();
-      var od = api.LocalObjectReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalObjectReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalObjectReference(od as api.LocalObjectReference);
     });
   });
@@ -3153,7 +3220,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -3161,7 +3230,9 @@
   unittest.group('obj-schema-ObjectMeta', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectMeta();
-      var od = api.ObjectMeta.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ObjectMeta.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkObjectMeta(od as api.ObjectMeta);
     });
   });
@@ -3169,7 +3240,9 @@
   unittest.group('obj-schema-OwnerReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOwnerReference();
-      var od = api.OwnerReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OwnerReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOwnerReference(od as api.OwnerReference);
     });
   });
@@ -3177,7 +3250,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -3185,7 +3260,8 @@
   unittest.group('obj-schema-Probe', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProbe();
-      var od = api.Probe.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Probe.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProbe(od as api.Probe);
     });
   });
@@ -3193,7 +3269,9 @@
   unittest.group('obj-schema-ResourceRecord', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceRecord();
-      var od = api.ResourceRecord.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceRecord.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceRecord(od as api.ResourceRecord);
     });
   });
@@ -3201,7 +3279,9 @@
   unittest.group('obj-schema-ResourceRequirements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceRequirements();
-      var od = api.ResourceRequirements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceRequirements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceRequirements(od as api.ResourceRequirements);
     });
   });
@@ -3209,7 +3289,9 @@
   unittest.group('obj-schema-Revision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevision();
-      var od = api.Revision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Revision.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRevision(od as api.Revision);
     });
   });
@@ -3217,7 +3299,9 @@
   unittest.group('obj-schema-RevisionSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevisionSpec();
-      var od = api.RevisionSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevisionSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevisionSpec(od as api.RevisionSpec);
     });
   });
@@ -3225,7 +3309,9 @@
   unittest.group('obj-schema-RevisionStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevisionStatus();
-      var od = api.RevisionStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevisionStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevisionStatus(od as api.RevisionStatus);
     });
   });
@@ -3233,7 +3319,9 @@
   unittest.group('obj-schema-RevisionTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevisionTemplate();
-      var od = api.RevisionTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevisionTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevisionTemplate(od as api.RevisionTemplate);
     });
   });
@@ -3241,7 +3329,8 @@
   unittest.group('obj-schema-Route', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoute();
-      var od = api.Route.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Route.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRoute(od as api.Route);
     });
   });
@@ -3249,7 +3338,9 @@
   unittest.group('obj-schema-RouteSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouteSpec();
-      var od = api.RouteSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RouteSpec.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRouteSpec(od as api.RouteSpec);
     });
   });
@@ -3257,7 +3348,9 @@
   unittest.group('obj-schema-RouteStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouteStatus();
-      var od = api.RouteStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouteStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouteStatus(od as api.RouteStatus);
     });
   });
@@ -3265,7 +3358,9 @@
   unittest.group('obj-schema-SecretEnvSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecretEnvSource();
-      var od = api.SecretEnvSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecretEnvSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecretEnvSource(od as api.SecretEnvSource);
     });
   });
@@ -3273,7 +3368,9 @@
   unittest.group('obj-schema-SecretKeySelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecretKeySelector();
-      var od = api.SecretKeySelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecretKeySelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecretKeySelector(od as api.SecretKeySelector);
     });
   });
@@ -3281,7 +3378,9 @@
   unittest.group('obj-schema-SecretVolumeSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecretVolumeSource();
-      var od = api.SecretVolumeSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecretVolumeSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecretVolumeSource(od as api.SecretVolumeSource);
     });
   });
@@ -3289,7 +3388,9 @@
   unittest.group('obj-schema-SecurityContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityContext();
-      var od = api.SecurityContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityContext(od as api.SecurityContext);
     });
   });
@@ -3297,7 +3398,9 @@
   unittest.group('obj-schema-Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildService();
-      var od = api.Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Service.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkService(od as api.Service);
     });
   });
@@ -3305,7 +3408,9 @@
   unittest.group('obj-schema-ServiceSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceSpec();
-      var od = api.ServiceSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceSpec(od as api.ServiceSpec);
     });
   });
@@ -3313,7 +3418,9 @@
   unittest.group('obj-schema-ServiceStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceStatus();
-      var od = api.ServiceStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceStatus(od as api.ServiceStatus);
     });
   });
@@ -3321,7 +3428,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -3329,7 +3438,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -3337,7 +3448,9 @@
   unittest.group('obj-schema-StatusCause', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatusCause();
-      var od = api.StatusCause.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StatusCause.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStatusCause(od as api.StatusCause);
     });
   });
@@ -3345,7 +3458,9 @@
   unittest.group('obj-schema-StatusDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatusDetails();
-      var od = api.StatusDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StatusDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStatusDetails(od as api.StatusDetails);
     });
   });
@@ -3353,7 +3468,9 @@
   unittest.group('obj-schema-TCPSocketAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTCPSocketAction();
-      var od = api.TCPSocketAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TCPSocketAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTCPSocketAction(od as api.TCPSocketAction);
     });
   });
@@ -3361,7 +3478,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -3369,7 +3488,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -3377,7 +3498,9 @@
   unittest.group('obj-schema-TrafficTarget', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrafficTarget();
-      var od = api.TrafficTarget.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrafficTarget.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrafficTarget(od as api.TrafficTarget);
     });
   });
@@ -3385,7 +3508,9 @@
   unittest.group('obj-schema-Volume', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolume();
-      var od = api.Volume.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Volume.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVolume(od as api.Volume);
     });
   });
@@ -3393,7 +3518,9 @@
   unittest.group('obj-schema-VolumeMount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolumeMount();
-      var od = api.VolumeMount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VolumeMount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVolumeMount(od as api.VolumeMount);
     });
   });
diff --git a/generated/googleapis/test/runtimeconfig/v1_test.dart b/generated/googleapis/test/runtimeconfig/v1_test.dart
index 113e64f..c1647cd 100644
--- a/generated/googleapis/test/runtimeconfig/v1_test.dart
+++ b/generated/googleapis/test/runtimeconfig/v1_test.dart
@@ -311,7 +311,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -319,7 +321,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -327,7 +330,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -335,7 +340,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -343,7 +350,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
diff --git a/generated/googleapis/test/safebrowsing/v4_test.dart b/generated/googleapis/test/safebrowsing/v4_test.dart
index 50718ce..362bea6 100644
--- a/generated/googleapis/test/safebrowsing/v4_test.dart
+++ b/generated/googleapis/test/safebrowsing/v4_test.dart
@@ -1166,7 +1166,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -1174,7 +1176,9 @@
   unittest.group('obj-schema-GoogleSecuritySafebrowsingV4Checksum', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4Checksum();
-      var od = api.GoogleSecuritySafebrowsingV4Checksum.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleSecuritySafebrowsingV4Checksum.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4Checksum(
           od as api.GoogleSecuritySafebrowsingV4Checksum);
     });
@@ -1183,7 +1187,9 @@
   unittest.group('obj-schema-GoogleSecuritySafebrowsingV4ClientInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ClientInfo();
-      var od = api.GoogleSecuritySafebrowsingV4ClientInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleSecuritySafebrowsingV4ClientInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ClientInfo(
           od as api.GoogleSecuritySafebrowsingV4ClientInfo);
     });
@@ -1194,8 +1200,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequest(
           od as api.GoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequest);
     });
@@ -1207,9 +1214,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequestListUpdateRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequestListUpdateRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequestListUpdateRequest(
           od as api
               .GoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequestListUpdateRequest);
@@ -1222,9 +1230,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequestListUpdateRequestConstraints();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequestListUpdateRequestConstraints
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequestListUpdateRequestConstraints(
           od as api
               .GoogleSecuritySafebrowsingV4FetchThreatListUpdatesRequestListUpdateRequestConstraints);
@@ -1236,8 +1245,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4FetchThreatListUpdatesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4FetchThreatListUpdatesResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4FetchThreatListUpdatesResponse(
           od as api.GoogleSecuritySafebrowsingV4FetchThreatListUpdatesResponse);
     });
@@ -1249,9 +1259,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleSecuritySafebrowsingV4FetchThreatListUpdatesResponseListUpdateResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleSecuritySafebrowsingV4FetchThreatListUpdatesResponseListUpdateResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4FetchThreatListUpdatesResponseListUpdateResponse(
           od as api
               .GoogleSecuritySafebrowsingV4FetchThreatListUpdatesResponseListUpdateResponse);
@@ -1262,8 +1273,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4FindFullHashesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4FindFullHashesRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4FindFullHashesRequest(
           od as api.GoogleSecuritySafebrowsingV4FindFullHashesRequest);
     });
@@ -1273,8 +1285,9 @@
       'obj-schema-GoogleSecuritySafebrowsingV4FindFullHashesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4FindFullHashesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4FindFullHashesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4FindFullHashesResponse(
           od as api.GoogleSecuritySafebrowsingV4FindFullHashesResponse);
     });
@@ -1284,9 +1297,10 @@
       'obj-schema-GoogleSecuritySafebrowsingV4FindThreatMatchesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4FindThreatMatchesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleSecuritySafebrowsingV4FindThreatMatchesRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4FindThreatMatchesRequest(
           od as api.GoogleSecuritySafebrowsingV4FindThreatMatchesRequest);
     });
@@ -1296,9 +1310,10 @@
       'obj-schema-GoogleSecuritySafebrowsingV4FindThreatMatchesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4FindThreatMatchesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleSecuritySafebrowsingV4FindThreatMatchesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4FindThreatMatchesResponse(
           od as api.GoogleSecuritySafebrowsingV4FindThreatMatchesResponse);
     });
@@ -1308,8 +1323,9 @@
       'obj-schema-GoogleSecuritySafebrowsingV4ListThreatListsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ListThreatListsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4ListThreatListsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ListThreatListsResponse(
           od as api.GoogleSecuritySafebrowsingV4ListThreatListsResponse);
     });
@@ -1318,7 +1334,9 @@
   unittest.group('obj-schema-GoogleSecuritySafebrowsingV4RawHashes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4RawHashes();
-      var od = api.GoogleSecuritySafebrowsingV4RawHashes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleSecuritySafebrowsingV4RawHashes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4RawHashes(
           od as api.GoogleSecuritySafebrowsingV4RawHashes);
     });
@@ -1327,7 +1345,9 @@
   unittest.group('obj-schema-GoogleSecuritySafebrowsingV4RawIndices', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4RawIndices();
-      var od = api.GoogleSecuritySafebrowsingV4RawIndices.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleSecuritySafebrowsingV4RawIndices.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4RawIndices(
           od as api.GoogleSecuritySafebrowsingV4RawIndices);
     });
@@ -1337,8 +1357,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4RiceDeltaEncoding();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4RiceDeltaEncoding.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4RiceDeltaEncoding(
           od as api.GoogleSecuritySafebrowsingV4RiceDeltaEncoding);
     });
@@ -1347,7 +1368,9 @@
   unittest.group('obj-schema-GoogleSecuritySafebrowsingV4ThreatEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ThreatEntry();
-      var od = api.GoogleSecuritySafebrowsingV4ThreatEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleSecuritySafebrowsingV4ThreatEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ThreatEntry(
           od as api.GoogleSecuritySafebrowsingV4ThreatEntry);
     });
@@ -1357,8 +1380,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ThreatEntryMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4ThreatEntryMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ThreatEntryMetadata(
           od as api.GoogleSecuritySafebrowsingV4ThreatEntryMetadata);
     });
@@ -1370,8 +1394,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleSecuritySafebrowsingV4ThreatEntryMetadataMetadataEntry();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4ThreatEntryMetadataMetadataEntry
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ThreatEntryMetadataMetadataEntry(od
           as api.GoogleSecuritySafebrowsingV4ThreatEntryMetadataMetadataEntry);
     });
@@ -1380,8 +1405,9 @@
   unittest.group('obj-schema-GoogleSecuritySafebrowsingV4ThreatEntrySet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ThreatEntrySet();
-      var od =
-          api.GoogleSecuritySafebrowsingV4ThreatEntrySet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleSecuritySafebrowsingV4ThreatEntrySet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ThreatEntrySet(
           od as api.GoogleSecuritySafebrowsingV4ThreatEntrySet);
     });
@@ -1390,7 +1416,9 @@
   unittest.group('obj-schema-GoogleSecuritySafebrowsingV4ThreatHit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ThreatHit();
-      var od = api.GoogleSecuritySafebrowsingV4ThreatHit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleSecuritySafebrowsingV4ThreatHit.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ThreatHit(
           od as api.GoogleSecuritySafebrowsingV4ThreatHit);
     });
@@ -1400,8 +1428,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ThreatHitThreatSource();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4ThreatHitThreatSource.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ThreatHitThreatSource(
           od as api.GoogleSecuritySafebrowsingV4ThreatHitThreatSource);
     });
@@ -1411,8 +1440,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ThreatHitUserInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4ThreatHitUserInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ThreatHitUserInfo(
           od as api.GoogleSecuritySafebrowsingV4ThreatHitUserInfo);
     });
@@ -1421,7 +1451,9 @@
   unittest.group('obj-schema-GoogleSecuritySafebrowsingV4ThreatInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ThreatInfo();
-      var od = api.GoogleSecuritySafebrowsingV4ThreatInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleSecuritySafebrowsingV4ThreatInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ThreatInfo(
           od as api.GoogleSecuritySafebrowsingV4ThreatInfo);
     });
@@ -1431,8 +1463,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ThreatListDescriptor();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleSecuritySafebrowsingV4ThreatListDescriptor.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ThreatListDescriptor(
           od as api.GoogleSecuritySafebrowsingV4ThreatListDescriptor);
     });
@@ -1441,7 +1474,9 @@
   unittest.group('obj-schema-GoogleSecuritySafebrowsingV4ThreatMatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleSecuritySafebrowsingV4ThreatMatch();
-      var od = api.GoogleSecuritySafebrowsingV4ThreatMatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleSecuritySafebrowsingV4ThreatMatch.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleSecuritySafebrowsingV4ThreatMatch(
           od as api.GoogleSecuritySafebrowsingV4ThreatMatch);
     });
diff --git a/generated/googleapis/test/script/v1_test.dart b/generated/googleapis/test/script/v1_test.dart
index be0f1dc..edc9cee 100644
--- a/generated/googleapis/test/script/v1_test.dart
+++ b/generated/googleapis/test/script/v1_test.dart
@@ -1564,7 +1564,9 @@
   unittest.group('obj-schema-Content', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContent();
-      var od = api.Content.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Content.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkContent(od as api.Content);
     });
   });
@@ -1572,7 +1574,9 @@
   unittest.group('obj-schema-CreateProjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateProjectRequest();
-      var od = api.CreateProjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateProjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateProjectRequest(od as api.CreateProjectRequest);
     });
   });
@@ -1580,7 +1584,9 @@
   unittest.group('obj-schema-Deployment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployment();
-      var od = api.Deployment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Deployment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeployment(od as api.Deployment);
     });
   });
@@ -1588,7 +1594,9 @@
   unittest.group('obj-schema-DeploymentConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeploymentConfig();
-      var od = api.DeploymentConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeploymentConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeploymentConfig(od as api.DeploymentConfig);
     });
   });
@@ -1596,7 +1604,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1604,7 +1613,9 @@
   unittest.group('obj-schema-EntryPoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntryPoint();
-      var od = api.EntryPoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EntryPoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEntryPoint(od as api.EntryPoint);
     });
   });
@@ -1612,7 +1623,9 @@
   unittest.group('obj-schema-ExecuteStreamResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecuteStreamResponse();
-      var od = api.ExecuteStreamResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecuteStreamResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecuteStreamResponse(od as api.ExecuteStreamResponse);
     });
   });
@@ -1620,7 +1633,9 @@
   unittest.group('obj-schema-ExecutionError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecutionError();
-      var od = api.ExecutionError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecutionError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecutionError(od as api.ExecutionError);
     });
   });
@@ -1628,7 +1643,9 @@
   unittest.group('obj-schema-ExecutionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecutionRequest();
-      var od = api.ExecutionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecutionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecutionRequest(od as api.ExecutionRequest);
     });
   });
@@ -1636,7 +1653,9 @@
   unittest.group('obj-schema-ExecutionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecutionResponse();
-      var od = api.ExecutionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecutionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecutionResponse(od as api.ExecutionResponse);
     });
   });
@@ -1644,7 +1663,8 @@
   unittest.group('obj-schema-File', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFile();
-      var od = api.File.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.File.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFile(od as api.File);
     });
   });
@@ -1652,7 +1672,9 @@
   unittest.group('obj-schema-GoogleAppsScriptTypeAddOnEntryPoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsScriptTypeAddOnEntryPoint();
-      var od = api.GoogleAppsScriptTypeAddOnEntryPoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsScriptTypeAddOnEntryPoint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsScriptTypeAddOnEntryPoint(
           od as api.GoogleAppsScriptTypeAddOnEntryPoint);
     });
@@ -1661,7 +1683,9 @@
   unittest.group('obj-schema-GoogleAppsScriptTypeExecutionApiConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsScriptTypeExecutionApiConfig();
-      var od = api.GoogleAppsScriptTypeExecutionApiConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsScriptTypeExecutionApiConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsScriptTypeExecutionApiConfig(
           od as api.GoogleAppsScriptTypeExecutionApiConfig);
     });
@@ -1670,8 +1694,9 @@
   unittest.group('obj-schema-GoogleAppsScriptTypeExecutionApiEntryPoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsScriptTypeExecutionApiEntryPoint();
-      var od =
-          api.GoogleAppsScriptTypeExecutionApiEntryPoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsScriptTypeExecutionApiEntryPoint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsScriptTypeExecutionApiEntryPoint(
           od as api.GoogleAppsScriptTypeExecutionApiEntryPoint);
     });
@@ -1680,7 +1705,9 @@
   unittest.group('obj-schema-GoogleAppsScriptTypeFunction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsScriptTypeFunction();
-      var od = api.GoogleAppsScriptTypeFunction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsScriptTypeFunction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsScriptTypeFunction(od as api.GoogleAppsScriptTypeFunction);
     });
   });
@@ -1688,7 +1715,9 @@
   unittest.group('obj-schema-GoogleAppsScriptTypeFunctionSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsScriptTypeFunctionSet();
-      var od = api.GoogleAppsScriptTypeFunctionSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsScriptTypeFunctionSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsScriptTypeFunctionSet(
           od as api.GoogleAppsScriptTypeFunctionSet);
     });
@@ -1697,7 +1726,9 @@
   unittest.group('obj-schema-GoogleAppsScriptTypeProcess', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsScriptTypeProcess();
-      var od = api.GoogleAppsScriptTypeProcess.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsScriptTypeProcess.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsScriptTypeProcess(od as api.GoogleAppsScriptTypeProcess);
     });
   });
@@ -1705,7 +1736,9 @@
   unittest.group('obj-schema-GoogleAppsScriptTypeUser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsScriptTypeUser();
-      var od = api.GoogleAppsScriptTypeUser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsScriptTypeUser.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsScriptTypeUser(od as api.GoogleAppsScriptTypeUser);
     });
   });
@@ -1713,7 +1746,9 @@
   unittest.group('obj-schema-GoogleAppsScriptTypeWebAppConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsScriptTypeWebAppConfig();
-      var od = api.GoogleAppsScriptTypeWebAppConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsScriptTypeWebAppConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsScriptTypeWebAppConfig(
           od as api.GoogleAppsScriptTypeWebAppConfig);
     });
@@ -1722,7 +1757,9 @@
   unittest.group('obj-schema-GoogleAppsScriptTypeWebAppEntryPoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAppsScriptTypeWebAppEntryPoint();
-      var od = api.GoogleAppsScriptTypeWebAppEntryPoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAppsScriptTypeWebAppEntryPoint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAppsScriptTypeWebAppEntryPoint(
           od as api.GoogleAppsScriptTypeWebAppEntryPoint);
     });
@@ -1731,7 +1768,9 @@
   unittest.group('obj-schema-ListDeploymentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDeploymentsResponse();
-      var od = api.ListDeploymentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDeploymentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDeploymentsResponse(od as api.ListDeploymentsResponse);
     });
   });
@@ -1739,7 +1778,9 @@
   unittest.group('obj-schema-ListScriptProcessesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListScriptProcessesResponse();
-      var od = api.ListScriptProcessesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListScriptProcessesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListScriptProcessesResponse(od as api.ListScriptProcessesResponse);
     });
   });
@@ -1747,7 +1788,9 @@
   unittest.group('obj-schema-ListUserProcessesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListUserProcessesResponse();
-      var od = api.ListUserProcessesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListUserProcessesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListUserProcessesResponse(od as api.ListUserProcessesResponse);
     });
   });
@@ -1755,7 +1798,9 @@
   unittest.group('obj-schema-ListValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListValue();
-      var od = api.ListValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ListValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkListValue(od as api.ListValue);
     });
   });
@@ -1763,7 +1808,9 @@
   unittest.group('obj-schema-ListVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListVersionsResponse();
-      var od = api.ListVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListVersionsResponse(od as api.ListVersionsResponse);
     });
   });
@@ -1771,7 +1818,9 @@
   unittest.group('obj-schema-Metrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetrics();
-      var od = api.Metrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metrics.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetrics(od as api.Metrics);
     });
   });
@@ -1779,7 +1828,9 @@
   unittest.group('obj-schema-MetricsValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricsValue();
-      var od = api.MetricsValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricsValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricsValue(od as api.MetricsValue);
     });
   });
@@ -1787,7 +1838,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1795,7 +1848,9 @@
   unittest.group('obj-schema-Project', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProject();
-      var od = api.Project.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Project.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProject(od as api.Project);
     });
   });
@@ -1803,7 +1858,9 @@
   unittest.group('obj-schema-ScriptExecutionResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScriptExecutionResult();
-      var od = api.ScriptExecutionResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScriptExecutionResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScriptExecutionResult(od as api.ScriptExecutionResult);
     });
   });
@@ -1811,7 +1868,9 @@
   unittest.group('obj-schema-ScriptStackTraceElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScriptStackTraceElement();
-      var od = api.ScriptStackTraceElement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScriptStackTraceElement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScriptStackTraceElement(od as api.ScriptStackTraceElement);
     });
   });
@@ -1819,7 +1878,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1827,7 +1888,9 @@
   unittest.group('obj-schema-Struct', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStruct();
-      var od = api.Struct.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Struct.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStruct(od as api.Struct);
     });
   });
@@ -1835,7 +1898,9 @@
   unittest.group('obj-schema-UpdateDeploymentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDeploymentRequest();
-      var od = api.UpdateDeploymentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDeploymentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDeploymentRequest(od as api.UpdateDeploymentRequest);
     });
   });
@@ -1843,7 +1908,8 @@
   unittest.group('obj-schema-Value', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValue();
-      var od = api.Value.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Value.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkValue(od as api.Value);
     });
   });
@@ -1851,7 +1917,9 @@
   unittest.group('obj-schema-Version', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVersion();
-      var od = api.Version.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Version.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVersion(od as api.Version);
     });
   });
diff --git a/generated/googleapis/test/searchconsole/v1_test.dart b/generated/googleapis/test/searchconsole/v1_test.dart
index 010a5d2..bac42a9 100644
--- a/generated/googleapis/test/searchconsole/v1_test.dart
+++ b/generated/googleapis/test/searchconsole/v1_test.dart
@@ -669,7 +669,9 @@
   unittest.group('obj-schema-ApiDataRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiDataRow();
-      var od = api.ApiDataRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ApiDataRow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApiDataRow(od as api.ApiDataRow);
     });
   });
@@ -677,7 +679,9 @@
   unittest.group('obj-schema-ApiDimensionFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiDimensionFilter();
-      var od = api.ApiDimensionFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApiDimensionFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApiDimensionFilter(od as api.ApiDimensionFilter);
     });
   });
@@ -685,7 +689,9 @@
   unittest.group('obj-schema-ApiDimensionFilterGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiDimensionFilterGroup();
-      var od = api.ApiDimensionFilterGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApiDimensionFilterGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApiDimensionFilterGroup(od as api.ApiDimensionFilterGroup);
     });
   });
@@ -693,7 +699,9 @@
   unittest.group('obj-schema-BlockedResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlockedResource();
-      var od = api.BlockedResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BlockedResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBlockedResource(od as api.BlockedResource);
     });
   });
@@ -701,7 +709,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -709,7 +718,9 @@
   unittest.group('obj-schema-MobileFriendlyIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileFriendlyIssue();
-      var od = api.MobileFriendlyIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MobileFriendlyIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMobileFriendlyIssue(od as api.MobileFriendlyIssue);
     });
   });
@@ -717,7 +728,9 @@
   unittest.group('obj-schema-ResourceIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceIssue();
-      var od = api.ResourceIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceIssue(od as api.ResourceIssue);
     });
   });
@@ -725,7 +738,9 @@
   unittest.group('obj-schema-RunMobileFriendlyTestRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunMobileFriendlyTestRequest();
-      var od = api.RunMobileFriendlyTestRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunMobileFriendlyTestRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunMobileFriendlyTestRequest(od as api.RunMobileFriendlyTestRequest);
     });
   });
@@ -733,7 +748,9 @@
   unittest.group('obj-schema-RunMobileFriendlyTestResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunMobileFriendlyTestResponse();
-      var od = api.RunMobileFriendlyTestResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunMobileFriendlyTestResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunMobileFriendlyTestResponse(
           od as api.RunMobileFriendlyTestResponse);
     });
@@ -742,7 +759,9 @@
   unittest.group('obj-schema-SearchAnalyticsQueryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchAnalyticsQueryRequest();
-      var od = api.SearchAnalyticsQueryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchAnalyticsQueryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchAnalyticsQueryRequest(od as api.SearchAnalyticsQueryRequest);
     });
   });
@@ -750,7 +769,9 @@
   unittest.group('obj-schema-SearchAnalyticsQueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchAnalyticsQueryResponse();
-      var od = api.SearchAnalyticsQueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchAnalyticsQueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchAnalyticsQueryResponse(od as api.SearchAnalyticsQueryResponse);
     });
   });
@@ -758,7 +779,9 @@
   unittest.group('obj-schema-SitemapsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSitemapsListResponse();
-      var od = api.SitemapsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SitemapsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSitemapsListResponse(od as api.SitemapsListResponse);
     });
   });
@@ -766,7 +789,9 @@
   unittest.group('obj-schema-SitesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSitesListResponse();
-      var od = api.SitesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SitesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSitesListResponse(od as api.SitesListResponse);
     });
   });
@@ -774,7 +799,9 @@
   unittest.group('obj-schema-TestStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestStatus();
-      var od = api.TestStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestStatus.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestStatus(od as api.TestStatus);
     });
   });
@@ -782,7 +809,9 @@
   unittest.group('obj-schema-WmxSite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWmxSite();
-      var od = api.WmxSite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WmxSite.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWmxSite(od as api.WmxSite);
     });
   });
@@ -790,7 +819,9 @@
   unittest.group('obj-schema-WmxSitemap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWmxSitemap();
-      var od = api.WmxSitemap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WmxSitemap.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWmxSitemap(od as api.WmxSitemap);
     });
   });
@@ -798,7 +829,9 @@
   unittest.group('obj-schema-WmxSitemapContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWmxSitemapContent();
-      var od = api.WmxSitemapContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WmxSitemapContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWmxSitemapContent(od as api.WmxSitemapContent);
     });
   });
diff --git a/generated/googleapis/test/secretmanager/v1_test.dart b/generated/googleapis/test/secretmanager/v1_test.dart
index 0f48076..6a367bc 100644
--- a/generated/googleapis/test/secretmanager/v1_test.dart
+++ b/generated/googleapis/test/secretmanager/v1_test.dart
@@ -1075,7 +1075,9 @@
   unittest.group('obj-schema-AccessSecretVersionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessSecretVersionResponse();
-      var od = api.AccessSecretVersionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessSecretVersionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessSecretVersionResponse(od as api.AccessSecretVersionResponse);
     });
   });
@@ -1083,7 +1085,9 @@
   unittest.group('obj-schema-AddSecretVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddSecretVersionRequest();
-      var od = api.AddSecretVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddSecretVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddSecretVersionRequest(od as api.AddSecretVersionRequest);
     });
   });
@@ -1091,7 +1095,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1099,7 +1105,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1107,7 +1115,9 @@
   unittest.group('obj-schema-Automatic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutomatic();
-      var od = api.Automatic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Automatic.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAutomatic(od as api.Automatic);
     });
   });
@@ -1115,7 +1125,9 @@
   unittest.group('obj-schema-AutomaticStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutomaticStatus();
-      var od = api.AutomaticStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutomaticStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutomaticStatus(od as api.AutomaticStatus);
     });
   });
@@ -1123,7 +1135,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1131,7 +1145,9 @@
   unittest.group('obj-schema-CustomerManagedEncryption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerManagedEncryption();
-      var od = api.CustomerManagedEncryption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerManagedEncryption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerManagedEncryption(od as api.CustomerManagedEncryption);
     });
   });
@@ -1139,7 +1155,9 @@
   unittest.group('obj-schema-CustomerManagedEncryptionStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomerManagedEncryptionStatus();
-      var od = api.CustomerManagedEncryptionStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomerManagedEncryptionStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomerManagedEncryptionStatus(
           od as api.CustomerManagedEncryptionStatus);
     });
@@ -1148,7 +1166,9 @@
   unittest.group('obj-schema-DestroySecretVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDestroySecretVersionRequest();
-      var od = api.DestroySecretVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DestroySecretVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDestroySecretVersionRequest(od as api.DestroySecretVersionRequest);
     });
   });
@@ -1156,7 +1176,9 @@
   unittest.group('obj-schema-DisableSecretVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisableSecretVersionRequest();
-      var od = api.DisableSecretVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisableSecretVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisableSecretVersionRequest(od as api.DisableSecretVersionRequest);
     });
   });
@@ -1164,7 +1186,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1172,7 +1195,9 @@
   unittest.group('obj-schema-EnableSecretVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnableSecretVersionRequest();
-      var od = api.EnableSecretVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnableSecretVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnableSecretVersionRequest(od as api.EnableSecretVersionRequest);
     });
   });
@@ -1180,7 +1205,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1188,7 +1214,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1196,7 +1224,9 @@
   unittest.group('obj-schema-ListSecretVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSecretVersionsResponse();
-      var od = api.ListSecretVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSecretVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSecretVersionsResponse(od as api.ListSecretVersionsResponse);
     });
   });
@@ -1204,7 +1234,9 @@
   unittest.group('obj-schema-ListSecretsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSecretsResponse();
-      var od = api.ListSecretsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSecretsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSecretsResponse(od as api.ListSecretsResponse);
     });
   });
@@ -1212,7 +1244,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1220,7 +1254,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1228,7 +1264,9 @@
   unittest.group('obj-schema-Replica', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplica();
-      var od = api.Replica.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Replica.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReplica(od as api.Replica);
     });
   });
@@ -1236,7 +1274,9 @@
   unittest.group('obj-schema-ReplicaStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplicaStatus();
-      var od = api.ReplicaStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplicaStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplicaStatus(od as api.ReplicaStatus);
     });
   });
@@ -1244,7 +1284,9 @@
   unittest.group('obj-schema-Replication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplication();
-      var od = api.Replication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Replication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplication(od as api.Replication);
     });
   });
@@ -1252,7 +1294,9 @@
   unittest.group('obj-schema-ReplicationStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplicationStatus();
-      var od = api.ReplicationStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplicationStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplicationStatus(od as api.ReplicationStatus);
     });
   });
@@ -1260,7 +1304,9 @@
   unittest.group('obj-schema-Secret', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecret();
-      var od = api.Secret.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Secret.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSecret(od as api.Secret);
     });
   });
@@ -1268,7 +1314,9 @@
   unittest.group('obj-schema-SecretPayload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecretPayload();
-      var od = api.SecretPayload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecretPayload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecretPayload(od as api.SecretPayload);
     });
   });
@@ -1276,7 +1324,9 @@
   unittest.group('obj-schema-SecretVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecretVersion();
-      var od = api.SecretVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecretVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecretVersion(od as api.SecretVersion);
     });
   });
@@ -1284,7 +1334,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1292,7 +1344,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1300,7 +1354,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -1308,7 +1364,8 @@
   unittest.group('obj-schema-Topic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTopic();
-      var od = api.Topic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Topic.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTopic(od as api.Topic);
     });
   });
@@ -1316,7 +1373,9 @@
   unittest.group('obj-schema-UserManaged', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserManaged();
-      var od = api.UserManaged.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserManaged.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserManaged(od as api.UserManaged);
     });
   });
@@ -1324,7 +1383,9 @@
   unittest.group('obj-schema-UserManagedStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserManagedStatus();
-      var od = api.UserManagedStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserManagedStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserManagedStatus(od as api.UserManagedStatus);
     });
   });
diff --git a/generated/googleapis/test/securitycenter/v1_test.dart b/generated/googleapis/test/securitycenter/v1_test.dart
index 98e6340..47ed576 100644
--- a/generated/googleapis/test/securitycenter/v1_test.dart
+++ b/generated/googleapis/test/securitycenter/v1_test.dart
@@ -2261,7 +2261,8 @@
   unittest.group('obj-schema-Asset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsset();
-      var od = api.Asset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Asset.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAsset(od as api.Asset);
     });
   });
@@ -2269,7 +2270,9 @@
   unittest.group('obj-schema-AssetDiscoveryConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAssetDiscoveryConfig();
-      var od = api.AssetDiscoveryConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AssetDiscoveryConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAssetDiscoveryConfig(od as api.AssetDiscoveryConfig);
     });
   });
@@ -2277,7 +2280,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -2285,7 +2290,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -2293,7 +2300,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -2301,7 +2310,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2309,7 +2319,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -2317,7 +2328,9 @@
   unittest.group('obj-schema-Finding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFinding();
-      var od = api.Finding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Finding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFinding(od as api.Finding);
     });
   });
@@ -2325,7 +2338,9 @@
   unittest.group('obj-schema-Folder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolder();
-      var od = api.Folder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Folder.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFolder(od as api.Folder);
     });
   });
@@ -2333,7 +2348,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -2341,7 +2358,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -2350,8 +2369,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSecuritycenterV1NotificationMessage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSecuritycenterV1NotificationMessage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSecuritycenterV1NotificationMessage(
           od as api.GoogleCloudSecuritycenterV1NotificationMessage);
     });
@@ -2360,7 +2380,9 @@
   unittest.group('obj-schema-GoogleCloudSecuritycenterV1Resource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSecuritycenterV1Resource();
-      var od = api.GoogleCloudSecuritycenterV1Resource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudSecuritycenterV1Resource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSecuritycenterV1Resource(
           od as api.GoogleCloudSecuritycenterV1Resource);
     });
@@ -2370,9 +2392,10 @@
       'obj-schema-GoogleCloudSecuritycenterV1RunAssetDiscoveryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSecuritycenterV1RunAssetDiscoveryResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSecuritycenterV1RunAssetDiscoveryResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSecuritycenterV1RunAssetDiscoveryResponse(
           od as api.GoogleCloudSecuritycenterV1RunAssetDiscoveryResponse);
     });
@@ -2383,8 +2406,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSecuritycenterV1beta1RunAssetDiscoveryResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSecuritycenterV1beta1RunAssetDiscoveryResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSecuritycenterV1beta1RunAssetDiscoveryResponse(
           od as api.GoogleCloudSecuritycenterV1beta1RunAssetDiscoveryResponse);
     });
@@ -2393,8 +2417,9 @@
   unittest.group('obj-schema-GoogleCloudSecuritycenterV1p1beta1Finding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSecuritycenterV1p1beta1Finding();
-      var od =
-          api.GoogleCloudSecuritycenterV1p1beta1Finding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudSecuritycenterV1p1beta1Finding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSecuritycenterV1p1beta1Finding(
           od as api.GoogleCloudSecuritycenterV1p1beta1Finding);
     });
@@ -2403,8 +2428,9 @@
   unittest.group('obj-schema-GoogleCloudSecuritycenterV1p1beta1Folder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSecuritycenterV1p1beta1Folder();
-      var od =
-          api.GoogleCloudSecuritycenterV1p1beta1Folder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudSecuritycenterV1p1beta1Folder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSecuritycenterV1p1beta1Folder(
           od as api.GoogleCloudSecuritycenterV1p1beta1Folder);
     });
@@ -2414,9 +2440,10 @@
       'obj-schema-GoogleCloudSecuritycenterV1p1beta1NotificationMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSecuritycenterV1p1beta1NotificationMessage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudSecuritycenterV1p1beta1NotificationMessage.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSecuritycenterV1p1beta1NotificationMessage(
           od as api.GoogleCloudSecuritycenterV1p1beta1NotificationMessage);
     });
@@ -2425,8 +2452,9 @@
   unittest.group('obj-schema-GoogleCloudSecuritycenterV1p1beta1Resource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSecuritycenterV1p1beta1Resource();
-      var od =
-          api.GoogleCloudSecuritycenterV1p1beta1Resource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudSecuritycenterV1p1beta1Resource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSecuritycenterV1p1beta1Resource(
           od as api.GoogleCloudSecuritycenterV1p1beta1Resource);
     });
@@ -2438,8 +2466,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudSecuritycenterV1p1beta1RunAssetDiscoveryResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSecuritycenterV1p1beta1RunAssetDiscoveryResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSecuritycenterV1p1beta1RunAssetDiscoveryResponse(od
           as api.GoogleCloudSecuritycenterV1p1beta1RunAssetDiscoveryResponse);
     });
@@ -2449,8 +2478,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudSecuritycenterV1p1beta1SecurityMarks();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudSecuritycenterV1p1beta1SecurityMarks.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudSecuritycenterV1p1beta1SecurityMarks(
           od as api.GoogleCloudSecuritycenterV1p1beta1SecurityMarks);
     });
@@ -2459,7 +2489,9 @@
   unittest.group('obj-schema-GroupAssetsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupAssetsRequest();
-      var od = api.GroupAssetsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupAssetsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupAssetsRequest(od as api.GroupAssetsRequest);
     });
   });
@@ -2467,7 +2499,9 @@
   unittest.group('obj-schema-GroupAssetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupAssetsResponse();
-      var od = api.GroupAssetsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupAssetsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupAssetsResponse(od as api.GroupAssetsResponse);
     });
   });
@@ -2475,7 +2509,9 @@
   unittest.group('obj-schema-GroupFindingsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupFindingsRequest();
-      var od = api.GroupFindingsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupFindingsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupFindingsRequest(od as api.GroupFindingsRequest);
     });
   });
@@ -2483,7 +2519,9 @@
   unittest.group('obj-schema-GroupFindingsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupFindingsResponse();
-      var od = api.GroupFindingsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupFindingsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupFindingsResponse(od as api.GroupFindingsResponse);
     });
   });
@@ -2491,7 +2529,9 @@
   unittest.group('obj-schema-GroupResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupResult();
-      var od = api.GroupResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupResult(od as api.GroupResult);
     });
   });
@@ -2499,7 +2539,9 @@
   unittest.group('obj-schema-IamPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIamPolicy();
-      var od = api.IamPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IamPolicy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIamPolicy(od as api.IamPolicy);
     });
   });
@@ -2507,7 +2549,9 @@
   unittest.group('obj-schema-ListAssetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAssetsResponse();
-      var od = api.ListAssetsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAssetsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAssetsResponse(od as api.ListAssetsResponse);
     });
   });
@@ -2515,7 +2559,9 @@
   unittest.group('obj-schema-ListAssetsResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAssetsResult();
-      var od = api.ListAssetsResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAssetsResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAssetsResult(od as api.ListAssetsResult);
     });
   });
@@ -2523,7 +2569,9 @@
   unittest.group('obj-schema-ListFindingsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFindingsResponse();
-      var od = api.ListFindingsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFindingsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFindingsResponse(od as api.ListFindingsResponse);
     });
   });
@@ -2531,7 +2579,9 @@
   unittest.group('obj-schema-ListFindingsResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFindingsResult();
-      var od = api.ListFindingsResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFindingsResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFindingsResult(od as api.ListFindingsResult);
     });
   });
@@ -2539,7 +2589,9 @@
   unittest.group('obj-schema-ListNotificationConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNotificationConfigsResponse();
-      var od = api.ListNotificationConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNotificationConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNotificationConfigsResponse(
           od as api.ListNotificationConfigsResponse);
     });
@@ -2548,7 +2600,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -2556,7 +2610,9 @@
   unittest.group('obj-schema-ListSourcesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSourcesResponse();
-      var od = api.ListSourcesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSourcesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSourcesResponse(od as api.ListSourcesResponse);
     });
   });
@@ -2564,7 +2620,9 @@
   unittest.group('obj-schema-NotificationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationConfig();
-      var od = api.NotificationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationConfig(od as api.NotificationConfig);
     });
   });
@@ -2572,7 +2630,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2580,7 +2640,9 @@
   unittest.group('obj-schema-OrganizationSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrganizationSettings();
-      var od = api.OrganizationSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrganizationSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrganizationSettings(od as api.OrganizationSettings);
     });
   });
@@ -2588,7 +2650,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2596,7 +2660,9 @@
   unittest.group('obj-schema-Resource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResource();
-      var od = api.Resource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Resource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResource(od as api.Resource);
     });
   });
@@ -2604,7 +2670,9 @@
   unittest.group('obj-schema-RunAssetDiscoveryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunAssetDiscoveryRequest();
-      var od = api.RunAssetDiscoveryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunAssetDiscoveryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunAssetDiscoveryRequest(od as api.RunAssetDiscoveryRequest);
     });
   });
@@ -2612,7 +2680,9 @@
   unittest.group('obj-schema-SecurityCenterProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityCenterProperties();
-      var od = api.SecurityCenterProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityCenterProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityCenterProperties(od as api.SecurityCenterProperties);
     });
   });
@@ -2620,7 +2690,9 @@
   unittest.group('obj-schema-SecurityMarks', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityMarks();
-      var od = api.SecurityMarks.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityMarks.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityMarks(od as api.SecurityMarks);
     });
   });
@@ -2628,7 +2700,9 @@
   unittest.group('obj-schema-SetFindingStateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetFindingStateRequest();
-      var od = api.SetFindingStateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetFindingStateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetFindingStateRequest(od as api.SetFindingStateRequest);
     });
   });
@@ -2636,7 +2710,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -2644,7 +2720,9 @@
   unittest.group('obj-schema-Source', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSource();
-      var od = api.Source.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Source.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSource(od as api.Source);
     });
   });
@@ -2652,7 +2730,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2660,7 +2740,9 @@
   unittest.group('obj-schema-StreamingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamingConfig();
-      var od = api.StreamingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamingConfig(od as api.StreamingConfig);
     });
   });
@@ -2668,7 +2750,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2676,7 +2760,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis/test/serviceconsumermanagement/v1_test.dart b/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
index c14d45b..4e59356 100644
--- a/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
+++ b/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
@@ -3966,7 +3966,9 @@
   unittest.group('obj-schema-AddTenantProjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddTenantProjectRequest();
-      var od = api.AddTenantProjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddTenantProjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddTenantProjectRequest(od as api.AddTenantProjectRequest);
     });
   });
@@ -3974,7 +3976,8 @@
   unittest.group('obj-schema-Api', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApi();
-      var od = api.Api.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Api.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApi(od as api.Api);
     });
   });
@@ -3982,7 +3985,9 @@
   unittest.group('obj-schema-ApplyTenantProjectConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApplyTenantProjectConfigRequest();
-      var od = api.ApplyTenantProjectConfigRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApplyTenantProjectConfigRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApplyTenantProjectConfigRequest(
           od as api.ApplyTenantProjectConfigRequest);
     });
@@ -3991,7 +3996,9 @@
   unittest.group('obj-schema-AttachTenantProjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttachTenantProjectRequest();
-      var od = api.AttachTenantProjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttachTenantProjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttachTenantProjectRequest(od as api.AttachTenantProjectRequest);
     });
   });
@@ -3999,7 +4006,9 @@
   unittest.group('obj-schema-AuthProvider', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthProvider();
-      var od = api.AuthProvider.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthProvider.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthProvider(od as api.AuthProvider);
     });
   });
@@ -4007,7 +4016,9 @@
   unittest.group('obj-schema-AuthRequirement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthRequirement();
-      var od = api.AuthRequirement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthRequirement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthRequirement(od as api.AuthRequirement);
     });
   });
@@ -4015,7 +4026,9 @@
   unittest.group('obj-schema-Authentication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthentication();
-      var od = api.Authentication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Authentication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthentication(od as api.Authentication);
     });
   });
@@ -4023,7 +4036,9 @@
   unittest.group('obj-schema-AuthenticationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthenticationRule();
-      var od = api.AuthenticationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthenticationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthenticationRule(od as api.AuthenticationRule);
     });
   });
@@ -4031,7 +4046,9 @@
   unittest.group('obj-schema-Backend', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackend();
-      var od = api.Backend.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Backend.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackend(od as api.Backend);
     });
   });
@@ -4039,7 +4056,9 @@
   unittest.group('obj-schema-BackendRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendRule();
-      var od = api.BackendRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendRule(od as api.BackendRule);
     });
   });
@@ -4047,7 +4066,9 @@
   unittest.group('obj-schema-Billing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBilling();
-      var od = api.Billing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Billing.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBilling(od as api.Billing);
     });
   });
@@ -4055,7 +4076,9 @@
   unittest.group('obj-schema-BillingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingConfig();
-      var od = api.BillingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingConfig(od as api.BillingConfig);
     });
   });
@@ -4063,7 +4086,9 @@
   unittest.group('obj-schema-BillingDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingDestination();
-      var od = api.BillingDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingDestination(od as api.BillingDestination);
     });
   });
@@ -4071,7 +4096,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -4079,7 +4106,9 @@
   unittest.group('obj-schema-Context', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContext();
-      var od = api.Context.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Context.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkContext(od as api.Context);
     });
   });
@@ -4087,7 +4116,9 @@
   unittest.group('obj-schema-ContextRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContextRule();
-      var od = api.ContextRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContextRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContextRule(od as api.ContextRule);
     });
   });
@@ -4095,7 +4126,9 @@
   unittest.group('obj-schema-Control', () {
     unittest.test('to-json--from-json', () async {
       var o = buildControl();
-      var od = api.Control.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Control.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkControl(od as api.Control);
     });
   });
@@ -4103,7 +4136,9 @@
   unittest.group('obj-schema-CreateTenancyUnitRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTenancyUnitRequest();
-      var od = api.CreateTenancyUnitRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTenancyUnitRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTenancyUnitRequest(od as api.CreateTenancyUnitRequest);
     });
   });
@@ -4111,7 +4146,9 @@
   unittest.group('obj-schema-CustomError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomError();
-      var od = api.CustomError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomError(od as api.CustomError);
     });
   });
@@ -4119,7 +4156,9 @@
   unittest.group('obj-schema-CustomErrorRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomErrorRule();
-      var od = api.CustomErrorRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomErrorRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomErrorRule(od as api.CustomErrorRule);
     });
   });
@@ -4127,7 +4166,9 @@
   unittest.group('obj-schema-CustomHttpPattern', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomHttpPattern();
-      var od = api.CustomHttpPattern.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomHttpPattern.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomHttpPattern(od as api.CustomHttpPattern);
     });
   });
@@ -4135,7 +4176,9 @@
   unittest.group('obj-schema-DeleteTenantProjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTenantProjectRequest();
-      var od = api.DeleteTenantProjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTenantProjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTenantProjectRequest(od as api.DeleteTenantProjectRequest);
     });
   });
@@ -4143,7 +4186,9 @@
   unittest.group('obj-schema-Documentation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentation();
-      var od = api.Documentation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Documentation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentation(od as api.Documentation);
     });
   });
@@ -4151,7 +4196,9 @@
   unittest.group('obj-schema-DocumentationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentationRule();
-      var od = api.DocumentationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentationRule(od as api.DocumentationRule);
     });
   });
@@ -4159,7 +4206,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -4167,7 +4215,9 @@
   unittest.group('obj-schema-Endpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndpoint();
-      var od = api.Endpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Endpoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEndpoint(od as api.Endpoint);
     });
   });
@@ -4175,7 +4225,8 @@
   unittest.group('obj-schema-Enum', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnum();
-      var od = api.Enum.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Enum.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnum(od as api.Enum);
     });
   });
@@ -4183,7 +4234,9 @@
   unittest.group('obj-schema-EnumValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnumValue();
-      var od = api.EnumValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EnumValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnumValue(od as api.EnumValue);
     });
   });
@@ -4191,7 +4244,8 @@
   unittest.group('obj-schema-Field', () {
     unittest.test('to-json--from-json', () async {
       var o = buildField();
-      var od = api.Field.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Field.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkField(od as api.Field);
     });
   });
@@ -4199,7 +4253,8 @@
   unittest.group('obj-schema-Http', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttp();
-      var od = api.Http.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Http.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttp(od as api.Http);
     });
   });
@@ -4207,7 +4262,9 @@
   unittest.group('obj-schema-HttpRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRule();
-      var od = api.HttpRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpRule(od as api.HttpRule);
     });
   });
@@ -4215,7 +4272,9 @@
   unittest.group('obj-schema-JwtLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJwtLocation();
-      var od = api.JwtLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JwtLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJwtLocation(od as api.JwtLocation);
     });
   });
@@ -4223,7 +4282,9 @@
   unittest.group('obj-schema-LabelDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabelDescriptor();
-      var od = api.LabelDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LabelDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
@@ -4231,7 +4292,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -4239,7 +4302,9 @@
   unittest.group('obj-schema-ListTenancyUnitsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTenancyUnitsResponse();
-      var od = api.ListTenancyUnitsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTenancyUnitsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTenancyUnitsResponse(od as api.ListTenancyUnitsResponse);
     });
   });
@@ -4247,7 +4312,9 @@
   unittest.group('obj-schema-LogDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogDescriptor();
-      var od = api.LogDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogDescriptor(od as api.LogDescriptor);
     });
   });
@@ -4255,7 +4322,9 @@
   unittest.group('obj-schema-Logging', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogging();
-      var od = api.Logging.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Logging.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogging(od as api.Logging);
     });
   });
@@ -4263,7 +4332,9 @@
   unittest.group('obj-schema-LoggingDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLoggingDestination();
-      var od = api.LoggingDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LoggingDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLoggingDestination(od as api.LoggingDestination);
     });
   });
@@ -4271,7 +4342,9 @@
   unittest.group('obj-schema-Method', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMethod();
-      var od = api.Method.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Method.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMethod(od as api.Method);
     });
   });
@@ -4279,7 +4352,9 @@
   unittest.group('obj-schema-MetricDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptor();
-      var od = api.MetricDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
@@ -4287,7 +4362,9 @@
   unittest.group('obj-schema-MetricDescriptorMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptorMetadata();
-      var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptorMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
@@ -4295,7 +4372,9 @@
   unittest.group('obj-schema-MetricRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricRule();
-      var od = api.MetricRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MetricRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetricRule(od as api.MetricRule);
     });
   });
@@ -4303,7 +4382,8 @@
   unittest.group('obj-schema-Mixin', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMixin();
-      var od = api.Mixin.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Mixin.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMixin(od as api.Mixin);
     });
   });
@@ -4311,7 +4391,9 @@
   unittest.group('obj-schema-MonitoredResourceDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoredResourceDescriptor();
-      var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoredResourceDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
@@ -4319,7 +4401,9 @@
   unittest.group('obj-schema-Monitoring', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoring();
-      var od = api.Monitoring.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Monitoring.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMonitoring(od as api.Monitoring);
     });
   });
@@ -4327,7 +4411,9 @@
   unittest.group('obj-schema-MonitoringDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoringDestination();
-      var od = api.MonitoringDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoringDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoringDestination(od as api.MonitoringDestination);
     });
   });
@@ -4335,7 +4421,9 @@
   unittest.group('obj-schema-OAuthRequirements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOAuthRequirements();
-      var od = api.OAuthRequirements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OAuthRequirements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOAuthRequirements(od as api.OAuthRequirements);
     });
   });
@@ -4343,7 +4431,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -4351,7 +4441,9 @@
   unittest.group('obj-schema-Option', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOption();
-      var od = api.Option.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Option.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOption(od as api.Option);
     });
   });
@@ -4359,7 +4451,8 @@
   unittest.group('obj-schema-Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPage();
-      var od = api.Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Page.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPage(od as api.Page);
     });
   });
@@ -4367,7 +4460,9 @@
   unittest.group('obj-schema-PolicyBinding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyBinding();
-      var od = api.PolicyBinding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyBinding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyBinding(od as api.PolicyBinding);
     });
   });
@@ -4375,7 +4470,8 @@
   unittest.group('obj-schema-Quota', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuota();
-      var od = api.Quota.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Quota.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuota(od as api.Quota);
     });
   });
@@ -4383,7 +4479,9 @@
   unittest.group('obj-schema-QuotaLimit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaLimit();
-      var od = api.QuotaLimit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.QuotaLimit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuotaLimit(od as api.QuotaLimit);
     });
   });
@@ -4391,7 +4489,9 @@
   unittest.group('obj-schema-RemoveTenantProjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveTenantProjectRequest();
-      var od = api.RemoveTenantProjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveTenantProjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveTenantProjectRequest(od as api.RemoveTenantProjectRequest);
     });
   });
@@ -4399,7 +4499,9 @@
   unittest.group('obj-schema-SearchTenancyUnitsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchTenancyUnitsResponse();
-      var od = api.SearchTenancyUnitsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchTenancyUnitsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchTenancyUnitsResponse(od as api.SearchTenancyUnitsResponse);
     });
   });
@@ -4407,7 +4509,9 @@
   unittest.group('obj-schema-Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildService();
-      var od = api.Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Service.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkService(od as api.Service);
     });
   });
@@ -4415,7 +4519,9 @@
   unittest.group('obj-schema-ServiceAccountConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccountConfig();
-      var od = api.ServiceAccountConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccountConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccountConfig(od as api.ServiceAccountConfig);
     });
   });
@@ -4423,7 +4529,9 @@
   unittest.group('obj-schema-SourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceContext();
-      var od = api.SourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceContext(od as api.SourceContext);
     });
   });
@@ -4431,7 +4539,9 @@
   unittest.group('obj-schema-SourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceInfo();
-      var od = api.SourceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SourceInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSourceInfo(od as api.SourceInfo);
     });
   });
@@ -4439,7 +4549,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4447,7 +4559,9 @@
   unittest.group('obj-schema-SystemParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameter();
-      var od = api.SystemParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameter(od as api.SystemParameter);
     });
   });
@@ -4455,7 +4569,9 @@
   unittest.group('obj-schema-SystemParameterRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameterRule();
-      var od = api.SystemParameterRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameterRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameterRule(od as api.SystemParameterRule);
     });
   });
@@ -4463,7 +4579,9 @@
   unittest.group('obj-schema-SystemParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameters();
-      var od = api.SystemParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameters(od as api.SystemParameters);
     });
   });
@@ -4471,7 +4589,9 @@
   unittest.group('obj-schema-TenancyUnit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTenancyUnit();
-      var od = api.TenancyUnit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TenancyUnit.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTenancyUnit(od as api.TenancyUnit);
     });
   });
@@ -4479,7 +4599,9 @@
   unittest.group('obj-schema-TenantProjectConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTenantProjectConfig();
-      var od = api.TenantProjectConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TenantProjectConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTenantProjectConfig(od as api.TenantProjectConfig);
     });
   });
@@ -4487,7 +4609,9 @@
   unittest.group('obj-schema-TenantProjectPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTenantProjectPolicy();
-      var od = api.TenantProjectPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TenantProjectPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTenantProjectPolicy(od as api.TenantProjectPolicy);
     });
   });
@@ -4495,7 +4619,9 @@
   unittest.group('obj-schema-TenantResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTenantResource();
-      var od = api.TenantResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TenantResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTenantResource(od as api.TenantResource);
     });
   });
@@ -4503,7 +4629,8 @@
   unittest.group('obj-schema-Type', () {
     unittest.test('to-json--from-json', () async {
       var o = buildType();
-      var od = api.Type.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Type.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkType(od as api.Type);
     });
   });
@@ -4511,7 +4638,9 @@
   unittest.group('obj-schema-UndeleteTenantProjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteTenantProjectRequest();
-      var od = api.UndeleteTenantProjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteTenantProjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteTenantProjectRequest(od as api.UndeleteTenantProjectRequest);
     });
   });
@@ -4519,7 +4648,8 @@
   unittest.group('obj-schema-Usage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsage();
-      var od = api.Usage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Usage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUsage(od as api.Usage);
     });
   });
@@ -4527,7 +4657,9 @@
   unittest.group('obj-schema-UsageRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageRule();
-      var od = api.UsageRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UsageRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUsageRule(od as api.UsageRule);
     });
   });
@@ -4535,7 +4667,9 @@
   unittest.group('obj-schema-V1AddVisibilityLabelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1AddVisibilityLabelsResponse();
-      var od = api.V1AddVisibilityLabelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1AddVisibilityLabelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1AddVisibilityLabelsResponse(
           od as api.V1AddVisibilityLabelsResponse);
     });
@@ -4544,8 +4678,9 @@
   unittest.group('obj-schema-V1Beta1BatchCreateProducerOverridesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1Beta1BatchCreateProducerOverridesResponse();
-      var od =
-          api.V1Beta1BatchCreateProducerOverridesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1Beta1BatchCreateProducerOverridesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1Beta1BatchCreateProducerOverridesResponse(
           od as api.V1Beta1BatchCreateProducerOverridesResponse);
     });
@@ -4554,7 +4689,9 @@
   unittest.group('obj-schema-V1Beta1DisableConsumerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1Beta1DisableConsumerResponse();
-      var od = api.V1Beta1DisableConsumerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1Beta1DisableConsumerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1Beta1DisableConsumerResponse(
           od as api.V1Beta1DisableConsumerResponse);
     });
@@ -4563,7 +4700,9 @@
   unittest.group('obj-schema-V1Beta1EnableConsumerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1Beta1EnableConsumerResponse();
-      var od = api.V1Beta1EnableConsumerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1Beta1EnableConsumerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1Beta1EnableConsumerResponse(
           od as api.V1Beta1EnableConsumerResponse);
     });
@@ -4572,7 +4711,9 @@
   unittest.group('obj-schema-V1Beta1GenerateServiceIdentityResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1Beta1GenerateServiceIdentityResponse();
-      var od = api.V1Beta1GenerateServiceIdentityResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1Beta1GenerateServiceIdentityResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1Beta1GenerateServiceIdentityResponse(
           od as api.V1Beta1GenerateServiceIdentityResponse);
     });
@@ -4581,7 +4722,9 @@
   unittest.group('obj-schema-V1Beta1ImportProducerOverridesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1Beta1ImportProducerOverridesResponse();
-      var od = api.V1Beta1ImportProducerOverridesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1Beta1ImportProducerOverridesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1Beta1ImportProducerOverridesResponse(
           od as api.V1Beta1ImportProducerOverridesResponse);
     });
@@ -4590,8 +4733,9 @@
   unittest.group('obj-schema-V1Beta1ImportProducerQuotaPoliciesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1Beta1ImportProducerQuotaPoliciesResponse();
-      var od =
-          api.V1Beta1ImportProducerQuotaPoliciesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1Beta1ImportProducerQuotaPoliciesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1Beta1ImportProducerQuotaPoliciesResponse(
           od as api.V1Beta1ImportProducerQuotaPoliciesResponse);
     });
@@ -4600,7 +4744,9 @@
   unittest.group('obj-schema-V1Beta1ProducerQuotaPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1Beta1ProducerQuotaPolicy();
-      var od = api.V1Beta1ProducerQuotaPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1Beta1ProducerQuotaPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1Beta1ProducerQuotaPolicy(od as api.V1Beta1ProducerQuotaPolicy);
     });
   });
@@ -4608,7 +4754,9 @@
   unittest.group('obj-schema-V1Beta1QuotaOverride', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1Beta1QuotaOverride();
-      var od = api.V1Beta1QuotaOverride.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1Beta1QuotaOverride.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1Beta1QuotaOverride(od as api.V1Beta1QuotaOverride);
     });
   });
@@ -4616,7 +4764,9 @@
   unittest.group('obj-schema-V1Beta1RefreshConsumerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1Beta1RefreshConsumerResponse();
-      var od = api.V1Beta1RefreshConsumerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1Beta1RefreshConsumerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1Beta1RefreshConsumerResponse(
           od as api.V1Beta1RefreshConsumerResponse);
     });
@@ -4625,7 +4775,9 @@
   unittest.group('obj-schema-V1Beta1ServiceIdentity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1Beta1ServiceIdentity();
-      var od = api.V1Beta1ServiceIdentity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1Beta1ServiceIdentity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1Beta1ServiceIdentity(od as api.V1Beta1ServiceIdentity);
     });
   });
@@ -4633,7 +4785,9 @@
   unittest.group('obj-schema-V1DefaultIdentity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1DefaultIdentity();
-      var od = api.V1DefaultIdentity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1DefaultIdentity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1DefaultIdentity(od as api.V1DefaultIdentity);
     });
   });
@@ -4641,7 +4795,9 @@
   unittest.group('obj-schema-V1DisableConsumerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1DisableConsumerResponse();
-      var od = api.V1DisableConsumerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1DisableConsumerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1DisableConsumerResponse(od as api.V1DisableConsumerResponse);
     });
   });
@@ -4649,7 +4805,9 @@
   unittest.group('obj-schema-V1EnableConsumerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1EnableConsumerResponse();
-      var od = api.V1EnableConsumerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1EnableConsumerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1EnableConsumerResponse(od as api.V1EnableConsumerResponse);
     });
   });
@@ -4657,7 +4815,9 @@
   unittest.group('obj-schema-V1GenerateDefaultIdentityResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1GenerateDefaultIdentityResponse();
-      var od = api.V1GenerateDefaultIdentityResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1GenerateDefaultIdentityResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1GenerateDefaultIdentityResponse(
           od as api.V1GenerateDefaultIdentityResponse);
     });
@@ -4666,7 +4826,9 @@
   unittest.group('obj-schema-V1GenerateServiceAccountResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1GenerateServiceAccountResponse();
-      var od = api.V1GenerateServiceAccountResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1GenerateServiceAccountResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1GenerateServiceAccountResponse(
           od as api.V1GenerateServiceAccountResponse);
     });
@@ -4675,7 +4837,9 @@
   unittest.group('obj-schema-V1RefreshConsumerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1RefreshConsumerResponse();
-      var od = api.V1RefreshConsumerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1RefreshConsumerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1RefreshConsumerResponse(od as api.V1RefreshConsumerResponse);
     });
   });
@@ -4683,7 +4847,9 @@
   unittest.group('obj-schema-V1RemoveVisibilityLabelsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1RemoveVisibilityLabelsResponse();
-      var od = api.V1RemoveVisibilityLabelsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1RemoveVisibilityLabelsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1RemoveVisibilityLabelsResponse(
           od as api.V1RemoveVisibilityLabelsResponse);
     });
@@ -4692,7 +4858,9 @@
   unittest.group('obj-schema-V1ServiceAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildV1ServiceAccount();
-      var od = api.V1ServiceAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.V1ServiceAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkV1ServiceAccount(od as api.V1ServiceAccount);
     });
   });
diff --git a/generated/googleapis/test/servicecontrol/v1_test.dart b/generated/googleapis/test/servicecontrol/v1_test.dart
index bceff2f..24c122b 100644
--- a/generated/googleapis/test/servicecontrol/v1_test.dart
+++ b/generated/googleapis/test/servicecontrol/v1_test.dart
@@ -2951,7 +2951,9 @@
   unittest.group('obj-schema-AllocateInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAllocateInfo();
-      var od = api.AllocateInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AllocateInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAllocateInfo(od as api.AllocateInfo);
     });
   });
@@ -2959,7 +2961,9 @@
   unittest.group('obj-schema-AllocateQuotaRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAllocateQuotaRequest();
-      var od = api.AllocateQuotaRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AllocateQuotaRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAllocateQuotaRequest(od as api.AllocateQuotaRequest);
     });
   });
@@ -2967,7 +2971,9 @@
   unittest.group('obj-schema-AllocateQuotaResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAllocateQuotaResponse();
-      var od = api.AllocateQuotaResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AllocateQuotaResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAllocateQuotaResponse(od as api.AllocateQuotaResponse);
     });
   });
@@ -2975,7 +2981,9 @@
   unittest.group('obj-schema-AttributeValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttributeValue();
-      var od = api.AttributeValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttributeValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttributeValue(od as api.AttributeValue);
     });
   });
@@ -2983,7 +2991,9 @@
   unittest.group('obj-schema-Attributes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttributes();
-      var od = api.Attributes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Attributes.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAttributes(od as api.Attributes);
     });
   });
@@ -2991,7 +3001,9 @@
   unittest.group('obj-schema-AuditLog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLog();
-      var od = api.AuditLog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AuditLog.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAuditLog(od as api.AuditLog);
     });
   });
@@ -2999,7 +3011,8 @@
   unittest.group('obj-schema-Auth', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuth();
-      var od = api.Auth.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Auth.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAuth(od as api.Auth);
     });
   });
@@ -3007,7 +3020,9 @@
   unittest.group('obj-schema-AuthenticationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthenticationInfo();
-      var od = api.AuthenticationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthenticationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthenticationInfo(od as api.AuthenticationInfo);
     });
   });
@@ -3015,7 +3030,9 @@
   unittest.group('obj-schema-AuthorizationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizationInfo();
-      var od = api.AuthorizationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizationInfo(od as api.AuthorizationInfo);
     });
   });
@@ -3023,7 +3040,9 @@
   unittest.group('obj-schema-CheckError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckError();
-      var od = api.CheckError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CheckError.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCheckError(od as api.CheckError);
     });
   });
@@ -3031,7 +3050,9 @@
   unittest.group('obj-schema-CheckInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckInfo();
-      var od = api.CheckInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CheckInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCheckInfo(od as api.CheckInfo);
     });
   });
@@ -3039,7 +3060,9 @@
   unittest.group('obj-schema-CheckRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckRequest();
-      var od = api.CheckRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckRequest(od as api.CheckRequest);
     });
   });
@@ -3047,7 +3070,9 @@
   unittest.group('obj-schema-CheckResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckResponse();
-      var od = api.CheckResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckResponse(od as api.CheckResponse);
     });
   });
@@ -3055,7 +3080,9 @@
   unittest.group('obj-schema-ConsumerInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConsumerInfo();
-      var od = api.ConsumerInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConsumerInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConsumerInfo(od as api.ConsumerInfo);
     });
   });
@@ -3063,7 +3090,9 @@
   unittest.group('obj-schema-Distribution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDistribution();
-      var od = api.Distribution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Distribution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDistribution(od as api.Distribution);
     });
   });
@@ -3071,7 +3100,9 @@
   unittest.group('obj-schema-Exemplar', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExemplar();
-      var od = api.Exemplar.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Exemplar.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExemplar(od as api.Exemplar);
     });
   });
@@ -3079,7 +3110,9 @@
   unittest.group('obj-schema-ExplicitBuckets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExplicitBuckets();
-      var od = api.ExplicitBuckets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExplicitBuckets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExplicitBuckets(od as api.ExplicitBuckets);
     });
   });
@@ -3087,7 +3120,9 @@
   unittest.group('obj-schema-ExponentialBuckets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExponentialBuckets();
-      var od = api.ExponentialBuckets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExponentialBuckets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExponentialBuckets(od as api.ExponentialBuckets);
     });
   });
@@ -3095,7 +3130,9 @@
   unittest.group('obj-schema-FirstPartyPrincipal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirstPartyPrincipal();
-      var od = api.FirstPartyPrincipal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirstPartyPrincipal.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirstPartyPrincipal(od as api.FirstPartyPrincipal);
     });
   });
@@ -3103,7 +3140,9 @@
   unittest.group('obj-schema-HttpRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRequest();
-      var od = api.HttpRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpRequest(od as api.HttpRequest);
     });
   });
@@ -3111,7 +3150,9 @@
   unittest.group('obj-schema-LinearBuckets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinearBuckets();
-      var od = api.LinearBuckets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LinearBuckets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLinearBuckets(od as api.LinearBuckets);
     });
   });
@@ -3119,7 +3160,9 @@
   unittest.group('obj-schema-LogEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogEntry();
-      var od = api.LogEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LogEntry.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogEntry(od as api.LogEntry);
     });
   });
@@ -3127,7 +3170,9 @@
   unittest.group('obj-schema-LogEntryOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogEntryOperation();
-      var od = api.LogEntryOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogEntryOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogEntryOperation(od as api.LogEntryOperation);
     });
   });
@@ -3135,7 +3180,9 @@
   unittest.group('obj-schema-LogEntrySourceLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogEntrySourceLocation();
-      var od = api.LogEntrySourceLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogEntrySourceLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogEntrySourceLocation(od as api.LogEntrySourceLocation);
     });
   });
@@ -3143,7 +3190,9 @@
   unittest.group('obj-schema-MetricValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricValue();
-      var od = api.MetricValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricValue(od as api.MetricValue);
     });
   });
@@ -3151,7 +3200,9 @@
   unittest.group('obj-schema-MetricValueSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricValueSet();
-      var od = api.MetricValueSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricValueSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricValueSet(od as api.MetricValueSet);
     });
   });
@@ -3159,7 +3210,8 @@
   unittest.group('obj-schema-Money', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoney();
-      var od = api.Money.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Money.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMoney(od as api.Money);
     });
   });
@@ -3167,7 +3219,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -3175,7 +3229,8 @@
   unittest.group('obj-schema-Peer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPeer();
-      var od = api.Peer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Peer.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPeer(od as api.Peer);
     });
   });
@@ -3183,7 +3238,9 @@
   unittest.group('obj-schema-QuotaError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaError();
-      var od = api.QuotaError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.QuotaError.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuotaError(od as api.QuotaError);
     });
   });
@@ -3191,7 +3248,9 @@
   unittest.group('obj-schema-QuotaInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaInfo();
-      var od = api.QuotaInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.QuotaInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuotaInfo(od as api.QuotaInfo);
     });
   });
@@ -3199,7 +3258,9 @@
   unittest.group('obj-schema-QuotaOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaOperation();
-      var od = api.QuotaOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QuotaOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQuotaOperation(od as api.QuotaOperation);
     });
   });
@@ -3207,7 +3268,9 @@
   unittest.group('obj-schema-QuotaProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaProperties();
-      var od = api.QuotaProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QuotaProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQuotaProperties(od as api.QuotaProperties);
     });
   });
@@ -3215,7 +3278,9 @@
   unittest.group('obj-schema-ReportError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportError();
-      var od = api.ReportError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportError(od as api.ReportError);
     });
   });
@@ -3223,7 +3288,9 @@
   unittest.group('obj-schema-ReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRequest();
-      var od = api.ReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRequest(od as api.ReportRequest);
     });
   });
@@ -3231,7 +3298,9 @@
   unittest.group('obj-schema-ReportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportResponse();
-      var od = api.ReportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportResponse(od as api.ReportResponse);
     });
   });
@@ -3239,7 +3308,9 @@
   unittest.group('obj-schema-Request', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequest();
-      var od = api.Request.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Request.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRequest(od as api.Request);
     });
   });
@@ -3247,7 +3318,9 @@
   unittest.group('obj-schema-RequestMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestMetadata();
-      var od = api.RequestMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestMetadata(od as api.RequestMetadata);
     });
   });
@@ -3255,7 +3328,9 @@
   unittest.group('obj-schema-Resource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResource();
-      var od = api.Resource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Resource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResource(od as api.Resource);
     });
   });
@@ -3263,7 +3338,9 @@
   unittest.group('obj-schema-ResourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceInfo();
-      var od = api.ResourceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceInfo(od as api.ResourceInfo);
     });
   });
@@ -3271,7 +3348,9 @@
   unittest.group('obj-schema-ResourceLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceLocation();
-      var od = api.ResourceLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceLocation(od as api.ResourceLocation);
     });
   });
@@ -3279,7 +3358,9 @@
   unittest.group('obj-schema-ServiceAccountDelegationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccountDelegationInfo();
-      var od = api.ServiceAccountDelegationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccountDelegationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccountDelegationInfo(od as api.ServiceAccountDelegationInfo);
     });
   });
@@ -3287,7 +3368,9 @@
   unittest.group('obj-schema-SpanContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpanContext();
-      var od = api.SpanContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpanContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpanContext(od as api.SpanContext);
     });
   });
@@ -3295,7 +3378,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -3303,7 +3388,9 @@
   unittest.group('obj-schema-ThirdPartyPrincipal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThirdPartyPrincipal();
-      var od = api.ThirdPartyPrincipal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThirdPartyPrincipal.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThirdPartyPrincipal(od as api.ThirdPartyPrincipal);
     });
   });
@@ -3311,7 +3398,9 @@
   unittest.group('obj-schema-TraceSpan', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTraceSpan();
-      var od = api.TraceSpan.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TraceSpan.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTraceSpan(od as api.TraceSpan);
     });
   });
@@ -3319,7 +3408,9 @@
   unittest.group('obj-schema-TruncatableString', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTruncatableString();
-      var od = api.TruncatableString.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TruncatableString.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTruncatableString(od as api.TruncatableString);
     });
   });
diff --git a/generated/googleapis/test/servicecontrol/v2_test.dart b/generated/googleapis/test/servicecontrol/v2_test.dart
index c6bd7f2..4546b89 100644
--- a/generated/googleapis/test/servicecontrol/v2_test.dart
+++ b/generated/googleapis/test/servicecontrol/v2_test.dart
@@ -1568,7 +1568,8 @@
   unittest.group('obj-schema-Api', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApi();
-      var od = api.Api.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Api.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApi(od as api.Api);
     });
   });
@@ -1576,7 +1577,9 @@
   unittest.group('obj-schema-AttributeContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttributeContext();
-      var od = api.AttributeContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttributeContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttributeContext(od as api.AttributeContext);
     });
   });
@@ -1584,7 +1587,9 @@
   unittest.group('obj-schema-AuditLog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLog();
-      var od = api.AuditLog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AuditLog.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAuditLog(od as api.AuditLog);
     });
   });
@@ -1592,7 +1597,8 @@
   unittest.group('obj-schema-Auth', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuth();
-      var od = api.Auth.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Auth.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAuth(od as api.Auth);
     });
   });
@@ -1600,7 +1606,9 @@
   unittest.group('obj-schema-AuthenticationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthenticationInfo();
-      var od = api.AuthenticationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthenticationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthenticationInfo(od as api.AuthenticationInfo);
     });
   });
@@ -1608,7 +1616,9 @@
   unittest.group('obj-schema-AuthorizationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizationInfo();
-      var od = api.AuthorizationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizationInfo(od as api.AuthorizationInfo);
     });
   });
@@ -1616,7 +1626,9 @@
   unittest.group('obj-schema-CheckRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckRequest();
-      var od = api.CheckRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckRequest(od as api.CheckRequest);
     });
   });
@@ -1624,7 +1636,9 @@
   unittest.group('obj-schema-CheckResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCheckResponse();
-      var od = api.CheckResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CheckResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCheckResponse(od as api.CheckResponse);
     });
   });
@@ -1632,7 +1646,9 @@
   unittest.group('obj-schema-FirstPartyPrincipal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirstPartyPrincipal();
-      var od = api.FirstPartyPrincipal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirstPartyPrincipal.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirstPartyPrincipal(od as api.FirstPartyPrincipal);
     });
   });
@@ -1640,7 +1656,8 @@
   unittest.group('obj-schema-Peer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPeer();
-      var od = api.Peer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Peer.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPeer(od as api.Peer);
     });
   });
@@ -1648,7 +1665,9 @@
   unittest.group('obj-schema-ReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRequest();
-      var od = api.ReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRequest(od as api.ReportRequest);
     });
   });
@@ -1656,7 +1675,9 @@
   unittest.group('obj-schema-ReportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportResponse();
-      var od = api.ReportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportResponse(od as api.ReportResponse);
     });
   });
@@ -1664,7 +1685,9 @@
   unittest.group('obj-schema-Request', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequest();
-      var od = api.Request.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Request.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRequest(od as api.Request);
     });
   });
@@ -1672,7 +1695,9 @@
   unittest.group('obj-schema-RequestMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestMetadata();
-      var od = api.RequestMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestMetadata(od as api.RequestMetadata);
     });
   });
@@ -1680,7 +1705,9 @@
   unittest.group('obj-schema-Resource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResource();
-      var od = api.Resource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Resource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResource(od as api.Resource);
     });
   });
@@ -1688,7 +1715,9 @@
   unittest.group('obj-schema-ResourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceInfo();
-      var od = api.ResourceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceInfo(od as api.ResourceInfo);
     });
   });
@@ -1696,7 +1725,9 @@
   unittest.group('obj-schema-ResourceLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceLocation();
-      var od = api.ResourceLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceLocation(od as api.ResourceLocation);
     });
   });
@@ -1704,7 +1735,9 @@
   unittest.group('obj-schema-Response', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResponse();
-      var od = api.Response.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Response.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResponse(od as api.Response);
     });
   });
@@ -1712,7 +1745,9 @@
   unittest.group('obj-schema-ServiceAccountDelegationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccountDelegationInfo();
-      var od = api.ServiceAccountDelegationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccountDelegationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccountDelegationInfo(od as api.ServiceAccountDelegationInfo);
     });
   });
@@ -1720,7 +1755,9 @@
   unittest.group('obj-schema-SpanContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpanContext();
-      var od = api.SpanContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpanContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpanContext(od as api.SpanContext);
     });
   });
@@ -1728,7 +1765,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1736,7 +1775,9 @@
   unittest.group('obj-schema-ThirdPartyPrincipal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThirdPartyPrincipal();
-      var od = api.ThirdPartyPrincipal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThirdPartyPrincipal.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThirdPartyPrincipal(od as api.ThirdPartyPrincipal);
     });
   });
diff --git a/generated/googleapis/test/servicedirectory/v1_test.dart b/generated/googleapis/test/servicedirectory/v1_test.dart
index f52bb6b..e62728d 100644
--- a/generated/googleapis/test/servicedirectory/v1_test.dart
+++ b/generated/googleapis/test/servicedirectory/v1_test.dart
@@ -756,7 +756,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -764,7 +766,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -772,7 +775,9 @@
   unittest.group('obj-schema-Endpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndpoint();
-      var od = api.Endpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Endpoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEndpoint(od as api.Endpoint);
     });
   });
@@ -780,7 +785,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -788,7 +794,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -796,7 +804,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -804,7 +814,9 @@
   unittest.group('obj-schema-ListEndpointsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListEndpointsResponse();
-      var od = api.ListEndpointsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListEndpointsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListEndpointsResponse(od as api.ListEndpointsResponse);
     });
   });
@@ -812,7 +824,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -820,7 +834,9 @@
   unittest.group('obj-schema-ListNamespacesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNamespacesResponse();
-      var od = api.ListNamespacesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNamespacesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNamespacesResponse(od as api.ListNamespacesResponse);
     });
   });
@@ -828,7 +844,9 @@
   unittest.group('obj-schema-ListServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServicesResponse();
-      var od = api.ListServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
@@ -836,7 +854,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -844,7 +864,9 @@
   unittest.group('obj-schema-Namespace', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamespace();
-      var od = api.Namespace.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Namespace.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNamespace(od as api.Namespace);
     });
   });
@@ -852,7 +874,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -860,7 +884,9 @@
   unittest.group('obj-schema-ResolveServiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResolveServiceRequest();
-      var od = api.ResolveServiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResolveServiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResolveServiceRequest(od as api.ResolveServiceRequest);
     });
   });
@@ -868,7 +894,9 @@
   unittest.group('obj-schema-ResolveServiceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResolveServiceResponse();
-      var od = api.ResolveServiceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResolveServiceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResolveServiceResponse(od as api.ResolveServiceResponse);
     });
   });
@@ -876,7 +904,9 @@
   unittest.group('obj-schema-Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildService();
-      var od = api.Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Service.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkService(od as api.Service);
     });
   });
@@ -884,7 +914,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -892,7 +924,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -900,7 +934,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis/test/servicemanagement/v1_test.dart b/generated/googleapis/test/servicemanagement/v1_test.dart
index d03518c..0d08099 100644
--- a/generated/googleapis/test/servicemanagement/v1_test.dart
+++ b/generated/googleapis/test/servicemanagement/v1_test.dart
@@ -4071,7 +4071,9 @@
   unittest.group('obj-schema-Advice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdvice();
-      var od = api.Advice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Advice.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdvice(od as api.Advice);
     });
   });
@@ -4079,7 +4081,8 @@
   unittest.group('obj-schema-Api', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApi();
-      var od = api.Api.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Api.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApi(od as api.Api);
     });
   });
@@ -4087,7 +4090,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -4095,7 +4100,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -4103,7 +4110,9 @@
   unittest.group('obj-schema-AuthProvider', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthProvider();
-      var od = api.AuthProvider.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthProvider.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthProvider(od as api.AuthProvider);
     });
   });
@@ -4111,7 +4120,9 @@
   unittest.group('obj-schema-AuthRequirement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthRequirement();
-      var od = api.AuthRequirement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthRequirement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthRequirement(od as api.AuthRequirement);
     });
   });
@@ -4119,7 +4130,9 @@
   unittest.group('obj-schema-Authentication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthentication();
-      var od = api.Authentication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Authentication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthentication(od as api.Authentication);
     });
   });
@@ -4127,7 +4140,9 @@
   unittest.group('obj-schema-AuthenticationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthenticationRule();
-      var od = api.AuthenticationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthenticationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthenticationRule(od as api.AuthenticationRule);
     });
   });
@@ -4135,7 +4150,9 @@
   unittest.group('obj-schema-Backend', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackend();
-      var od = api.Backend.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Backend.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackend(od as api.Backend);
     });
   });
@@ -4143,7 +4160,9 @@
   unittest.group('obj-schema-BackendRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendRule();
-      var od = api.BackendRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendRule(od as api.BackendRule);
     });
   });
@@ -4151,7 +4170,9 @@
   unittest.group('obj-schema-Billing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBilling();
-      var od = api.Billing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Billing.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBilling(od as api.Billing);
     });
   });
@@ -4159,7 +4180,9 @@
   unittest.group('obj-schema-BillingDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingDestination();
-      var od = api.BillingDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingDestination(od as api.BillingDestination);
     });
   });
@@ -4167,7 +4190,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -4175,7 +4200,9 @@
   unittest.group('obj-schema-ChangeReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChangeReport();
-      var od = api.ChangeReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChangeReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChangeReport(od as api.ChangeReport);
     });
   });
@@ -4183,7 +4210,9 @@
   unittest.group('obj-schema-ConfigChange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigChange();
-      var od = api.ConfigChange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigChange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigChange(od as api.ConfigChange);
     });
   });
@@ -4191,7 +4220,9 @@
   unittest.group('obj-schema-ConfigFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigFile();
-      var od = api.ConfigFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ConfigFile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkConfigFile(od as api.ConfigFile);
     });
   });
@@ -4199,7 +4230,9 @@
   unittest.group('obj-schema-ConfigRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigRef();
-      var od = api.ConfigRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ConfigRef.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkConfigRef(od as api.ConfigRef);
     });
   });
@@ -4207,7 +4240,9 @@
   unittest.group('obj-schema-ConfigSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigSource();
-      var od = api.ConfigSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigSource(od as api.ConfigSource);
     });
   });
@@ -4215,7 +4250,9 @@
   unittest.group('obj-schema-Context', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContext();
-      var od = api.Context.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Context.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkContext(od as api.Context);
     });
   });
@@ -4223,7 +4260,9 @@
   unittest.group('obj-schema-ContextRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContextRule();
-      var od = api.ContextRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContextRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContextRule(od as api.ContextRule);
     });
   });
@@ -4231,7 +4270,9 @@
   unittest.group('obj-schema-Control', () {
     unittest.test('to-json--from-json', () async {
       var o = buildControl();
-      var od = api.Control.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Control.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkControl(od as api.Control);
     });
   });
@@ -4239,7 +4280,9 @@
   unittest.group('obj-schema-CustomError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomError();
-      var od = api.CustomError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomError(od as api.CustomError);
     });
   });
@@ -4247,7 +4290,9 @@
   unittest.group('obj-schema-CustomErrorRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomErrorRule();
-      var od = api.CustomErrorRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomErrorRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomErrorRule(od as api.CustomErrorRule);
     });
   });
@@ -4255,7 +4300,9 @@
   unittest.group('obj-schema-CustomHttpPattern', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomHttpPattern();
-      var od = api.CustomHttpPattern.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomHttpPattern.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomHttpPattern(od as api.CustomHttpPattern);
     });
   });
@@ -4263,7 +4310,9 @@
   unittest.group('obj-schema-DeleteServiceStrategy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteServiceStrategy();
-      var od = api.DeleteServiceStrategy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteServiceStrategy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteServiceStrategy(od as api.DeleteServiceStrategy);
     });
   });
@@ -4271,7 +4320,9 @@
   unittest.group('obj-schema-Diagnostic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiagnostic();
-      var od = api.Diagnostic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Diagnostic.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDiagnostic(od as api.Diagnostic);
     });
   });
@@ -4279,7 +4330,9 @@
   unittest.group('obj-schema-DisableServiceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisableServiceResponse();
-      var od = api.DisableServiceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisableServiceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisableServiceResponse(od as api.DisableServiceResponse);
     });
   });
@@ -4287,7 +4340,9 @@
   unittest.group('obj-schema-Documentation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentation();
-      var od = api.Documentation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Documentation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentation(od as api.Documentation);
     });
   });
@@ -4295,7 +4350,9 @@
   unittest.group('obj-schema-DocumentationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentationRule();
-      var od = api.DocumentationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentationRule(od as api.DocumentationRule);
     });
   });
@@ -4303,7 +4360,9 @@
   unittest.group('obj-schema-EnableServiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnableServiceRequest();
-      var od = api.EnableServiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnableServiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnableServiceRequest(od as api.EnableServiceRequest);
     });
   });
@@ -4311,7 +4370,9 @@
   unittest.group('obj-schema-EnableServiceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnableServiceResponse();
-      var od = api.EnableServiceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnableServiceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnableServiceResponse(od as api.EnableServiceResponse);
     });
   });
@@ -4319,7 +4380,9 @@
   unittest.group('obj-schema-Endpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndpoint();
-      var od = api.Endpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Endpoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEndpoint(od as api.Endpoint);
     });
   });
@@ -4327,7 +4390,8 @@
   unittest.group('obj-schema-Enum', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnum();
-      var od = api.Enum.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Enum.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnum(od as api.Enum);
     });
   });
@@ -4335,7 +4399,9 @@
   unittest.group('obj-schema-EnumValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnumValue();
-      var od = api.EnumValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EnumValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnumValue(od as api.EnumValue);
     });
   });
@@ -4343,7 +4409,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -4351,7 +4418,8 @@
   unittest.group('obj-schema-Field', () {
     unittest.test('to-json--from-json', () async {
       var o = buildField();
-      var od = api.Field.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Field.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkField(od as api.Field);
     });
   });
@@ -4359,7 +4427,9 @@
   unittest.group('obj-schema-FlowErrorDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFlowErrorDetails();
-      var od = api.FlowErrorDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FlowErrorDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFlowErrorDetails(od as api.FlowErrorDetails);
     });
   });
@@ -4367,7 +4437,9 @@
   unittest.group('obj-schema-GenerateConfigReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateConfigReportRequest();
-      var od = api.GenerateConfigReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateConfigReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateConfigReportRequest(od as api.GenerateConfigReportRequest);
     });
   });
@@ -4375,7 +4447,9 @@
   unittest.group('obj-schema-GenerateConfigReportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateConfigReportResponse();
-      var od = api.GenerateConfigReportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateConfigReportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateConfigReportResponse(od as api.GenerateConfigReportResponse);
     });
   });
@@ -4383,7 +4457,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -4391,7 +4467,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -4399,7 +4477,8 @@
   unittest.group('obj-schema-Http', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttp();
-      var od = api.Http.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Http.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttp(od as api.Http);
     });
   });
@@ -4407,7 +4486,9 @@
   unittest.group('obj-schema-HttpRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRule();
-      var od = api.HttpRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpRule(od as api.HttpRule);
     });
   });
@@ -4415,7 +4496,9 @@
   unittest.group('obj-schema-JwtLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJwtLocation();
-      var od = api.JwtLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JwtLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJwtLocation(od as api.JwtLocation);
     });
   });
@@ -4423,7 +4506,9 @@
   unittest.group('obj-schema-LabelDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabelDescriptor();
-      var od = api.LabelDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LabelDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
@@ -4431,7 +4516,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -4439,7 +4526,9 @@
   unittest.group('obj-schema-ListServiceConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServiceConfigsResponse();
-      var od = api.ListServiceConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServiceConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServiceConfigsResponse(od as api.ListServiceConfigsResponse);
     });
   });
@@ -4447,7 +4536,9 @@
   unittest.group('obj-schema-ListServiceRolloutsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServiceRolloutsResponse();
-      var od = api.ListServiceRolloutsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServiceRolloutsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServiceRolloutsResponse(od as api.ListServiceRolloutsResponse);
     });
   });
@@ -4455,7 +4546,9 @@
   unittest.group('obj-schema-ListServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServicesResponse();
-      var od = api.ListServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
@@ -4463,7 +4556,9 @@
   unittest.group('obj-schema-LogDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogDescriptor();
-      var od = api.LogDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogDescriptor(od as api.LogDescriptor);
     });
   });
@@ -4471,7 +4566,9 @@
   unittest.group('obj-schema-Logging', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogging();
-      var od = api.Logging.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Logging.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogging(od as api.Logging);
     });
   });
@@ -4479,7 +4576,9 @@
   unittest.group('obj-schema-LoggingDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLoggingDestination();
-      var od = api.LoggingDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LoggingDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLoggingDestination(od as api.LoggingDestination);
     });
   });
@@ -4487,7 +4586,9 @@
   unittest.group('obj-schema-ManagedService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagedService();
-      var od = api.ManagedService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagedService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagedService(od as api.ManagedService);
     });
   });
@@ -4495,7 +4596,9 @@
   unittest.group('obj-schema-Method', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMethod();
-      var od = api.Method.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Method.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMethod(od as api.Method);
     });
   });
@@ -4503,7 +4606,9 @@
   unittest.group('obj-schema-MetricDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptor();
-      var od = api.MetricDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
@@ -4511,7 +4616,9 @@
   unittest.group('obj-schema-MetricDescriptorMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptorMetadata();
-      var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptorMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
@@ -4519,7 +4626,9 @@
   unittest.group('obj-schema-MetricRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricRule();
-      var od = api.MetricRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MetricRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetricRule(od as api.MetricRule);
     });
   });
@@ -4527,7 +4636,8 @@
   unittest.group('obj-schema-Mixin', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMixin();
-      var od = api.Mixin.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Mixin.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMixin(od as api.Mixin);
     });
   });
@@ -4535,7 +4645,9 @@
   unittest.group('obj-schema-MonitoredResourceDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoredResourceDescriptor();
-      var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoredResourceDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
@@ -4543,7 +4655,9 @@
   unittest.group('obj-schema-Monitoring', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoring();
-      var od = api.Monitoring.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Monitoring.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMonitoring(od as api.Monitoring);
     });
   });
@@ -4551,7 +4665,9 @@
   unittest.group('obj-schema-MonitoringDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoringDestination();
-      var od = api.MonitoringDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoringDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoringDestination(od as api.MonitoringDestination);
     });
   });
@@ -4559,7 +4675,9 @@
   unittest.group('obj-schema-OAuthRequirements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOAuthRequirements();
-      var od = api.OAuthRequirements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OAuthRequirements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOAuthRequirements(od as api.OAuthRequirements);
     });
   });
@@ -4567,7 +4685,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -4575,7 +4695,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -4583,7 +4705,9 @@
   unittest.group('obj-schema-Option', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOption();
-      var od = api.Option.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Option.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOption(od as api.Option);
     });
   });
@@ -4591,7 +4715,8 @@
   unittest.group('obj-schema-Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPage();
-      var od = api.Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Page.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPage(od as api.Page);
     });
   });
@@ -4599,7 +4724,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -4607,7 +4734,8 @@
   unittest.group('obj-schema-Quota', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuota();
-      var od = api.Quota.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Quota.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuota(od as api.Quota);
     });
   });
@@ -4615,7 +4743,9 @@
   unittest.group('obj-schema-QuotaLimit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaLimit();
-      var od = api.QuotaLimit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.QuotaLimit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuotaLimit(od as api.QuotaLimit);
     });
   });
@@ -4623,7 +4753,9 @@
   unittest.group('obj-schema-ResourceReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceReference();
-      var od = api.ResourceReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceReference(od as api.ResourceReference);
     });
   });
@@ -4631,7 +4763,9 @@
   unittest.group('obj-schema-Rollout', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRollout();
-      var od = api.Rollout.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Rollout.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRollout(od as api.Rollout);
     });
   });
@@ -4639,7 +4773,9 @@
   unittest.group('obj-schema-Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildService();
-      var od = api.Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Service.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkService(od as api.Service);
     });
   });
@@ -4647,7 +4783,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -4655,7 +4793,9 @@
   unittest.group('obj-schema-SourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceContext();
-      var od = api.SourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceContext(od as api.SourceContext);
     });
   });
@@ -4663,7 +4803,9 @@
   unittest.group('obj-schema-SourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceInfo();
-      var od = api.SourceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SourceInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSourceInfo(od as api.SourceInfo);
     });
   });
@@ -4671,7 +4813,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4679,7 +4823,8 @@
   unittest.group('obj-schema-Step', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStep();
-      var od = api.Step.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Step.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStep(od as api.Step);
     });
   });
@@ -4687,7 +4832,9 @@
   unittest.group('obj-schema-SubmitConfigSourceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubmitConfigSourceRequest();
-      var od = api.SubmitConfigSourceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubmitConfigSourceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubmitConfigSourceRequest(od as api.SubmitConfigSourceRequest);
     });
   });
@@ -4695,7 +4842,9 @@
   unittest.group('obj-schema-SubmitConfigSourceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubmitConfigSourceResponse();
-      var od = api.SubmitConfigSourceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubmitConfigSourceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubmitConfigSourceResponse(od as api.SubmitConfigSourceResponse);
     });
   });
@@ -4703,7 +4852,9 @@
   unittest.group('obj-schema-SystemParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameter();
-      var od = api.SystemParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameter(od as api.SystemParameter);
     });
   });
@@ -4711,7 +4862,9 @@
   unittest.group('obj-schema-SystemParameterRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameterRule();
-      var od = api.SystemParameterRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameterRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameterRule(od as api.SystemParameterRule);
     });
   });
@@ -4719,7 +4872,9 @@
   unittest.group('obj-schema-SystemParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameters();
-      var od = api.SystemParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameters(od as api.SystemParameters);
     });
   });
@@ -4727,7 +4882,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -4735,7 +4892,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -4743,7 +4902,9 @@
   unittest.group('obj-schema-TrafficPercentStrategy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrafficPercentStrategy();
-      var od = api.TrafficPercentStrategy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrafficPercentStrategy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrafficPercentStrategy(od as api.TrafficPercentStrategy);
     });
   });
@@ -4751,7 +4912,8 @@
   unittest.group('obj-schema-Type', () {
     unittest.test('to-json--from-json', () async {
       var o = buildType();
-      var od = api.Type.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Type.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkType(od as api.Type);
     });
   });
@@ -4759,7 +4921,9 @@
   unittest.group('obj-schema-UndeleteServiceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteServiceResponse();
-      var od = api.UndeleteServiceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteServiceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteServiceResponse(od as api.UndeleteServiceResponse);
     });
   });
@@ -4767,7 +4931,8 @@
   unittest.group('obj-schema-Usage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsage();
-      var od = api.Usage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Usage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUsage(od as api.Usage);
     });
   });
@@ -4775,7 +4940,9 @@
   unittest.group('obj-schema-UsageRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageRule();
-      var od = api.UsageRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UsageRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUsageRule(od as api.UsageRule);
     });
   });
diff --git a/generated/googleapis/test/servicenetworking/v1_test.dart b/generated/googleapis/test/servicenetworking/v1_test.dart
index 8a84f7e..dc1ec8c 100644
--- a/generated/googleapis/test/servicenetworking/v1_test.dart
+++ b/generated/googleapis/test/servicenetworking/v1_test.dart
@@ -4249,7 +4249,9 @@
   unittest.group('obj-schema-AddDnsRecordSetMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddDnsRecordSetMetadata();
-      var od = api.AddDnsRecordSetMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddDnsRecordSetMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddDnsRecordSetMetadata(od as api.AddDnsRecordSetMetadata);
     });
   });
@@ -4257,7 +4259,9 @@
   unittest.group('obj-schema-AddDnsRecordSetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddDnsRecordSetRequest();
-      var od = api.AddDnsRecordSetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddDnsRecordSetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddDnsRecordSetRequest(od as api.AddDnsRecordSetRequest);
     });
   });
@@ -4265,7 +4269,9 @@
   unittest.group('obj-schema-AddDnsZoneMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddDnsZoneMetadata();
-      var od = api.AddDnsZoneMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddDnsZoneMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddDnsZoneMetadata(od as api.AddDnsZoneMetadata);
     });
   });
@@ -4273,7 +4279,9 @@
   unittest.group('obj-schema-AddDnsZoneRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddDnsZoneRequest();
-      var od = api.AddDnsZoneRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddDnsZoneRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddDnsZoneRequest(od as api.AddDnsZoneRequest);
     });
   });
@@ -4281,7 +4289,9 @@
   unittest.group('obj-schema-AddDnsZoneResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddDnsZoneResponse();
-      var od = api.AddDnsZoneResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddDnsZoneResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddDnsZoneResponse(od as api.AddDnsZoneResponse);
     });
   });
@@ -4289,7 +4299,9 @@
   unittest.group('obj-schema-AddRolesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddRolesMetadata();
-      var od = api.AddRolesMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddRolesMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddRolesMetadata(od as api.AddRolesMetadata);
     });
   });
@@ -4297,7 +4309,9 @@
   unittest.group('obj-schema-AddRolesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddRolesRequest();
-      var od = api.AddRolesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddRolesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddRolesRequest(od as api.AddRolesRequest);
     });
   });
@@ -4305,7 +4319,9 @@
   unittest.group('obj-schema-AddRolesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddRolesResponse();
-      var od = api.AddRolesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddRolesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddRolesResponse(od as api.AddRolesResponse);
     });
   });
@@ -4313,7 +4329,9 @@
   unittest.group('obj-schema-AddSubnetworkRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddSubnetworkRequest();
-      var od = api.AddSubnetworkRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddSubnetworkRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddSubnetworkRequest(od as api.AddSubnetworkRequest);
     });
   });
@@ -4321,7 +4339,8 @@
   unittest.group('obj-schema-Api', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApi();
-      var od = api.Api.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Api.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApi(od as api.Api);
     });
   });
@@ -4329,7 +4348,9 @@
   unittest.group('obj-schema-AuthProvider', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthProvider();
-      var od = api.AuthProvider.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthProvider.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthProvider(od as api.AuthProvider);
     });
   });
@@ -4337,7 +4358,9 @@
   unittest.group('obj-schema-AuthRequirement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthRequirement();
-      var od = api.AuthRequirement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthRequirement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthRequirement(od as api.AuthRequirement);
     });
   });
@@ -4345,7 +4368,9 @@
   unittest.group('obj-schema-Authentication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthentication();
-      var od = api.Authentication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Authentication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthentication(od as api.Authentication);
     });
   });
@@ -4353,7 +4378,9 @@
   unittest.group('obj-schema-AuthenticationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthenticationRule();
-      var od = api.AuthenticationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthenticationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthenticationRule(od as api.AuthenticationRule);
     });
   });
@@ -4361,7 +4388,9 @@
   unittest.group('obj-schema-Backend', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackend();
-      var od = api.Backend.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Backend.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackend(od as api.Backend);
     });
   });
@@ -4369,7 +4398,9 @@
   unittest.group('obj-schema-BackendRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendRule();
-      var od = api.BackendRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendRule(od as api.BackendRule);
     });
   });
@@ -4377,7 +4408,9 @@
   unittest.group('obj-schema-Billing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBilling();
-      var od = api.Billing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Billing.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBilling(od as api.Billing);
     });
   });
@@ -4385,7 +4418,9 @@
   unittest.group('obj-schema-BillingDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingDestination();
-      var od = api.BillingDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingDestination(od as api.BillingDestination);
     });
   });
@@ -4393,7 +4428,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -4401,7 +4438,9 @@
   unittest.group('obj-schema-Connection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConnection();
-      var od = api.Connection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Connection.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkConnection(od as api.Connection);
     });
   });
@@ -4409,7 +4448,9 @@
   unittest.group('obj-schema-ConsumerConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConsumerConfig();
-      var od = api.ConsumerConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConsumerConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConsumerConfig(od as api.ConsumerConfig);
     });
   });
@@ -4417,7 +4458,9 @@
   unittest.group('obj-schema-ConsumerConfigMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConsumerConfigMetadata();
-      var od = api.ConsumerConfigMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConsumerConfigMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConsumerConfigMetadata(od as api.ConsumerConfigMetadata);
     });
   });
@@ -4425,7 +4468,9 @@
   unittest.group('obj-schema-ConsumerProject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConsumerProject();
-      var od = api.ConsumerProject.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConsumerProject.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConsumerProject(od as api.ConsumerProject);
     });
   });
@@ -4433,7 +4478,9 @@
   unittest.group('obj-schema-Context', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContext();
-      var od = api.Context.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Context.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkContext(od as api.Context);
     });
   });
@@ -4441,7 +4488,9 @@
   unittest.group('obj-schema-ContextRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContextRule();
-      var od = api.ContextRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContextRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContextRule(od as api.ContextRule);
     });
   });
@@ -4449,7 +4498,9 @@
   unittest.group('obj-schema-Control', () {
     unittest.test('to-json--from-json', () async {
       var o = buildControl();
-      var od = api.Control.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Control.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkControl(od as api.Control);
     });
   });
@@ -4457,7 +4508,9 @@
   unittest.group('obj-schema-CustomError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomError();
-      var od = api.CustomError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomError(od as api.CustomError);
     });
   });
@@ -4465,7 +4518,9 @@
   unittest.group('obj-schema-CustomErrorRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomErrorRule();
-      var od = api.CustomErrorRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomErrorRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomErrorRule(od as api.CustomErrorRule);
     });
   });
@@ -4473,7 +4528,9 @@
   unittest.group('obj-schema-CustomHttpPattern', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomHttpPattern();
-      var od = api.CustomHttpPattern.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomHttpPattern.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomHttpPattern(od as api.CustomHttpPattern);
     });
   });
@@ -4481,7 +4538,9 @@
   unittest.group('obj-schema-DeleteConnectionMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteConnectionMetadata();
-      var od = api.DeleteConnectionMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteConnectionMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteConnectionMetadata(od as api.DeleteConnectionMetadata);
     });
   });
@@ -4489,7 +4548,9 @@
   unittest.group('obj-schema-DeletePeeredDnsDomainMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeletePeeredDnsDomainMetadata();
-      var od = api.DeletePeeredDnsDomainMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeletePeeredDnsDomainMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeletePeeredDnsDomainMetadata(
           od as api.DeletePeeredDnsDomainMetadata);
     });
@@ -4498,7 +4559,9 @@
   unittest.group('obj-schema-DisableVpcServiceControlsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisableVpcServiceControlsRequest();
-      var od = api.DisableVpcServiceControlsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisableVpcServiceControlsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisableVpcServiceControlsRequest(
           od as api.DisableVpcServiceControlsRequest);
     });
@@ -4507,7 +4570,9 @@
   unittest.group('obj-schema-DnsRecordSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDnsRecordSet();
-      var od = api.DnsRecordSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DnsRecordSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDnsRecordSet(od as api.DnsRecordSet);
     });
   });
@@ -4515,7 +4580,9 @@
   unittest.group('obj-schema-DnsZone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDnsZone();
-      var od = api.DnsZone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DnsZone.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDnsZone(od as api.DnsZone);
     });
   });
@@ -4523,7 +4590,9 @@
   unittest.group('obj-schema-Documentation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentation();
-      var od = api.Documentation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Documentation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentation(od as api.Documentation);
     });
   });
@@ -4531,7 +4600,9 @@
   unittest.group('obj-schema-DocumentationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentationRule();
-      var od = api.DocumentationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentationRule(od as api.DocumentationRule);
     });
   });
@@ -4539,7 +4610,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -4547,7 +4619,9 @@
   unittest.group('obj-schema-EnableVpcServiceControlsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnableVpcServiceControlsRequest();
-      var od = api.EnableVpcServiceControlsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnableVpcServiceControlsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnableVpcServiceControlsRequest(
           od as api.EnableVpcServiceControlsRequest);
     });
@@ -4556,7 +4630,9 @@
   unittest.group('obj-schema-Endpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndpoint();
-      var od = api.Endpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Endpoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEndpoint(od as api.Endpoint);
     });
   });
@@ -4564,7 +4640,8 @@
   unittest.group('obj-schema-Enum', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnum();
-      var od = api.Enum.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Enum.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnum(od as api.Enum);
     });
   });
@@ -4572,7 +4649,9 @@
   unittest.group('obj-schema-EnumValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnumValue();
-      var od = api.EnumValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EnumValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnumValue(od as api.EnumValue);
     });
   });
@@ -4580,7 +4659,8 @@
   unittest.group('obj-schema-Field', () {
     unittest.test('to-json--from-json', () async {
       var o = buildField();
-      var od = api.Field.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Field.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkField(od as api.Field);
     });
   });
@@ -4590,8 +4670,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudServicenetworkingV1ConsumerConfigReservedRange();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudServicenetworkingV1ConsumerConfigReservedRange
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudServicenetworkingV1ConsumerConfigReservedRange(
           od as api.GoogleCloudServicenetworkingV1ConsumerConfigReservedRange);
     });
@@ -4600,8 +4681,9 @@
   unittest.group('obj-schema-GoogleCloudServicenetworkingV1betaConnection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudServicenetworkingV1betaConnection();
-      var od =
-          api.GoogleCloudServicenetworkingV1betaConnection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudServicenetworkingV1betaConnection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudServicenetworkingV1betaConnection(
           od as api.GoogleCloudServicenetworkingV1betaConnection);
     });
@@ -4610,8 +4692,9 @@
   unittest.group('obj-schema-GoogleCloudServicenetworkingV1betaSubnetwork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudServicenetworkingV1betaSubnetwork();
-      var od =
-          api.GoogleCloudServicenetworkingV1betaSubnetwork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudServicenetworkingV1betaSubnetwork.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudServicenetworkingV1betaSubnetwork(
           od as api.GoogleCloudServicenetworkingV1betaSubnetwork);
     });
@@ -4620,7 +4703,8 @@
   unittest.group('obj-schema-Http', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttp();
-      var od = api.Http.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Http.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttp(od as api.Http);
     });
   });
@@ -4628,7 +4712,9 @@
   unittest.group('obj-schema-HttpRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRule();
-      var od = api.HttpRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpRule(od as api.HttpRule);
     });
   });
@@ -4636,7 +4722,9 @@
   unittest.group('obj-schema-JwtLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJwtLocation();
-      var od = api.JwtLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JwtLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJwtLocation(od as api.JwtLocation);
     });
   });
@@ -4644,7 +4732,9 @@
   unittest.group('obj-schema-LabelDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabelDescriptor();
-      var od = api.LabelDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LabelDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
@@ -4652,7 +4742,9 @@
   unittest.group('obj-schema-ListConnectionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListConnectionsResponse();
-      var od = api.ListConnectionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListConnectionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListConnectionsResponse(od as api.ListConnectionsResponse);
     });
   });
@@ -4660,7 +4752,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -4668,7 +4762,9 @@
   unittest.group('obj-schema-ListPeeredDnsDomainsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPeeredDnsDomainsResponse();
-      var od = api.ListPeeredDnsDomainsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPeeredDnsDomainsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPeeredDnsDomainsResponse(od as api.ListPeeredDnsDomainsResponse);
     });
   });
@@ -4676,7 +4772,9 @@
   unittest.group('obj-schema-LogDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogDescriptor();
-      var od = api.LogDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogDescriptor(od as api.LogDescriptor);
     });
   });
@@ -4684,7 +4782,9 @@
   unittest.group('obj-schema-Logging', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogging();
-      var od = api.Logging.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Logging.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogging(od as api.Logging);
     });
   });
@@ -4692,7 +4792,9 @@
   unittest.group('obj-schema-LoggingDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLoggingDestination();
-      var od = api.LoggingDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LoggingDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLoggingDestination(od as api.LoggingDestination);
     });
   });
@@ -4700,7 +4802,9 @@
   unittest.group('obj-schema-Method', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMethod();
-      var od = api.Method.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Method.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMethod(od as api.Method);
     });
   });
@@ -4708,7 +4812,9 @@
   unittest.group('obj-schema-MetricDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptor();
-      var od = api.MetricDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
@@ -4716,7 +4822,9 @@
   unittest.group('obj-schema-MetricDescriptorMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptorMetadata();
-      var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptorMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
@@ -4724,7 +4832,9 @@
   unittest.group('obj-schema-MetricRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricRule();
-      var od = api.MetricRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MetricRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetricRule(od as api.MetricRule);
     });
   });
@@ -4732,7 +4842,8 @@
   unittest.group('obj-schema-Mixin', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMixin();
-      var od = api.Mixin.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Mixin.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMixin(od as api.Mixin);
     });
   });
@@ -4740,7 +4851,9 @@
   unittest.group('obj-schema-MonitoredResourceDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoredResourceDescriptor();
-      var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoredResourceDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
@@ -4748,7 +4861,9 @@
   unittest.group('obj-schema-Monitoring', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoring();
-      var od = api.Monitoring.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Monitoring.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMonitoring(od as api.Monitoring);
     });
   });
@@ -4756,7 +4871,9 @@
   unittest.group('obj-schema-MonitoringDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoringDestination();
-      var od = api.MonitoringDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoringDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoringDestination(od as api.MonitoringDestination);
     });
   });
@@ -4764,7 +4881,9 @@
   unittest.group('obj-schema-OAuthRequirements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOAuthRequirements();
-      var od = api.OAuthRequirements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OAuthRequirements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOAuthRequirements(od as api.OAuthRequirements);
     });
   });
@@ -4772,7 +4891,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -4780,7 +4901,9 @@
   unittest.group('obj-schema-Option', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOption();
-      var od = api.Option.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Option.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOption(od as api.Option);
     });
   });
@@ -4788,7 +4911,8 @@
   unittest.group('obj-schema-Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPage();
-      var od = api.Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Page.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPage(od as api.Page);
     });
   });
@@ -4796,7 +4920,9 @@
   unittest.group('obj-schema-PeeredDnsDomain', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPeeredDnsDomain();
-      var od = api.PeeredDnsDomain.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PeeredDnsDomain.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPeeredDnsDomain(od as api.PeeredDnsDomain);
     });
   });
@@ -4804,7 +4930,9 @@
   unittest.group('obj-schema-PeeredDnsDomainMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPeeredDnsDomainMetadata();
-      var od = api.PeeredDnsDomainMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PeeredDnsDomainMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPeeredDnsDomainMetadata(od as api.PeeredDnsDomainMetadata);
     });
   });
@@ -4812,7 +4940,9 @@
   unittest.group('obj-schema-PolicyBinding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyBinding();
-      var od = api.PolicyBinding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyBinding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyBinding(od as api.PolicyBinding);
     });
   });
@@ -4820,7 +4950,8 @@
   unittest.group('obj-schema-Quota', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuota();
-      var od = api.Quota.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Quota.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuota(od as api.Quota);
     });
   });
@@ -4828,7 +4959,9 @@
   unittest.group('obj-schema-QuotaLimit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaLimit();
-      var od = api.QuotaLimit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.QuotaLimit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuotaLimit(od as api.QuotaLimit);
     });
   });
@@ -4836,7 +4969,8 @@
   unittest.group('obj-schema-Range', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRange();
-      var od = api.Range.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Range.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRange(od as api.Range);
     });
   });
@@ -4844,7 +4978,9 @@
   unittest.group('obj-schema-RangeReservation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRangeReservation();
-      var od = api.RangeReservation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RangeReservation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRangeReservation(od as api.RangeReservation);
     });
   });
@@ -4852,7 +4988,9 @@
   unittest.group('obj-schema-RemoveDnsRecordSetMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveDnsRecordSetMetadata();
-      var od = api.RemoveDnsRecordSetMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveDnsRecordSetMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveDnsRecordSetMetadata(od as api.RemoveDnsRecordSetMetadata);
     });
   });
@@ -4860,7 +4998,9 @@
   unittest.group('obj-schema-RemoveDnsRecordSetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveDnsRecordSetRequest();
-      var od = api.RemoveDnsRecordSetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveDnsRecordSetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveDnsRecordSetRequest(od as api.RemoveDnsRecordSetRequest);
     });
   });
@@ -4868,7 +5008,9 @@
   unittest.group('obj-schema-RemoveDnsRecordSetResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveDnsRecordSetResponse();
-      var od = api.RemoveDnsRecordSetResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveDnsRecordSetResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveDnsRecordSetResponse(od as api.RemoveDnsRecordSetResponse);
     });
   });
@@ -4876,7 +5018,9 @@
   unittest.group('obj-schema-RemoveDnsZoneMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveDnsZoneMetadata();
-      var od = api.RemoveDnsZoneMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveDnsZoneMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveDnsZoneMetadata(od as api.RemoveDnsZoneMetadata);
     });
   });
@@ -4884,7 +5028,9 @@
   unittest.group('obj-schema-RemoveDnsZoneRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveDnsZoneRequest();
-      var od = api.RemoveDnsZoneRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveDnsZoneRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveDnsZoneRequest(od as api.RemoveDnsZoneRequest);
     });
   });
@@ -4892,7 +5038,9 @@
   unittest.group('obj-schema-RemoveDnsZoneResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveDnsZoneResponse();
-      var od = api.RemoveDnsZoneResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveDnsZoneResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveDnsZoneResponse(od as api.RemoveDnsZoneResponse);
     });
   });
@@ -4900,7 +5048,8 @@
   unittest.group('obj-schema-Route', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoute();
-      var od = api.Route.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Route.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRoute(od as api.Route);
     });
   });
@@ -4908,7 +5057,9 @@
   unittest.group('obj-schema-SearchRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchRangeRequest();
-      var od = api.SearchRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchRangeRequest(od as api.SearchRangeRequest);
     });
   });
@@ -4916,7 +5067,9 @@
   unittest.group('obj-schema-SecondaryIpRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecondaryIpRange();
-      var od = api.SecondaryIpRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecondaryIpRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecondaryIpRange(od as api.SecondaryIpRange);
     });
   });
@@ -4924,7 +5077,9 @@
   unittest.group('obj-schema-SecondaryIpRangeSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecondaryIpRangeSpec();
-      var od = api.SecondaryIpRangeSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecondaryIpRangeSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecondaryIpRangeSpec(od as api.SecondaryIpRangeSpec);
     });
   });
@@ -4932,7 +5087,9 @@
   unittest.group('obj-schema-Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildService();
-      var od = api.Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Service.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkService(od as api.Service);
     });
   });
@@ -4940,7 +5097,9 @@
   unittest.group('obj-schema-SourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceContext();
-      var od = api.SourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceContext(od as api.SourceContext);
     });
   });
@@ -4948,7 +5107,9 @@
   unittest.group('obj-schema-SourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceInfo();
-      var od = api.SourceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SourceInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSourceInfo(od as api.SourceInfo);
     });
   });
@@ -4956,7 +5117,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4964,7 +5127,9 @@
   unittest.group('obj-schema-Subnetwork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubnetwork();
-      var od = api.Subnetwork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Subnetwork.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSubnetwork(od as api.Subnetwork);
     });
   });
@@ -4972,7 +5137,9 @@
   unittest.group('obj-schema-SystemParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameter();
-      var od = api.SystemParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameter(od as api.SystemParameter);
     });
   });
@@ -4980,7 +5147,9 @@
   unittest.group('obj-schema-SystemParameterRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameterRule();
-      var od = api.SystemParameterRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameterRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameterRule(od as api.SystemParameterRule);
     });
   });
@@ -4988,7 +5157,9 @@
   unittest.group('obj-schema-SystemParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameters();
-      var od = api.SystemParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameters(od as api.SystemParameters);
     });
   });
@@ -4996,7 +5167,8 @@
   unittest.group('obj-schema-Type', () {
     unittest.test('to-json--from-json', () async {
       var o = buildType();
-      var od = api.Type.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Type.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkType(od as api.Type);
     });
   });
@@ -5004,7 +5176,9 @@
   unittest.group('obj-schema-UpdateConsumerConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateConsumerConfigRequest();
-      var od = api.UpdateConsumerConfigRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateConsumerConfigRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateConsumerConfigRequest(od as api.UpdateConsumerConfigRequest);
     });
   });
@@ -5012,7 +5186,9 @@
   unittest.group('obj-schema-UpdateDnsRecordSetMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDnsRecordSetMetadata();
-      var od = api.UpdateDnsRecordSetMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDnsRecordSetMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDnsRecordSetMetadata(od as api.UpdateDnsRecordSetMetadata);
     });
   });
@@ -5020,7 +5196,9 @@
   unittest.group('obj-schema-UpdateDnsRecordSetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDnsRecordSetRequest();
-      var od = api.UpdateDnsRecordSetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDnsRecordSetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDnsRecordSetRequest(od as api.UpdateDnsRecordSetRequest);
     });
   });
@@ -5028,7 +5206,8 @@
   unittest.group('obj-schema-Usage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsage();
-      var od = api.Usage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Usage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUsage(od as api.Usage);
     });
   });
@@ -5036,7 +5215,9 @@
   unittest.group('obj-schema-UsageRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageRule();
-      var od = api.UsageRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UsageRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUsageRule(od as api.UsageRule);
     });
   });
@@ -5044,7 +5225,9 @@
   unittest.group('obj-schema-ValidateConsumerConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValidateConsumerConfigRequest();
-      var od = api.ValidateConsumerConfigRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValidateConsumerConfigRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValidateConsumerConfigRequest(
           od as api.ValidateConsumerConfigRequest);
     });
@@ -5053,7 +5236,9 @@
   unittest.group('obj-schema-ValidateConsumerConfigResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValidateConsumerConfigResponse();
-      var od = api.ValidateConsumerConfigResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValidateConsumerConfigResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValidateConsumerConfigResponse(
           od as api.ValidateConsumerConfigResponse);
     });
diff --git a/generated/googleapis/test/serviceusage/v1_test.dart b/generated/googleapis/test/serviceusage/v1_test.dart
index 6682c95..7532849 100644
--- a/generated/googleapis/test/serviceusage/v1_test.dart
+++ b/generated/googleapis/test/serviceusage/v1_test.dart
@@ -3726,7 +3726,9 @@
   unittest.group('obj-schema-AdminQuotaPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdminQuotaPolicy();
-      var od = api.AdminQuotaPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdminQuotaPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdminQuotaPolicy(od as api.AdminQuotaPolicy);
     });
   });
@@ -3734,7 +3736,8 @@
   unittest.group('obj-schema-Api', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApi();
-      var od = api.Api.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Api.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApi(od as api.Api);
     });
   });
@@ -3742,7 +3745,9 @@
   unittest.group('obj-schema-AuthProvider', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthProvider();
-      var od = api.AuthProvider.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthProvider.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthProvider(od as api.AuthProvider);
     });
   });
@@ -3750,7 +3755,9 @@
   unittest.group('obj-schema-AuthRequirement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthRequirement();
-      var od = api.AuthRequirement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthRequirement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthRequirement(od as api.AuthRequirement);
     });
   });
@@ -3758,7 +3765,9 @@
   unittest.group('obj-schema-Authentication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthentication();
-      var od = api.Authentication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Authentication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthentication(od as api.Authentication);
     });
   });
@@ -3766,7 +3775,9 @@
   unittest.group('obj-schema-AuthenticationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthenticationRule();
-      var od = api.AuthenticationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthenticationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthenticationRule(od as api.AuthenticationRule);
     });
   });
@@ -3774,7 +3785,9 @@
   unittest.group('obj-schema-Backend', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackend();
-      var od = api.Backend.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Backend.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackend(od as api.Backend);
     });
   });
@@ -3782,7 +3795,9 @@
   unittest.group('obj-schema-BackendRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackendRule();
-      var od = api.BackendRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackendRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackendRule(od as api.BackendRule);
     });
   });
@@ -3790,7 +3805,9 @@
   unittest.group('obj-schema-BatchCreateAdminOverridesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateAdminOverridesResponse();
-      var od = api.BatchCreateAdminOverridesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateAdminOverridesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateAdminOverridesResponse(
           od as api.BatchCreateAdminOverridesResponse);
     });
@@ -3799,7 +3816,9 @@
   unittest.group('obj-schema-BatchCreateConsumerOverridesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateConsumerOverridesResponse();
-      var od = api.BatchCreateConsumerOverridesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateConsumerOverridesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateConsumerOverridesResponse(
           od as api.BatchCreateConsumerOverridesResponse);
     });
@@ -3808,7 +3827,9 @@
   unittest.group('obj-schema-BatchEnableServicesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchEnableServicesRequest();
-      var od = api.BatchEnableServicesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchEnableServicesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchEnableServicesRequest(od as api.BatchEnableServicesRequest);
     });
   });
@@ -3816,7 +3837,9 @@
   unittest.group('obj-schema-BatchEnableServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchEnableServicesResponse();
-      var od = api.BatchEnableServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchEnableServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchEnableServicesResponse(od as api.BatchEnableServicesResponse);
     });
   });
@@ -3824,7 +3847,9 @@
   unittest.group('obj-schema-BatchGetServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetServicesResponse();
-      var od = api.BatchGetServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetServicesResponse(od as api.BatchGetServicesResponse);
     });
   });
@@ -3832,7 +3857,9 @@
   unittest.group('obj-schema-Billing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBilling();
-      var od = api.Billing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Billing.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBilling(od as api.Billing);
     });
   });
@@ -3840,7 +3867,9 @@
   unittest.group('obj-schema-BillingDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingDestination();
-      var od = api.BillingDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingDestination(od as api.BillingDestination);
     });
   });
@@ -3848,7 +3877,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -3856,7 +3887,9 @@
   unittest.group('obj-schema-Context', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContext();
-      var od = api.Context.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Context.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkContext(od as api.Context);
     });
   });
@@ -3864,7 +3897,9 @@
   unittest.group('obj-schema-ContextRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContextRule();
-      var od = api.ContextRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContextRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContextRule(od as api.ContextRule);
     });
   });
@@ -3872,7 +3907,9 @@
   unittest.group('obj-schema-Control', () {
     unittest.test('to-json--from-json', () async {
       var o = buildControl();
-      var od = api.Control.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Control.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkControl(od as api.Control);
     });
   });
@@ -3880,7 +3917,9 @@
   unittest.group('obj-schema-CustomError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomError();
-      var od = api.CustomError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomError(od as api.CustomError);
     });
   });
@@ -3888,7 +3927,9 @@
   unittest.group('obj-schema-CustomErrorRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomErrorRule();
-      var od = api.CustomErrorRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomErrorRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomErrorRule(od as api.CustomErrorRule);
     });
   });
@@ -3896,7 +3937,9 @@
   unittest.group('obj-schema-CustomHttpPattern', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomHttpPattern();
-      var od = api.CustomHttpPattern.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomHttpPattern.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomHttpPattern(od as api.CustomHttpPattern);
     });
   });
@@ -3904,7 +3947,9 @@
   unittest.group('obj-schema-DisableServiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisableServiceRequest();
-      var od = api.DisableServiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisableServiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisableServiceRequest(od as api.DisableServiceRequest);
     });
   });
@@ -3912,7 +3957,9 @@
   unittest.group('obj-schema-DisableServiceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisableServiceResponse();
-      var od = api.DisableServiceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisableServiceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisableServiceResponse(od as api.DisableServiceResponse);
     });
   });
@@ -3920,7 +3967,9 @@
   unittest.group('obj-schema-Documentation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentation();
-      var od = api.Documentation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Documentation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentation(od as api.Documentation);
     });
   });
@@ -3928,7 +3977,9 @@
   unittest.group('obj-schema-DocumentationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDocumentationRule();
-      var od = api.DocumentationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DocumentationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDocumentationRule(od as api.DocumentationRule);
     });
   });
@@ -3936,7 +3987,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -3944,7 +3996,9 @@
   unittest.group('obj-schema-EnableFailure', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnableFailure();
-      var od = api.EnableFailure.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnableFailure.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnableFailure(od as api.EnableFailure);
     });
   });
@@ -3952,7 +4006,9 @@
   unittest.group('obj-schema-EnableServiceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnableServiceRequest();
-      var od = api.EnableServiceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnableServiceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnableServiceRequest(od as api.EnableServiceRequest);
     });
   });
@@ -3960,7 +4016,9 @@
   unittest.group('obj-schema-EnableServiceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnableServiceResponse();
-      var od = api.EnableServiceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnableServiceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnableServiceResponse(od as api.EnableServiceResponse);
     });
   });
@@ -3968,7 +4026,9 @@
   unittest.group('obj-schema-Endpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEndpoint();
-      var od = api.Endpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Endpoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEndpoint(od as api.Endpoint);
     });
   });
@@ -3976,7 +4036,8 @@
   unittest.group('obj-schema-Enum', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnum();
-      var od = api.Enum.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Enum.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnum(od as api.Enum);
     });
   });
@@ -3984,7 +4045,9 @@
   unittest.group('obj-schema-EnumValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnumValue();
-      var od = api.EnumValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EnumValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEnumValue(od as api.EnumValue);
     });
   });
@@ -3992,7 +4055,8 @@
   unittest.group('obj-schema-Field', () {
     unittest.test('to-json--from-json', () async {
       var o = buildField();
-      var od = api.Field.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Field.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkField(od as api.Field);
     });
   });
@@ -4000,7 +4064,9 @@
   unittest.group('obj-schema-GetServiceIdentityResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetServiceIdentityResponse();
-      var od = api.GetServiceIdentityResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetServiceIdentityResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetServiceIdentityResponse(od as api.GetServiceIdentityResponse);
     });
   });
@@ -4008,7 +4074,9 @@
   unittest.group('obj-schema-GoogleApiService', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiService();
-      var od = api.GoogleApiService.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiService.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiService(od as api.GoogleApiService);
     });
   });
@@ -4016,8 +4084,9 @@
   unittest.group('obj-schema-GoogleApiServiceusageV1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServiceusageV1OperationMetadata();
-      var od =
-          api.GoogleApiServiceusageV1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServiceusageV1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServiceusageV1OperationMetadata(
           od as api.GoogleApiServiceusageV1OperationMetadata);
     });
@@ -4026,7 +4095,9 @@
   unittest.group('obj-schema-GoogleApiServiceusageV1Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServiceusageV1Service();
-      var od = api.GoogleApiServiceusageV1Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServiceusageV1Service.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServiceusageV1Service(
           od as api.GoogleApiServiceusageV1Service);
     });
@@ -4035,7 +4106,9 @@
   unittest.group('obj-schema-GoogleApiServiceusageV1ServiceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServiceusageV1ServiceConfig();
-      var od = api.GoogleApiServiceusageV1ServiceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServiceusageV1ServiceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServiceusageV1ServiceConfig(
           od as api.GoogleApiServiceusageV1ServiceConfig);
     });
@@ -4045,9 +4118,10 @@
       'obj-schema-GoogleApiServiceusageV1beta1GetServiceIdentityResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServiceusageV1beta1GetServiceIdentityResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleApiServiceusageV1beta1GetServiceIdentityResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServiceusageV1beta1GetServiceIdentityResponse(
           od as api.GoogleApiServiceusageV1beta1GetServiceIdentityResponse);
     });
@@ -4056,8 +4130,9 @@
   unittest.group('obj-schema-GoogleApiServiceusageV1beta1ServiceIdentity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServiceusageV1beta1ServiceIdentity();
-      var od =
-          api.GoogleApiServiceusageV1beta1ServiceIdentity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServiceusageV1beta1ServiceIdentity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServiceusageV1beta1ServiceIdentity(
           od as api.GoogleApiServiceusageV1beta1ServiceIdentity);
     });
@@ -4066,7 +4141,8 @@
   unittest.group('obj-schema-Http', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttp();
-      var od = api.Http.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Http.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttp(od as api.Http);
     });
   });
@@ -4074,7 +4150,9 @@
   unittest.group('obj-schema-HttpRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRule();
-      var od = api.HttpRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpRule(od as api.HttpRule);
     });
   });
@@ -4082,7 +4160,9 @@
   unittest.group('obj-schema-ImportAdminOverridesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportAdminOverridesResponse();
-      var od = api.ImportAdminOverridesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportAdminOverridesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportAdminOverridesResponse(od as api.ImportAdminOverridesResponse);
     });
   });
@@ -4090,7 +4170,9 @@
   unittest.group('obj-schema-ImportAdminQuotaPoliciesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportAdminQuotaPoliciesResponse();
-      var od = api.ImportAdminQuotaPoliciesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportAdminQuotaPoliciesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportAdminQuotaPoliciesResponse(
           od as api.ImportAdminQuotaPoliciesResponse);
     });
@@ -4099,7 +4181,9 @@
   unittest.group('obj-schema-ImportConsumerOverridesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportConsumerOverridesResponse();
-      var od = api.ImportConsumerOverridesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportConsumerOverridesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportConsumerOverridesResponse(
           od as api.ImportConsumerOverridesResponse);
     });
@@ -4108,7 +4192,9 @@
   unittest.group('obj-schema-JwtLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJwtLocation();
-      var od = api.JwtLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JwtLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJwtLocation(od as api.JwtLocation);
     });
   });
@@ -4116,7 +4202,9 @@
   unittest.group('obj-schema-LabelDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabelDescriptor();
-      var od = api.LabelDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LabelDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
@@ -4124,7 +4212,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -4132,7 +4222,9 @@
   unittest.group('obj-schema-ListServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServicesResponse();
-      var od = api.ListServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
@@ -4140,7 +4232,9 @@
   unittest.group('obj-schema-LogDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogDescriptor();
-      var od = api.LogDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogDescriptor(od as api.LogDescriptor);
     });
   });
@@ -4148,7 +4242,9 @@
   unittest.group('obj-schema-Logging', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogging();
-      var od = api.Logging.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Logging.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogging(od as api.Logging);
     });
   });
@@ -4156,7 +4252,9 @@
   unittest.group('obj-schema-LoggingDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLoggingDestination();
-      var od = api.LoggingDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LoggingDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLoggingDestination(od as api.LoggingDestination);
     });
   });
@@ -4164,7 +4262,9 @@
   unittest.group('obj-schema-Method', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMethod();
-      var od = api.Method.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Method.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMethod(od as api.Method);
     });
   });
@@ -4172,7 +4272,9 @@
   unittest.group('obj-schema-MetricDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptor();
-      var od = api.MetricDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
@@ -4180,7 +4282,9 @@
   unittest.group('obj-schema-MetricDescriptorMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricDescriptorMetadata();
-      var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricDescriptorMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
@@ -4188,7 +4292,9 @@
   unittest.group('obj-schema-MetricRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricRule();
-      var od = api.MetricRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MetricRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetricRule(od as api.MetricRule);
     });
   });
@@ -4196,7 +4302,8 @@
   unittest.group('obj-schema-Mixin', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMixin();
-      var od = api.Mixin.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Mixin.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMixin(od as api.Mixin);
     });
   });
@@ -4204,7 +4311,9 @@
   unittest.group('obj-schema-MonitoredResourceDescriptor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoredResourceDescriptor();
-      var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoredResourceDescriptor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
@@ -4212,7 +4321,9 @@
   unittest.group('obj-schema-Monitoring', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoring();
-      var od = api.Monitoring.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Monitoring.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMonitoring(od as api.Monitoring);
     });
   });
@@ -4220,7 +4331,9 @@
   unittest.group('obj-schema-MonitoringDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitoringDestination();
-      var od = api.MonitoringDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitoringDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitoringDestination(od as api.MonitoringDestination);
     });
   });
@@ -4228,7 +4341,9 @@
   unittest.group('obj-schema-OAuthRequirements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOAuthRequirements();
-      var od = api.OAuthRequirements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OAuthRequirements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOAuthRequirements(od as api.OAuthRequirements);
     });
   });
@@ -4236,7 +4351,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -4244,7 +4361,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -4252,7 +4371,9 @@
   unittest.group('obj-schema-Option', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOption();
-      var od = api.Option.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Option.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOption(od as api.Option);
     });
   });
@@ -4260,7 +4381,8 @@
   unittest.group('obj-schema-Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPage();
-      var od = api.Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Page.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPage(od as api.Page);
     });
   });
@@ -4268,7 +4390,8 @@
   unittest.group('obj-schema-Quota', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuota();
-      var od = api.Quota.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Quota.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuota(od as api.Quota);
     });
   });
@@ -4276,7 +4399,9 @@
   unittest.group('obj-schema-QuotaLimit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaLimit();
-      var od = api.QuotaLimit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.QuotaLimit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuotaLimit(od as api.QuotaLimit);
     });
   });
@@ -4284,7 +4409,9 @@
   unittest.group('obj-schema-QuotaOverride', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaOverride();
-      var od = api.QuotaOverride.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QuotaOverride.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQuotaOverride(od as api.QuotaOverride);
     });
   });
@@ -4292,7 +4419,9 @@
   unittest.group('obj-schema-ServiceIdentity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceIdentity();
-      var od = api.ServiceIdentity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceIdentity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceIdentity(od as api.ServiceIdentity);
     });
   });
@@ -4300,7 +4429,9 @@
   unittest.group('obj-schema-SourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceContext();
-      var od = api.SourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceContext(od as api.SourceContext);
     });
   });
@@ -4308,7 +4439,9 @@
   unittest.group('obj-schema-SourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceInfo();
-      var od = api.SourceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SourceInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSourceInfo(od as api.SourceInfo);
     });
   });
@@ -4316,7 +4449,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4324,7 +4459,9 @@
   unittest.group('obj-schema-SystemParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameter();
-      var od = api.SystemParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameter(od as api.SystemParameter);
     });
   });
@@ -4332,7 +4469,9 @@
   unittest.group('obj-schema-SystemParameterRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameterRule();
-      var od = api.SystemParameterRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameterRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameterRule(od as api.SystemParameterRule);
     });
   });
@@ -4340,7 +4479,9 @@
   unittest.group('obj-schema-SystemParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystemParameters();
-      var od = api.SystemParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystemParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystemParameters(od as api.SystemParameters);
     });
   });
@@ -4348,7 +4489,8 @@
   unittest.group('obj-schema-Type', () {
     unittest.test('to-json--from-json', () async {
       var o = buildType();
-      var od = api.Type.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Type.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkType(od as api.Type);
     });
   });
@@ -4356,7 +4498,8 @@
   unittest.group('obj-schema-Usage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsage();
-      var od = api.Usage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Usage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUsage(od as api.Usage);
     });
   });
@@ -4364,7 +4507,9 @@
   unittest.group('obj-schema-UsageRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsageRule();
-      var od = api.UsageRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UsageRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUsageRule(od as api.UsageRule);
     });
   });
diff --git a/generated/googleapis/test/sheets/v4_test.dart b/generated/googleapis/test/sheets/v4_test.dart
index 587449b..f842cec 100644
--- a/generated/googleapis/test/sheets/v4_test.dart
+++ b/generated/googleapis/test/sheets/v4_test.dart
@@ -8501,7 +8501,9 @@
   unittest.group('obj-schema-AddBandingRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddBandingRequest();
-      var od = api.AddBandingRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddBandingRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddBandingRequest(od as api.AddBandingRequest);
     });
   });
@@ -8509,7 +8511,9 @@
   unittest.group('obj-schema-AddBandingResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddBandingResponse();
-      var od = api.AddBandingResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddBandingResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddBandingResponse(od as api.AddBandingResponse);
     });
   });
@@ -8517,7 +8521,9 @@
   unittest.group('obj-schema-AddChartRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddChartRequest();
-      var od = api.AddChartRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddChartRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddChartRequest(od as api.AddChartRequest);
     });
   });
@@ -8525,7 +8531,9 @@
   unittest.group('obj-schema-AddChartResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddChartResponse();
-      var od = api.AddChartResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddChartResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddChartResponse(od as api.AddChartResponse);
     });
   });
@@ -8533,7 +8541,9 @@
   unittest.group('obj-schema-AddConditionalFormatRuleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddConditionalFormatRuleRequest();
-      var od = api.AddConditionalFormatRuleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddConditionalFormatRuleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddConditionalFormatRuleRequest(
           od as api.AddConditionalFormatRuleRequest);
     });
@@ -8542,7 +8552,9 @@
   unittest.group('obj-schema-AddDataSourceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddDataSourceRequest();
-      var od = api.AddDataSourceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddDataSourceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddDataSourceRequest(od as api.AddDataSourceRequest);
     });
   });
@@ -8550,7 +8562,9 @@
   unittest.group('obj-schema-AddDataSourceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddDataSourceResponse();
-      var od = api.AddDataSourceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddDataSourceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddDataSourceResponse(od as api.AddDataSourceResponse);
     });
   });
@@ -8558,7 +8572,9 @@
   unittest.group('obj-schema-AddDimensionGroupRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddDimensionGroupRequest();
-      var od = api.AddDimensionGroupRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddDimensionGroupRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddDimensionGroupRequest(od as api.AddDimensionGroupRequest);
     });
   });
@@ -8566,7 +8582,9 @@
   unittest.group('obj-schema-AddDimensionGroupResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddDimensionGroupResponse();
-      var od = api.AddDimensionGroupResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddDimensionGroupResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddDimensionGroupResponse(od as api.AddDimensionGroupResponse);
     });
   });
@@ -8574,7 +8592,9 @@
   unittest.group('obj-schema-AddFilterViewRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddFilterViewRequest();
-      var od = api.AddFilterViewRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddFilterViewRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddFilterViewRequest(od as api.AddFilterViewRequest);
     });
   });
@@ -8582,7 +8602,9 @@
   unittest.group('obj-schema-AddFilterViewResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddFilterViewResponse();
-      var od = api.AddFilterViewResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddFilterViewResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddFilterViewResponse(od as api.AddFilterViewResponse);
     });
   });
@@ -8590,7 +8612,9 @@
   unittest.group('obj-schema-AddNamedRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddNamedRangeRequest();
-      var od = api.AddNamedRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddNamedRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddNamedRangeRequest(od as api.AddNamedRangeRequest);
     });
   });
@@ -8598,7 +8622,9 @@
   unittest.group('obj-schema-AddNamedRangeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddNamedRangeResponse();
-      var od = api.AddNamedRangeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddNamedRangeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddNamedRangeResponse(od as api.AddNamedRangeResponse);
     });
   });
@@ -8606,7 +8632,9 @@
   unittest.group('obj-schema-AddProtectedRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddProtectedRangeRequest();
-      var od = api.AddProtectedRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddProtectedRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddProtectedRangeRequest(od as api.AddProtectedRangeRequest);
     });
   });
@@ -8614,7 +8642,9 @@
   unittest.group('obj-schema-AddProtectedRangeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddProtectedRangeResponse();
-      var od = api.AddProtectedRangeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddProtectedRangeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddProtectedRangeResponse(od as api.AddProtectedRangeResponse);
     });
   });
@@ -8622,7 +8652,9 @@
   unittest.group('obj-schema-AddSheetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddSheetRequest();
-      var od = api.AddSheetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddSheetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddSheetRequest(od as api.AddSheetRequest);
     });
   });
@@ -8630,7 +8662,9 @@
   unittest.group('obj-schema-AddSheetResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddSheetResponse();
-      var od = api.AddSheetResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddSheetResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddSheetResponse(od as api.AddSheetResponse);
     });
   });
@@ -8638,7 +8672,9 @@
   unittest.group('obj-schema-AddSlicerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddSlicerRequest();
-      var od = api.AddSlicerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddSlicerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddSlicerRequest(od as api.AddSlicerRequest);
     });
   });
@@ -8646,7 +8682,9 @@
   unittest.group('obj-schema-AddSlicerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddSlicerResponse();
-      var od = api.AddSlicerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddSlicerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddSlicerResponse(od as api.AddSlicerResponse);
     });
   });
@@ -8654,7 +8692,9 @@
   unittest.group('obj-schema-AppendCellsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppendCellsRequest();
-      var od = api.AppendCellsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppendCellsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppendCellsRequest(od as api.AppendCellsRequest);
     });
   });
@@ -8662,7 +8702,9 @@
   unittest.group('obj-schema-AppendDimensionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppendDimensionRequest();
-      var od = api.AppendDimensionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppendDimensionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppendDimensionRequest(od as api.AppendDimensionRequest);
     });
   });
@@ -8670,7 +8712,9 @@
   unittest.group('obj-schema-AppendValuesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppendValuesResponse();
-      var od = api.AppendValuesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppendValuesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppendValuesResponse(od as api.AppendValuesResponse);
     });
   });
@@ -8678,7 +8722,9 @@
   unittest.group('obj-schema-AutoFillRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoFillRequest();
-      var od = api.AutoFillRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoFillRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoFillRequest(od as api.AutoFillRequest);
     });
   });
@@ -8686,7 +8732,9 @@
   unittest.group('obj-schema-AutoResizeDimensionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoResizeDimensionsRequest();
-      var od = api.AutoResizeDimensionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoResizeDimensionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoResizeDimensionsRequest(od as api.AutoResizeDimensionsRequest);
     });
   });
@@ -8694,7 +8742,9 @@
   unittest.group('obj-schema-BandedRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBandedRange();
-      var od = api.BandedRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BandedRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBandedRange(od as api.BandedRange);
     });
   });
@@ -8702,7 +8752,9 @@
   unittest.group('obj-schema-BandingProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBandingProperties();
-      var od = api.BandingProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BandingProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBandingProperties(od as api.BandingProperties);
     });
   });
@@ -8710,7 +8762,9 @@
   unittest.group('obj-schema-BaselineValueFormat', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBaselineValueFormat();
-      var od = api.BaselineValueFormat.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BaselineValueFormat.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBaselineValueFormat(od as api.BaselineValueFormat);
     });
   });
@@ -8718,7 +8772,9 @@
   unittest.group('obj-schema-BasicChartAxis', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicChartAxis();
-      var od = api.BasicChartAxis.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicChartAxis.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicChartAxis(od as api.BasicChartAxis);
     });
   });
@@ -8726,7 +8782,9 @@
   unittest.group('obj-schema-BasicChartDomain', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicChartDomain();
-      var od = api.BasicChartDomain.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicChartDomain.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicChartDomain(od as api.BasicChartDomain);
     });
   });
@@ -8734,7 +8792,9 @@
   unittest.group('obj-schema-BasicChartSeries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicChartSeries();
-      var od = api.BasicChartSeries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicChartSeries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicChartSeries(od as api.BasicChartSeries);
     });
   });
@@ -8742,7 +8802,9 @@
   unittest.group('obj-schema-BasicChartSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicChartSpec();
-      var od = api.BasicChartSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicChartSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicChartSpec(od as api.BasicChartSpec);
     });
   });
@@ -8750,7 +8812,9 @@
   unittest.group('obj-schema-BasicFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicFilter();
-      var od = api.BasicFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicFilter(od as api.BasicFilter);
     });
   });
@@ -8758,7 +8822,9 @@
   unittest.group('obj-schema-BasicSeriesDataPointStyleOverride', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicSeriesDataPointStyleOverride();
-      var od = api.BasicSeriesDataPointStyleOverride.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicSeriesDataPointStyleOverride.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicSeriesDataPointStyleOverride(
           od as api.BasicSeriesDataPointStyleOverride);
     });
@@ -8767,7 +8833,9 @@
   unittest.group('obj-schema-BatchClearValuesByDataFilterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchClearValuesByDataFilterRequest();
-      var od = api.BatchClearValuesByDataFilterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchClearValuesByDataFilterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchClearValuesByDataFilterRequest(
           od as api.BatchClearValuesByDataFilterRequest);
     });
@@ -8776,7 +8844,9 @@
   unittest.group('obj-schema-BatchClearValuesByDataFilterResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchClearValuesByDataFilterResponse();
-      var od = api.BatchClearValuesByDataFilterResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchClearValuesByDataFilterResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchClearValuesByDataFilterResponse(
           od as api.BatchClearValuesByDataFilterResponse);
     });
@@ -8785,7 +8855,9 @@
   unittest.group('obj-schema-BatchClearValuesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchClearValuesRequest();
-      var od = api.BatchClearValuesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchClearValuesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchClearValuesRequest(od as api.BatchClearValuesRequest);
     });
   });
@@ -8793,7 +8865,9 @@
   unittest.group('obj-schema-BatchClearValuesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchClearValuesResponse();
-      var od = api.BatchClearValuesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchClearValuesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchClearValuesResponse(od as api.BatchClearValuesResponse);
     });
   });
@@ -8801,7 +8875,9 @@
   unittest.group('obj-schema-BatchGetValuesByDataFilterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetValuesByDataFilterRequest();
-      var od = api.BatchGetValuesByDataFilterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetValuesByDataFilterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetValuesByDataFilterRequest(
           od as api.BatchGetValuesByDataFilterRequest);
     });
@@ -8810,7 +8886,9 @@
   unittest.group('obj-schema-BatchGetValuesByDataFilterResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetValuesByDataFilterResponse();
-      var od = api.BatchGetValuesByDataFilterResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetValuesByDataFilterResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetValuesByDataFilterResponse(
           od as api.BatchGetValuesByDataFilterResponse);
     });
@@ -8819,7 +8897,9 @@
   unittest.group('obj-schema-BatchGetValuesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetValuesResponse();
-      var od = api.BatchGetValuesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetValuesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetValuesResponse(od as api.BatchGetValuesResponse);
     });
   });
@@ -8827,7 +8907,9 @@
   unittest.group('obj-schema-BatchUpdateSpreadsheetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateSpreadsheetRequest();
-      var od = api.BatchUpdateSpreadsheetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateSpreadsheetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateSpreadsheetRequest(
           od as api.BatchUpdateSpreadsheetRequest);
     });
@@ -8836,7 +8918,9 @@
   unittest.group('obj-schema-BatchUpdateSpreadsheetResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateSpreadsheetResponse();
-      var od = api.BatchUpdateSpreadsheetResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateSpreadsheetResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateSpreadsheetResponse(
           od as api.BatchUpdateSpreadsheetResponse);
     });
@@ -8845,7 +8929,9 @@
   unittest.group('obj-schema-BatchUpdateValuesByDataFilterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateValuesByDataFilterRequest();
-      var od = api.BatchUpdateValuesByDataFilterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateValuesByDataFilterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateValuesByDataFilterRequest(
           od as api.BatchUpdateValuesByDataFilterRequest);
     });
@@ -8854,7 +8940,9 @@
   unittest.group('obj-schema-BatchUpdateValuesByDataFilterResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateValuesByDataFilterResponse();
-      var od = api.BatchUpdateValuesByDataFilterResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateValuesByDataFilterResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateValuesByDataFilterResponse(
           od as api.BatchUpdateValuesByDataFilterResponse);
     });
@@ -8863,7 +8951,9 @@
   unittest.group('obj-schema-BatchUpdateValuesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateValuesRequest();
-      var od = api.BatchUpdateValuesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateValuesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateValuesRequest(od as api.BatchUpdateValuesRequest);
     });
   });
@@ -8871,7 +8961,9 @@
   unittest.group('obj-schema-BatchUpdateValuesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateValuesResponse();
-      var od = api.BatchUpdateValuesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateValuesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateValuesResponse(od as api.BatchUpdateValuesResponse);
     });
   });
@@ -8879,7 +8971,9 @@
   unittest.group('obj-schema-BigQueryDataSourceSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigQueryDataSourceSpec();
-      var od = api.BigQueryDataSourceSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigQueryDataSourceSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigQueryDataSourceSpec(od as api.BigQueryDataSourceSpec);
     });
   });
@@ -8887,7 +8981,9 @@
   unittest.group('obj-schema-BigQueryQuerySpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigQueryQuerySpec();
-      var od = api.BigQueryQuerySpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigQueryQuerySpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigQueryQuerySpec(od as api.BigQueryQuerySpec);
     });
   });
@@ -8895,7 +8991,9 @@
   unittest.group('obj-schema-BigQueryTableSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigQueryTableSpec();
-      var od = api.BigQueryTableSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigQueryTableSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigQueryTableSpec(od as api.BigQueryTableSpec);
     });
   });
@@ -8903,7 +9001,9 @@
   unittest.group('obj-schema-BooleanCondition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBooleanCondition();
-      var od = api.BooleanCondition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BooleanCondition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBooleanCondition(od as api.BooleanCondition);
     });
   });
@@ -8911,7 +9011,9 @@
   unittest.group('obj-schema-BooleanRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBooleanRule();
-      var od = api.BooleanRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BooleanRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBooleanRule(od as api.BooleanRule);
     });
   });
@@ -8919,7 +9021,9 @@
   unittest.group('obj-schema-Border', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBorder();
-      var od = api.Border.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Border.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBorder(od as api.Border);
     });
   });
@@ -8927,7 +9031,9 @@
   unittest.group('obj-schema-Borders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBorders();
-      var od = api.Borders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Borders.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBorders(od as api.Borders);
     });
   });
@@ -8935,7 +9041,9 @@
   unittest.group('obj-schema-BubbleChartSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBubbleChartSpec();
-      var od = api.BubbleChartSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BubbleChartSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBubbleChartSpec(od as api.BubbleChartSpec);
     });
   });
@@ -8943,7 +9051,9 @@
   unittest.group('obj-schema-CandlestickChartSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCandlestickChartSpec();
-      var od = api.CandlestickChartSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CandlestickChartSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCandlestickChartSpec(od as api.CandlestickChartSpec);
     });
   });
@@ -8951,7 +9061,9 @@
   unittest.group('obj-schema-CandlestickData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCandlestickData();
-      var od = api.CandlestickData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CandlestickData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCandlestickData(od as api.CandlestickData);
     });
   });
@@ -8959,7 +9071,9 @@
   unittest.group('obj-schema-CandlestickDomain', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCandlestickDomain();
-      var od = api.CandlestickDomain.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CandlestickDomain.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCandlestickDomain(od as api.CandlestickDomain);
     });
   });
@@ -8967,7 +9081,9 @@
   unittest.group('obj-schema-CandlestickSeries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCandlestickSeries();
-      var od = api.CandlestickSeries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CandlestickSeries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCandlestickSeries(od as api.CandlestickSeries);
     });
   });
@@ -8975,7 +9091,9 @@
   unittest.group('obj-schema-CellData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCellData();
-      var od = api.CellData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CellData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCellData(od as api.CellData);
     });
   });
@@ -8983,7 +9101,9 @@
   unittest.group('obj-schema-CellFormat', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCellFormat();
-      var od = api.CellFormat.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CellFormat.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCellFormat(od as api.CellFormat);
     });
   });
@@ -8991,7 +9111,9 @@
   unittest.group('obj-schema-ChartAxisViewWindowOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChartAxisViewWindowOptions();
-      var od = api.ChartAxisViewWindowOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChartAxisViewWindowOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChartAxisViewWindowOptions(od as api.ChartAxisViewWindowOptions);
     });
   });
@@ -8999,7 +9121,9 @@
   unittest.group('obj-schema-ChartCustomNumberFormatOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChartCustomNumberFormatOptions();
-      var od = api.ChartCustomNumberFormatOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChartCustomNumberFormatOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChartCustomNumberFormatOptions(
           od as api.ChartCustomNumberFormatOptions);
     });
@@ -9008,7 +9132,9 @@
   unittest.group('obj-schema-ChartData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChartData();
-      var od = api.ChartData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ChartData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChartData(od as api.ChartData);
     });
   });
@@ -9016,7 +9142,9 @@
   unittest.group('obj-schema-ChartDateTimeRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChartDateTimeRule();
-      var od = api.ChartDateTimeRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChartDateTimeRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChartDateTimeRule(od as api.ChartDateTimeRule);
     });
   });
@@ -9024,7 +9152,9 @@
   unittest.group('obj-schema-ChartGroupRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChartGroupRule();
-      var od = api.ChartGroupRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChartGroupRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChartGroupRule(od as api.ChartGroupRule);
     });
   });
@@ -9032,7 +9162,9 @@
   unittest.group('obj-schema-ChartHistogramRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChartHistogramRule();
-      var od = api.ChartHistogramRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChartHistogramRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChartHistogramRule(od as api.ChartHistogramRule);
     });
   });
@@ -9040,7 +9172,9 @@
   unittest.group('obj-schema-ChartSourceRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChartSourceRange();
-      var od = api.ChartSourceRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChartSourceRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChartSourceRange(od as api.ChartSourceRange);
     });
   });
@@ -9048,7 +9182,9 @@
   unittest.group('obj-schema-ChartSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChartSpec();
-      var od = api.ChartSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ChartSpec.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChartSpec(od as api.ChartSpec);
     });
   });
@@ -9056,7 +9192,9 @@
   unittest.group('obj-schema-ClearBasicFilterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClearBasicFilterRequest();
-      var od = api.ClearBasicFilterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClearBasicFilterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClearBasicFilterRequest(od as api.ClearBasicFilterRequest);
     });
   });
@@ -9064,7 +9202,9 @@
   unittest.group('obj-schema-ClearValuesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClearValuesRequest();
-      var od = api.ClearValuesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClearValuesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClearValuesRequest(od as api.ClearValuesRequest);
     });
   });
@@ -9072,7 +9212,9 @@
   unittest.group('obj-schema-ClearValuesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClearValuesResponse();
-      var od = api.ClearValuesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClearValuesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClearValuesResponse(od as api.ClearValuesResponse);
     });
   });
@@ -9080,7 +9222,8 @@
   unittest.group('obj-schema-Color', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColor();
-      var od = api.Color.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Color.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColor(od as api.Color);
     });
   });
@@ -9088,7 +9231,9 @@
   unittest.group('obj-schema-ColorStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColorStyle();
-      var od = api.ColorStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ColorStyle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColorStyle(od as api.ColorStyle);
     });
   });
@@ -9096,7 +9241,9 @@
   unittest.group('obj-schema-ConditionValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConditionValue();
-      var od = api.ConditionValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConditionValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConditionValue(od as api.ConditionValue);
     });
   });
@@ -9104,7 +9251,9 @@
   unittest.group('obj-schema-ConditionalFormatRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConditionalFormatRule();
-      var od = api.ConditionalFormatRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConditionalFormatRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConditionalFormatRule(od as api.ConditionalFormatRule);
     });
   });
@@ -9112,7 +9261,9 @@
   unittest.group('obj-schema-CopyPasteRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCopyPasteRequest();
-      var od = api.CopyPasteRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CopyPasteRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCopyPasteRequest(od as api.CopyPasteRequest);
     });
   });
@@ -9120,7 +9271,9 @@
   unittest.group('obj-schema-CopySheetToAnotherSpreadsheetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCopySheetToAnotherSpreadsheetRequest();
-      var od = api.CopySheetToAnotherSpreadsheetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CopySheetToAnotherSpreadsheetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCopySheetToAnotherSpreadsheetRequest(
           od as api.CopySheetToAnotherSpreadsheetRequest);
     });
@@ -9129,7 +9282,9 @@
   unittest.group('obj-schema-CreateDeveloperMetadataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateDeveloperMetadataRequest();
-      var od = api.CreateDeveloperMetadataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateDeveloperMetadataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateDeveloperMetadataRequest(
           od as api.CreateDeveloperMetadataRequest);
     });
@@ -9138,7 +9293,9 @@
   unittest.group('obj-schema-CreateDeveloperMetadataResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateDeveloperMetadataResponse();
-      var od = api.CreateDeveloperMetadataResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateDeveloperMetadataResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateDeveloperMetadataResponse(
           od as api.CreateDeveloperMetadataResponse);
     });
@@ -9147,7 +9304,9 @@
   unittest.group('obj-schema-CutPasteRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCutPasteRequest();
-      var od = api.CutPasteRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CutPasteRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCutPasteRequest(od as api.CutPasteRequest);
     });
   });
@@ -9155,7 +9314,9 @@
   unittest.group('obj-schema-DataExecutionStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataExecutionStatus();
-      var od = api.DataExecutionStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataExecutionStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataExecutionStatus(od as api.DataExecutionStatus);
     });
   });
@@ -9163,7 +9324,9 @@
   unittest.group('obj-schema-DataFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataFilter();
-      var od = api.DataFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DataFilter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataFilter(od as api.DataFilter);
     });
   });
@@ -9171,7 +9334,9 @@
   unittest.group('obj-schema-DataFilterValueRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataFilterValueRange();
-      var od = api.DataFilterValueRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataFilterValueRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataFilterValueRange(od as api.DataFilterValueRange);
     });
   });
@@ -9179,7 +9344,9 @@
   unittest.group('obj-schema-DataLabel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataLabel();
-      var od = api.DataLabel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DataLabel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataLabel(od as api.DataLabel);
     });
   });
@@ -9187,7 +9354,9 @@
   unittest.group('obj-schema-DataSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSource();
-      var od = api.DataSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DataSource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDataSource(od as api.DataSource);
     });
   });
@@ -9195,7 +9364,9 @@
   unittest.group('obj-schema-DataSourceChartProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceChartProperties();
-      var od = api.DataSourceChartProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceChartProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceChartProperties(od as api.DataSourceChartProperties);
     });
   });
@@ -9203,7 +9374,9 @@
   unittest.group('obj-schema-DataSourceColumn', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceColumn();
-      var od = api.DataSourceColumn.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceColumn.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceColumn(od as api.DataSourceColumn);
     });
   });
@@ -9211,7 +9384,9 @@
   unittest.group('obj-schema-DataSourceColumnReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceColumnReference();
-      var od = api.DataSourceColumnReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceColumnReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceColumnReference(od as api.DataSourceColumnReference);
     });
   });
@@ -9219,7 +9394,9 @@
   unittest.group('obj-schema-DataSourceFormula', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceFormula();
-      var od = api.DataSourceFormula.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceFormula.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceFormula(od as api.DataSourceFormula);
     });
   });
@@ -9227,7 +9404,9 @@
   unittest.group('obj-schema-DataSourceObjectReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceObjectReference();
-      var od = api.DataSourceObjectReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceObjectReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceObjectReference(od as api.DataSourceObjectReference);
     });
   });
@@ -9235,7 +9414,9 @@
   unittest.group('obj-schema-DataSourceObjectReferences', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceObjectReferences();
-      var od = api.DataSourceObjectReferences.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceObjectReferences.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceObjectReferences(od as api.DataSourceObjectReferences);
     });
   });
@@ -9243,7 +9424,9 @@
   unittest.group('obj-schema-DataSourceParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceParameter();
-      var od = api.DataSourceParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceParameter(od as api.DataSourceParameter);
     });
   });
@@ -9251,7 +9434,9 @@
   unittest.group('obj-schema-DataSourceRefreshDailySchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceRefreshDailySchedule();
-      var od = api.DataSourceRefreshDailySchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceRefreshDailySchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceRefreshDailySchedule(
           od as api.DataSourceRefreshDailySchedule);
     });
@@ -9260,7 +9445,9 @@
   unittest.group('obj-schema-DataSourceRefreshMonthlySchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceRefreshMonthlySchedule();
-      var od = api.DataSourceRefreshMonthlySchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceRefreshMonthlySchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceRefreshMonthlySchedule(
           od as api.DataSourceRefreshMonthlySchedule);
     });
@@ -9269,7 +9456,9 @@
   unittest.group('obj-schema-DataSourceRefreshSchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceRefreshSchedule();
-      var od = api.DataSourceRefreshSchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceRefreshSchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceRefreshSchedule(od as api.DataSourceRefreshSchedule);
     });
   });
@@ -9277,7 +9466,9 @@
   unittest.group('obj-schema-DataSourceRefreshWeeklySchedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceRefreshWeeklySchedule();
-      var od = api.DataSourceRefreshWeeklySchedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceRefreshWeeklySchedule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceRefreshWeeklySchedule(
           od as api.DataSourceRefreshWeeklySchedule);
     });
@@ -9286,7 +9477,9 @@
   unittest.group('obj-schema-DataSourceSheetDimensionRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceSheetDimensionRange();
-      var od = api.DataSourceSheetDimensionRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceSheetDimensionRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceSheetDimensionRange(
           od as api.DataSourceSheetDimensionRange);
     });
@@ -9295,7 +9488,9 @@
   unittest.group('obj-schema-DataSourceSheetProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceSheetProperties();
-      var od = api.DataSourceSheetProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceSheetProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceSheetProperties(od as api.DataSourceSheetProperties);
     });
   });
@@ -9303,7 +9498,9 @@
   unittest.group('obj-schema-DataSourceSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceSpec();
-      var od = api.DataSourceSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceSpec(od as api.DataSourceSpec);
     });
   });
@@ -9311,7 +9508,9 @@
   unittest.group('obj-schema-DataSourceTable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataSourceTable();
-      var od = api.DataSourceTable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataSourceTable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataSourceTable(od as api.DataSourceTable);
     });
   });
@@ -9319,7 +9518,9 @@
   unittest.group('obj-schema-DataValidationRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataValidationRule();
-      var od = api.DataValidationRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataValidationRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataValidationRule(od as api.DataValidationRule);
     });
   });
@@ -9327,7 +9528,9 @@
   unittest.group('obj-schema-DateTimeRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateTimeRule();
-      var od = api.DateTimeRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DateTimeRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDateTimeRule(od as api.DateTimeRule);
     });
   });
@@ -9335,7 +9538,9 @@
   unittest.group('obj-schema-DeleteBandingRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteBandingRequest();
-      var od = api.DeleteBandingRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteBandingRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteBandingRequest(od as api.DeleteBandingRequest);
     });
   });
@@ -9343,7 +9548,9 @@
   unittest.group('obj-schema-DeleteConditionalFormatRuleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteConditionalFormatRuleRequest();
-      var od = api.DeleteConditionalFormatRuleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteConditionalFormatRuleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteConditionalFormatRuleRequest(
           od as api.DeleteConditionalFormatRuleRequest);
     });
@@ -9352,7 +9559,9 @@
   unittest.group('obj-schema-DeleteConditionalFormatRuleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteConditionalFormatRuleResponse();
-      var od = api.DeleteConditionalFormatRuleResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteConditionalFormatRuleResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteConditionalFormatRuleResponse(
           od as api.DeleteConditionalFormatRuleResponse);
     });
@@ -9361,7 +9570,9 @@
   unittest.group('obj-schema-DeleteDataSourceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteDataSourceRequest();
-      var od = api.DeleteDataSourceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteDataSourceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteDataSourceRequest(od as api.DeleteDataSourceRequest);
     });
   });
@@ -9369,7 +9580,9 @@
   unittest.group('obj-schema-DeleteDeveloperMetadataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteDeveloperMetadataRequest();
-      var od = api.DeleteDeveloperMetadataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteDeveloperMetadataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteDeveloperMetadataRequest(
           od as api.DeleteDeveloperMetadataRequest);
     });
@@ -9378,7 +9591,9 @@
   unittest.group('obj-schema-DeleteDeveloperMetadataResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteDeveloperMetadataResponse();
-      var od = api.DeleteDeveloperMetadataResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteDeveloperMetadataResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteDeveloperMetadataResponse(
           od as api.DeleteDeveloperMetadataResponse);
     });
@@ -9387,7 +9602,9 @@
   unittest.group('obj-schema-DeleteDimensionGroupRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteDimensionGroupRequest();
-      var od = api.DeleteDimensionGroupRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteDimensionGroupRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteDimensionGroupRequest(od as api.DeleteDimensionGroupRequest);
     });
   });
@@ -9395,7 +9612,9 @@
   unittest.group('obj-schema-DeleteDimensionGroupResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteDimensionGroupResponse();
-      var od = api.DeleteDimensionGroupResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteDimensionGroupResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteDimensionGroupResponse(od as api.DeleteDimensionGroupResponse);
     });
   });
@@ -9403,7 +9622,9 @@
   unittest.group('obj-schema-DeleteDimensionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteDimensionRequest();
-      var od = api.DeleteDimensionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteDimensionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteDimensionRequest(od as api.DeleteDimensionRequest);
     });
   });
@@ -9411,7 +9632,9 @@
   unittest.group('obj-schema-DeleteDuplicatesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteDuplicatesRequest();
-      var od = api.DeleteDuplicatesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteDuplicatesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteDuplicatesRequest(od as api.DeleteDuplicatesRequest);
     });
   });
@@ -9419,7 +9642,9 @@
   unittest.group('obj-schema-DeleteDuplicatesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteDuplicatesResponse();
-      var od = api.DeleteDuplicatesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteDuplicatesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteDuplicatesResponse(od as api.DeleteDuplicatesResponse);
     });
   });
@@ -9427,7 +9652,9 @@
   unittest.group('obj-schema-DeleteEmbeddedObjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteEmbeddedObjectRequest();
-      var od = api.DeleteEmbeddedObjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteEmbeddedObjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteEmbeddedObjectRequest(od as api.DeleteEmbeddedObjectRequest);
     });
   });
@@ -9435,7 +9662,9 @@
   unittest.group('obj-schema-DeleteFilterViewRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteFilterViewRequest();
-      var od = api.DeleteFilterViewRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteFilterViewRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteFilterViewRequest(od as api.DeleteFilterViewRequest);
     });
   });
@@ -9443,7 +9672,9 @@
   unittest.group('obj-schema-DeleteNamedRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteNamedRangeRequest();
-      var od = api.DeleteNamedRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteNamedRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteNamedRangeRequest(od as api.DeleteNamedRangeRequest);
     });
   });
@@ -9451,7 +9682,9 @@
   unittest.group('obj-schema-DeleteProtectedRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteProtectedRangeRequest();
-      var od = api.DeleteProtectedRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteProtectedRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteProtectedRangeRequest(od as api.DeleteProtectedRangeRequest);
     });
   });
@@ -9459,7 +9692,9 @@
   unittest.group('obj-schema-DeleteRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteRangeRequest();
-      var od = api.DeleteRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteRangeRequest(od as api.DeleteRangeRequest);
     });
   });
@@ -9467,7 +9702,9 @@
   unittest.group('obj-schema-DeleteSheetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteSheetRequest();
-      var od = api.DeleteSheetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteSheetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteSheetRequest(od as api.DeleteSheetRequest);
     });
   });
@@ -9475,7 +9712,9 @@
   unittest.group('obj-schema-DeveloperMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeveloperMetadata();
-      var od = api.DeveloperMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeveloperMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeveloperMetadata(od as api.DeveloperMetadata);
     });
   });
@@ -9483,7 +9722,9 @@
   unittest.group('obj-schema-DeveloperMetadataLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeveloperMetadataLocation();
-      var od = api.DeveloperMetadataLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeveloperMetadataLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeveloperMetadataLocation(od as api.DeveloperMetadataLocation);
     });
   });
@@ -9491,7 +9732,9 @@
   unittest.group('obj-schema-DeveloperMetadataLookup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeveloperMetadataLookup();
-      var od = api.DeveloperMetadataLookup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeveloperMetadataLookup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeveloperMetadataLookup(od as api.DeveloperMetadataLookup);
     });
   });
@@ -9499,7 +9742,9 @@
   unittest.group('obj-schema-DimensionGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionGroup();
-      var od = api.DimensionGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionGroup(od as api.DimensionGroup);
     });
   });
@@ -9507,7 +9752,9 @@
   unittest.group('obj-schema-DimensionProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionProperties();
-      var od = api.DimensionProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionProperties(od as api.DimensionProperties);
     });
   });
@@ -9515,7 +9762,9 @@
   unittest.group('obj-schema-DimensionRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionRange();
-      var od = api.DimensionRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionRange(od as api.DimensionRange);
     });
   });
@@ -9523,7 +9772,9 @@
   unittest.group('obj-schema-DuplicateFilterViewRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDuplicateFilterViewRequest();
-      var od = api.DuplicateFilterViewRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DuplicateFilterViewRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDuplicateFilterViewRequest(od as api.DuplicateFilterViewRequest);
     });
   });
@@ -9531,7 +9782,9 @@
   unittest.group('obj-schema-DuplicateFilterViewResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDuplicateFilterViewResponse();
-      var od = api.DuplicateFilterViewResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DuplicateFilterViewResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDuplicateFilterViewResponse(od as api.DuplicateFilterViewResponse);
     });
   });
@@ -9539,7 +9792,9 @@
   unittest.group('obj-schema-DuplicateSheetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDuplicateSheetRequest();
-      var od = api.DuplicateSheetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DuplicateSheetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDuplicateSheetRequest(od as api.DuplicateSheetRequest);
     });
   });
@@ -9547,7 +9802,9 @@
   unittest.group('obj-schema-DuplicateSheetResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDuplicateSheetResponse();
-      var od = api.DuplicateSheetResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DuplicateSheetResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDuplicateSheetResponse(od as api.DuplicateSheetResponse);
     });
   });
@@ -9555,7 +9812,9 @@
   unittest.group('obj-schema-Editors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEditors();
-      var od = api.Editors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Editors.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEditors(od as api.Editors);
     });
   });
@@ -9563,7 +9822,9 @@
   unittest.group('obj-schema-EmbeddedChart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmbeddedChart();
-      var od = api.EmbeddedChart.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmbeddedChart.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmbeddedChart(od as api.EmbeddedChart);
     });
   });
@@ -9571,7 +9832,9 @@
   unittest.group('obj-schema-EmbeddedObjectBorder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmbeddedObjectBorder();
-      var od = api.EmbeddedObjectBorder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmbeddedObjectBorder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmbeddedObjectBorder(od as api.EmbeddedObjectBorder);
     });
   });
@@ -9579,7 +9842,9 @@
   unittest.group('obj-schema-EmbeddedObjectPosition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmbeddedObjectPosition();
-      var od = api.EmbeddedObjectPosition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmbeddedObjectPosition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmbeddedObjectPosition(od as api.EmbeddedObjectPosition);
     });
   });
@@ -9587,7 +9852,9 @@
   unittest.group('obj-schema-ErrorValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorValue();
-      var od = api.ErrorValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ErrorValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkErrorValue(od as api.ErrorValue);
     });
   });
@@ -9595,7 +9862,9 @@
   unittest.group('obj-schema-ExtendedValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExtendedValue();
-      var od = api.ExtendedValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExtendedValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExtendedValue(od as api.ExtendedValue);
     });
   });
@@ -9603,7 +9872,9 @@
   unittest.group('obj-schema-FilterCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterCriteria();
-      var od = api.FilterCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterCriteria(od as api.FilterCriteria);
     });
   });
@@ -9611,7 +9882,9 @@
   unittest.group('obj-schema-FilterSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterSpec();
-      var od = api.FilterSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FilterSpec.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilterSpec(od as api.FilterSpec);
     });
   });
@@ -9619,7 +9892,9 @@
   unittest.group('obj-schema-FilterView', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterView();
-      var od = api.FilterView.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FilterView.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilterView(od as api.FilterView);
     });
   });
@@ -9627,7 +9902,9 @@
   unittest.group('obj-schema-FindReplaceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFindReplaceRequest();
-      var od = api.FindReplaceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FindReplaceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFindReplaceRequest(od as api.FindReplaceRequest);
     });
   });
@@ -9635,7 +9912,9 @@
   unittest.group('obj-schema-FindReplaceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFindReplaceResponse();
-      var od = api.FindReplaceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FindReplaceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFindReplaceResponse(od as api.FindReplaceResponse);
     });
   });
@@ -9643,7 +9922,9 @@
   unittest.group('obj-schema-GetSpreadsheetByDataFilterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetSpreadsheetByDataFilterRequest();
-      var od = api.GetSpreadsheetByDataFilterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetSpreadsheetByDataFilterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetSpreadsheetByDataFilterRequest(
           od as api.GetSpreadsheetByDataFilterRequest);
     });
@@ -9652,7 +9933,9 @@
   unittest.group('obj-schema-GradientRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGradientRule();
-      var od = api.GradientRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GradientRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGradientRule(od as api.GradientRule);
     });
   });
@@ -9660,7 +9943,9 @@
   unittest.group('obj-schema-GridCoordinate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGridCoordinate();
-      var od = api.GridCoordinate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GridCoordinate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGridCoordinate(od as api.GridCoordinate);
     });
   });
@@ -9668,7 +9953,9 @@
   unittest.group('obj-schema-GridData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGridData();
-      var od = api.GridData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GridData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGridData(od as api.GridData);
     });
   });
@@ -9676,7 +9963,9 @@
   unittest.group('obj-schema-GridProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGridProperties();
-      var od = api.GridProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GridProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGridProperties(od as api.GridProperties);
     });
   });
@@ -9684,7 +9973,9 @@
   unittest.group('obj-schema-GridRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGridRange();
-      var od = api.GridRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GridRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGridRange(od as api.GridRange);
     });
   });
@@ -9692,7 +9983,9 @@
   unittest.group('obj-schema-HistogramChartSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistogramChartSpec();
-      var od = api.HistogramChartSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistogramChartSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistogramChartSpec(od as api.HistogramChartSpec);
     });
   });
@@ -9700,7 +9993,9 @@
   unittest.group('obj-schema-HistogramRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistogramRule();
-      var od = api.HistogramRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistogramRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistogramRule(od as api.HistogramRule);
     });
   });
@@ -9708,7 +10003,9 @@
   unittest.group('obj-schema-HistogramSeries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistogramSeries();
-      var od = api.HistogramSeries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HistogramSeries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHistogramSeries(od as api.HistogramSeries);
     });
   });
@@ -9716,7 +10013,9 @@
   unittest.group('obj-schema-InsertDimensionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertDimensionRequest();
-      var od = api.InsertDimensionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertDimensionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertDimensionRequest(od as api.InsertDimensionRequest);
     });
   });
@@ -9724,7 +10023,9 @@
   unittest.group('obj-schema-InsertRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertRangeRequest();
-      var od = api.InsertRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertRangeRequest(od as api.InsertRangeRequest);
     });
   });
@@ -9732,7 +10033,9 @@
   unittest.group('obj-schema-InterpolationPoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterpolationPoint();
-      var od = api.InterpolationPoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InterpolationPoint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInterpolationPoint(od as api.InterpolationPoint);
     });
   });
@@ -9740,7 +10043,9 @@
   unittest.group('obj-schema-Interval', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInterval();
-      var od = api.Interval.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Interval.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInterval(od as api.Interval);
     });
   });
@@ -9748,7 +10053,9 @@
   unittest.group('obj-schema-IterativeCalculationSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIterativeCalculationSettings();
-      var od = api.IterativeCalculationSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IterativeCalculationSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIterativeCalculationSettings(od as api.IterativeCalculationSettings);
     });
   });
@@ -9756,7 +10063,9 @@
   unittest.group('obj-schema-KeyValueFormat', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyValueFormat();
-      var od = api.KeyValueFormat.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeyValueFormat.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKeyValueFormat(od as api.KeyValueFormat);
     });
   });
@@ -9764,7 +10073,9 @@
   unittest.group('obj-schema-LineStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLineStyle();
-      var od = api.LineStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LineStyle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLineStyle(od as api.LineStyle);
     });
   });
@@ -9772,7 +10083,9 @@
   unittest.group('obj-schema-ManualRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManualRule();
-      var od = api.ManualRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ManualRule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkManualRule(od as api.ManualRule);
     });
   });
@@ -9780,7 +10093,9 @@
   unittest.group('obj-schema-ManualRuleGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManualRuleGroup();
-      var od = api.ManualRuleGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManualRuleGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManualRuleGroup(od as api.ManualRuleGroup);
     });
   });
@@ -9788,7 +10103,9 @@
   unittest.group('obj-schema-MatchedDeveloperMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMatchedDeveloperMetadata();
-      var od = api.MatchedDeveloperMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MatchedDeveloperMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMatchedDeveloperMetadata(od as api.MatchedDeveloperMetadata);
     });
   });
@@ -9796,7 +10113,9 @@
   unittest.group('obj-schema-MatchedValueRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMatchedValueRange();
-      var od = api.MatchedValueRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MatchedValueRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMatchedValueRange(od as api.MatchedValueRange);
     });
   });
@@ -9804,7 +10123,9 @@
   unittest.group('obj-schema-MergeCellsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMergeCellsRequest();
-      var od = api.MergeCellsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MergeCellsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMergeCellsRequest(od as api.MergeCellsRequest);
     });
   });
@@ -9812,7 +10133,9 @@
   unittest.group('obj-schema-MoveDimensionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoveDimensionRequest();
-      var od = api.MoveDimensionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MoveDimensionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMoveDimensionRequest(od as api.MoveDimensionRequest);
     });
   });
@@ -9820,7 +10143,9 @@
   unittest.group('obj-schema-NamedRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNamedRange();
-      var od = api.NamedRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NamedRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNamedRange(od as api.NamedRange);
     });
   });
@@ -9828,7 +10153,9 @@
   unittest.group('obj-schema-NumberFormat', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNumberFormat();
-      var od = api.NumberFormat.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NumberFormat.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNumberFormat(od as api.NumberFormat);
     });
   });
@@ -9836,7 +10163,9 @@
   unittest.group('obj-schema-OrgChartSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrgChartSpec();
-      var od = api.OrgChartSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrgChartSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrgChartSpec(od as api.OrgChartSpec);
     });
   });
@@ -9844,7 +10173,9 @@
   unittest.group('obj-schema-OverlayPosition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOverlayPosition();
-      var od = api.OverlayPosition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OverlayPosition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOverlayPosition(od as api.OverlayPosition);
     });
   });
@@ -9852,7 +10183,9 @@
   unittest.group('obj-schema-Padding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPadding();
-      var od = api.Padding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Padding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPadding(od as api.Padding);
     });
   });
@@ -9860,7 +10193,9 @@
   unittest.group('obj-schema-PasteDataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPasteDataRequest();
-      var od = api.PasteDataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PasteDataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPasteDataRequest(od as api.PasteDataRequest);
     });
   });
@@ -9868,7 +10203,9 @@
   unittest.group('obj-schema-PieChartSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPieChartSpec();
-      var od = api.PieChartSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PieChartSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPieChartSpec(od as api.PieChartSpec);
     });
   });
@@ -9876,7 +10213,9 @@
   unittest.group('obj-schema-PivotFilterCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotFilterCriteria();
-      var od = api.PivotFilterCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotFilterCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotFilterCriteria(od as api.PivotFilterCriteria);
     });
   });
@@ -9884,7 +10223,9 @@
   unittest.group('obj-schema-PivotFilterSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotFilterSpec();
-      var od = api.PivotFilterSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotFilterSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotFilterSpec(od as api.PivotFilterSpec);
     });
   });
@@ -9892,7 +10233,9 @@
   unittest.group('obj-schema-PivotGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotGroup();
-      var od = api.PivotGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PivotGroup.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPivotGroup(od as api.PivotGroup);
     });
   });
@@ -9900,7 +10243,9 @@
   unittest.group('obj-schema-PivotGroupLimit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotGroupLimit();
-      var od = api.PivotGroupLimit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotGroupLimit.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotGroupLimit(od as api.PivotGroupLimit);
     });
   });
@@ -9908,7 +10253,9 @@
   unittest.group('obj-schema-PivotGroupRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotGroupRule();
-      var od = api.PivotGroupRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotGroupRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotGroupRule(od as api.PivotGroupRule);
     });
   });
@@ -9916,7 +10263,9 @@
   unittest.group('obj-schema-PivotGroupSortValueBucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotGroupSortValueBucket();
-      var od = api.PivotGroupSortValueBucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotGroupSortValueBucket.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotGroupSortValueBucket(od as api.PivotGroupSortValueBucket);
     });
   });
@@ -9924,7 +10273,9 @@
   unittest.group('obj-schema-PivotGroupValueMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotGroupValueMetadata();
-      var od = api.PivotGroupValueMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotGroupValueMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotGroupValueMetadata(od as api.PivotGroupValueMetadata);
     });
   });
@@ -9932,7 +10283,9 @@
   unittest.group('obj-schema-PivotTable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotTable();
-      var od = api.PivotTable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PivotTable.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPivotTable(od as api.PivotTable);
     });
   });
@@ -9940,7 +10293,9 @@
   unittest.group('obj-schema-PivotValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotValue();
-      var od = api.PivotValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PivotValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPivotValue(od as api.PivotValue);
     });
   });
@@ -9948,7 +10303,9 @@
   unittest.group('obj-schema-PointStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPointStyle();
-      var od = api.PointStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PointStyle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPointStyle(od as api.PointStyle);
     });
   });
@@ -9956,7 +10313,9 @@
   unittest.group('obj-schema-ProtectedRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProtectedRange();
-      var od = api.ProtectedRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProtectedRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProtectedRange(od as api.ProtectedRange);
     });
   });
@@ -9964,7 +10323,9 @@
   unittest.group('obj-schema-RandomizeRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRandomizeRangeRequest();
-      var od = api.RandomizeRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RandomizeRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRandomizeRangeRequest(od as api.RandomizeRangeRequest);
     });
   });
@@ -9972,7 +10333,9 @@
   unittest.group('obj-schema-RefreshDataSourceObjectExecutionStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRefreshDataSourceObjectExecutionStatus();
-      var od = api.RefreshDataSourceObjectExecutionStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RefreshDataSourceObjectExecutionStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRefreshDataSourceObjectExecutionStatus(
           od as api.RefreshDataSourceObjectExecutionStatus);
     });
@@ -9981,7 +10344,9 @@
   unittest.group('obj-schema-RefreshDataSourceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRefreshDataSourceRequest();
-      var od = api.RefreshDataSourceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RefreshDataSourceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRefreshDataSourceRequest(od as api.RefreshDataSourceRequest);
     });
   });
@@ -9989,7 +10354,9 @@
   unittest.group('obj-schema-RefreshDataSourceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRefreshDataSourceResponse();
-      var od = api.RefreshDataSourceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RefreshDataSourceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRefreshDataSourceResponse(od as api.RefreshDataSourceResponse);
     });
   });
@@ -9997,7 +10364,9 @@
   unittest.group('obj-schema-RepeatCellRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepeatCellRequest();
-      var od = api.RepeatCellRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RepeatCellRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRepeatCellRequest(od as api.RepeatCellRequest);
     });
   });
@@ -10005,7 +10374,9 @@
   unittest.group('obj-schema-Request', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequest();
-      var od = api.Request.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Request.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRequest(od as api.Request);
     });
   });
@@ -10013,7 +10384,9 @@
   unittest.group('obj-schema-Response', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResponse();
-      var od = api.Response.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Response.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResponse(od as api.Response);
     });
   });
@@ -10021,7 +10394,9 @@
   unittest.group('obj-schema-RowData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRowData();
-      var od = api.RowData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RowData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRowData(od as api.RowData);
     });
   });
@@ -10029,7 +10404,9 @@
   unittest.group('obj-schema-ScorecardChartSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScorecardChartSpec();
-      var od = api.ScorecardChartSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScorecardChartSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScorecardChartSpec(od as api.ScorecardChartSpec);
     });
   });
@@ -10037,7 +10414,9 @@
   unittest.group('obj-schema-SearchDeveloperMetadataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchDeveloperMetadataRequest();
-      var od = api.SearchDeveloperMetadataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchDeveloperMetadataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchDeveloperMetadataRequest(
           od as api.SearchDeveloperMetadataRequest);
     });
@@ -10046,7 +10425,9 @@
   unittest.group('obj-schema-SearchDeveloperMetadataResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchDeveloperMetadataResponse();
-      var od = api.SearchDeveloperMetadataResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchDeveloperMetadataResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchDeveloperMetadataResponse(
           od as api.SearchDeveloperMetadataResponse);
     });
@@ -10055,7 +10436,9 @@
   unittest.group('obj-schema-SetBasicFilterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetBasicFilterRequest();
-      var od = api.SetBasicFilterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetBasicFilterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetBasicFilterRequest(od as api.SetBasicFilterRequest);
     });
   });
@@ -10063,7 +10446,9 @@
   unittest.group('obj-schema-SetDataValidationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetDataValidationRequest();
-      var od = api.SetDataValidationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetDataValidationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetDataValidationRequest(od as api.SetDataValidationRequest);
     });
   });
@@ -10071,7 +10456,8 @@
   unittest.group('obj-schema-Sheet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSheet();
-      var od = api.Sheet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Sheet.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSheet(od as api.Sheet);
     });
   });
@@ -10079,7 +10465,9 @@
   unittest.group('obj-schema-SheetProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSheetProperties();
-      var od = api.SheetProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SheetProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSheetProperties(od as api.SheetProperties);
     });
   });
@@ -10087,7 +10475,9 @@
   unittest.group('obj-schema-Slicer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSlicer();
-      var od = api.Slicer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Slicer.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSlicer(od as api.Slicer);
     });
   });
@@ -10095,7 +10485,9 @@
   unittest.group('obj-schema-SlicerSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSlicerSpec();
-      var od = api.SlicerSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SlicerSpec.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSlicerSpec(od as api.SlicerSpec);
     });
   });
@@ -10103,7 +10495,9 @@
   unittest.group('obj-schema-SortRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSortRangeRequest();
-      var od = api.SortRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SortRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSortRangeRequest(od as api.SortRangeRequest);
     });
   });
@@ -10111,7 +10505,9 @@
   unittest.group('obj-schema-SortSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSortSpec();
-      var od = api.SortSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SortSpec.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSortSpec(od as api.SortSpec);
     });
   });
@@ -10119,7 +10515,9 @@
   unittest.group('obj-schema-SourceAndDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceAndDestination();
-      var od = api.SourceAndDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceAndDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceAndDestination(od as api.SourceAndDestination);
     });
   });
@@ -10127,7 +10525,9 @@
   unittest.group('obj-schema-Spreadsheet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpreadsheet();
-      var od = api.Spreadsheet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Spreadsheet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpreadsheet(od as api.Spreadsheet);
     });
   });
@@ -10135,7 +10535,9 @@
   unittest.group('obj-schema-SpreadsheetProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpreadsheetProperties();
-      var od = api.SpreadsheetProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpreadsheetProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpreadsheetProperties(od as api.SpreadsheetProperties);
     });
   });
@@ -10143,7 +10545,9 @@
   unittest.group('obj-schema-SpreadsheetTheme', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpreadsheetTheme();
-      var od = api.SpreadsheetTheme.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpreadsheetTheme.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpreadsheetTheme(od as api.SpreadsheetTheme);
     });
   });
@@ -10151,7 +10555,9 @@
   unittest.group('obj-schema-TextFormat', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextFormat();
-      var od = api.TextFormat.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextFormat.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextFormat(od as api.TextFormat);
     });
   });
@@ -10159,7 +10565,9 @@
   unittest.group('obj-schema-TextFormatRun', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextFormatRun();
-      var od = api.TextFormatRun.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextFormatRun.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextFormatRun(od as api.TextFormatRun);
     });
   });
@@ -10167,7 +10575,9 @@
   unittest.group('obj-schema-TextPosition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextPosition();
-      var od = api.TextPosition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextPosition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextPosition(od as api.TextPosition);
     });
   });
@@ -10175,7 +10585,9 @@
   unittest.group('obj-schema-TextRotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextRotation();
-      var od = api.TextRotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextRotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextRotation(od as api.TextRotation);
     });
   });
@@ -10183,7 +10595,9 @@
   unittest.group('obj-schema-TextToColumnsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextToColumnsRequest();
-      var od = api.TextToColumnsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextToColumnsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextToColumnsRequest(od as api.TextToColumnsRequest);
     });
   });
@@ -10191,7 +10605,9 @@
   unittest.group('obj-schema-ThemeColorPair', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThemeColorPair();
-      var od = api.ThemeColorPair.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThemeColorPair.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThemeColorPair(od as api.ThemeColorPair);
     });
   });
@@ -10199,7 +10615,9 @@
   unittest.group('obj-schema-TimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeOfDay();
-      var od = api.TimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeOfDay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeOfDay(od as api.TimeOfDay);
     });
   });
@@ -10207,7 +10625,9 @@
   unittest.group('obj-schema-TreemapChartColorScale', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTreemapChartColorScale();
-      var od = api.TreemapChartColorScale.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TreemapChartColorScale.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTreemapChartColorScale(od as api.TreemapChartColorScale);
     });
   });
@@ -10215,7 +10635,9 @@
   unittest.group('obj-schema-TreemapChartSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTreemapChartSpec();
-      var od = api.TreemapChartSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TreemapChartSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTreemapChartSpec(od as api.TreemapChartSpec);
     });
   });
@@ -10223,7 +10645,9 @@
   unittest.group('obj-schema-TrimWhitespaceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrimWhitespaceRequest();
-      var od = api.TrimWhitespaceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrimWhitespaceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrimWhitespaceRequest(od as api.TrimWhitespaceRequest);
     });
   });
@@ -10231,7 +10655,9 @@
   unittest.group('obj-schema-TrimWhitespaceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrimWhitespaceResponse();
-      var od = api.TrimWhitespaceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrimWhitespaceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrimWhitespaceResponse(od as api.TrimWhitespaceResponse);
     });
   });
@@ -10239,7 +10665,9 @@
   unittest.group('obj-schema-UnmergeCellsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnmergeCellsRequest();
-      var od = api.UnmergeCellsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnmergeCellsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnmergeCellsRequest(od as api.UnmergeCellsRequest);
     });
   });
@@ -10247,7 +10675,9 @@
   unittest.group('obj-schema-UpdateBandingRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateBandingRequest();
-      var od = api.UpdateBandingRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateBandingRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateBandingRequest(od as api.UpdateBandingRequest);
     });
   });
@@ -10255,7 +10685,9 @@
   unittest.group('obj-schema-UpdateBordersRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateBordersRequest();
-      var od = api.UpdateBordersRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateBordersRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateBordersRequest(od as api.UpdateBordersRequest);
     });
   });
@@ -10263,7 +10695,9 @@
   unittest.group('obj-schema-UpdateCellsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateCellsRequest();
-      var od = api.UpdateCellsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateCellsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateCellsRequest(od as api.UpdateCellsRequest);
     });
   });
@@ -10271,7 +10705,9 @@
   unittest.group('obj-schema-UpdateChartSpecRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateChartSpecRequest();
-      var od = api.UpdateChartSpecRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateChartSpecRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateChartSpecRequest(od as api.UpdateChartSpecRequest);
     });
   });
@@ -10279,7 +10715,9 @@
   unittest.group('obj-schema-UpdateConditionalFormatRuleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateConditionalFormatRuleRequest();
-      var od = api.UpdateConditionalFormatRuleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateConditionalFormatRuleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateConditionalFormatRuleRequest(
           od as api.UpdateConditionalFormatRuleRequest);
     });
@@ -10288,7 +10726,9 @@
   unittest.group('obj-schema-UpdateConditionalFormatRuleResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateConditionalFormatRuleResponse();
-      var od = api.UpdateConditionalFormatRuleResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateConditionalFormatRuleResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateConditionalFormatRuleResponse(
           od as api.UpdateConditionalFormatRuleResponse);
     });
@@ -10297,7 +10737,9 @@
   unittest.group('obj-schema-UpdateDataSourceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDataSourceRequest();
-      var od = api.UpdateDataSourceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDataSourceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDataSourceRequest(od as api.UpdateDataSourceRequest);
     });
   });
@@ -10305,7 +10747,9 @@
   unittest.group('obj-schema-UpdateDataSourceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDataSourceResponse();
-      var od = api.UpdateDataSourceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDataSourceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDataSourceResponse(od as api.UpdateDataSourceResponse);
     });
   });
@@ -10313,7 +10757,9 @@
   unittest.group('obj-schema-UpdateDeveloperMetadataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDeveloperMetadataRequest();
-      var od = api.UpdateDeveloperMetadataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDeveloperMetadataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDeveloperMetadataRequest(
           od as api.UpdateDeveloperMetadataRequest);
     });
@@ -10322,7 +10768,9 @@
   unittest.group('obj-schema-UpdateDeveloperMetadataResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDeveloperMetadataResponse();
-      var od = api.UpdateDeveloperMetadataResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDeveloperMetadataResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDeveloperMetadataResponse(
           od as api.UpdateDeveloperMetadataResponse);
     });
@@ -10331,7 +10779,9 @@
   unittest.group('obj-schema-UpdateDimensionGroupRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDimensionGroupRequest();
-      var od = api.UpdateDimensionGroupRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDimensionGroupRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDimensionGroupRequest(od as api.UpdateDimensionGroupRequest);
     });
   });
@@ -10339,7 +10789,9 @@
   unittest.group('obj-schema-UpdateDimensionPropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDimensionPropertiesRequest();
-      var od = api.UpdateDimensionPropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDimensionPropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDimensionPropertiesRequest(
           od as api.UpdateDimensionPropertiesRequest);
     });
@@ -10348,7 +10800,9 @@
   unittest.group('obj-schema-UpdateEmbeddedObjectBorderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateEmbeddedObjectBorderRequest();
-      var od = api.UpdateEmbeddedObjectBorderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateEmbeddedObjectBorderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateEmbeddedObjectBorderRequest(
           od as api.UpdateEmbeddedObjectBorderRequest);
     });
@@ -10357,7 +10811,9 @@
   unittest.group('obj-schema-UpdateEmbeddedObjectPositionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateEmbeddedObjectPositionRequest();
-      var od = api.UpdateEmbeddedObjectPositionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateEmbeddedObjectPositionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateEmbeddedObjectPositionRequest(
           od as api.UpdateEmbeddedObjectPositionRequest);
     });
@@ -10366,7 +10822,9 @@
   unittest.group('obj-schema-UpdateEmbeddedObjectPositionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateEmbeddedObjectPositionResponse();
-      var od = api.UpdateEmbeddedObjectPositionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateEmbeddedObjectPositionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateEmbeddedObjectPositionResponse(
           od as api.UpdateEmbeddedObjectPositionResponse);
     });
@@ -10375,7 +10833,9 @@
   unittest.group('obj-schema-UpdateFilterViewRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateFilterViewRequest();
-      var od = api.UpdateFilterViewRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateFilterViewRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateFilterViewRequest(od as api.UpdateFilterViewRequest);
     });
   });
@@ -10383,7 +10843,9 @@
   unittest.group('obj-schema-UpdateNamedRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateNamedRangeRequest();
-      var od = api.UpdateNamedRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateNamedRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateNamedRangeRequest(od as api.UpdateNamedRangeRequest);
     });
   });
@@ -10391,7 +10853,9 @@
   unittest.group('obj-schema-UpdateProtectedRangeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateProtectedRangeRequest();
-      var od = api.UpdateProtectedRangeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateProtectedRangeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateProtectedRangeRequest(od as api.UpdateProtectedRangeRequest);
     });
   });
@@ -10399,7 +10863,9 @@
   unittest.group('obj-schema-UpdateSheetPropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateSheetPropertiesRequest();
-      var od = api.UpdateSheetPropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateSheetPropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateSheetPropertiesRequest(od as api.UpdateSheetPropertiesRequest);
     });
   });
@@ -10407,7 +10873,9 @@
   unittest.group('obj-schema-UpdateSlicerSpecRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateSlicerSpecRequest();
-      var od = api.UpdateSlicerSpecRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateSlicerSpecRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateSlicerSpecRequest(od as api.UpdateSlicerSpecRequest);
     });
   });
@@ -10415,7 +10883,9 @@
   unittest.group('obj-schema-UpdateSpreadsheetPropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateSpreadsheetPropertiesRequest();
-      var od = api.UpdateSpreadsheetPropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateSpreadsheetPropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateSpreadsheetPropertiesRequest(
           od as api.UpdateSpreadsheetPropertiesRequest);
     });
@@ -10424,7 +10894,9 @@
   unittest.group('obj-schema-UpdateValuesByDataFilterResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateValuesByDataFilterResponse();
-      var od = api.UpdateValuesByDataFilterResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateValuesByDataFilterResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateValuesByDataFilterResponse(
           od as api.UpdateValuesByDataFilterResponse);
     });
@@ -10433,7 +10905,9 @@
   unittest.group('obj-schema-UpdateValuesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateValuesResponse();
-      var od = api.UpdateValuesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateValuesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateValuesResponse(od as api.UpdateValuesResponse);
     });
   });
@@ -10441,7 +10915,9 @@
   unittest.group('obj-schema-ValueRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValueRange();
-      var od = api.ValueRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ValueRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkValueRange(od as api.ValueRange);
     });
   });
@@ -10449,7 +10925,9 @@
   unittest.group('obj-schema-WaterfallChartColumnStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWaterfallChartColumnStyle();
-      var od = api.WaterfallChartColumnStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WaterfallChartColumnStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWaterfallChartColumnStyle(od as api.WaterfallChartColumnStyle);
     });
   });
@@ -10457,7 +10935,9 @@
   unittest.group('obj-schema-WaterfallChartCustomSubtotal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWaterfallChartCustomSubtotal();
-      var od = api.WaterfallChartCustomSubtotal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WaterfallChartCustomSubtotal.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWaterfallChartCustomSubtotal(od as api.WaterfallChartCustomSubtotal);
     });
   });
@@ -10465,7 +10945,9 @@
   unittest.group('obj-schema-WaterfallChartDomain', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWaterfallChartDomain();
-      var od = api.WaterfallChartDomain.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WaterfallChartDomain.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWaterfallChartDomain(od as api.WaterfallChartDomain);
     });
   });
@@ -10473,7 +10955,9 @@
   unittest.group('obj-schema-WaterfallChartSeries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWaterfallChartSeries();
-      var od = api.WaterfallChartSeries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WaterfallChartSeries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWaterfallChartSeries(od as api.WaterfallChartSeries);
     });
   });
@@ -10481,7 +10965,9 @@
   unittest.group('obj-schema-WaterfallChartSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWaterfallChartSpec();
-      var od = api.WaterfallChartSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WaterfallChartSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWaterfallChartSpec(od as api.WaterfallChartSpec);
     });
   });
diff --git a/generated/googleapis/test/siteverification/v1_test.dart b/generated/googleapis/test/siteverification/v1_test.dart
index 477abb4..b467e36 100644
--- a/generated/googleapis/test/siteverification/v1_test.dart
+++ b/generated/googleapis/test/siteverification/v1_test.dart
@@ -230,8 +230,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteVerificationWebResourceGettokenRequestSite();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.SiteVerificationWebResourceGettokenRequestSite.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteVerificationWebResourceGettokenRequestSite(
           od as api.SiteVerificationWebResourceGettokenRequestSite);
     });
@@ -240,8 +241,9 @@
   unittest.group('obj-schema-SiteVerificationWebResourceGettokenRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteVerificationWebResourceGettokenRequest();
-      var od =
-          api.SiteVerificationWebResourceGettokenRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteVerificationWebResourceGettokenRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteVerificationWebResourceGettokenRequest(
           od as api.SiteVerificationWebResourceGettokenRequest);
     });
@@ -250,8 +252,9 @@
   unittest.group('obj-schema-SiteVerificationWebResourceGettokenResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteVerificationWebResourceGettokenResponse();
-      var od =
-          api.SiteVerificationWebResourceGettokenResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteVerificationWebResourceGettokenResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteVerificationWebResourceGettokenResponse(
           od as api.SiteVerificationWebResourceGettokenResponse);
     });
@@ -260,7 +263,9 @@
   unittest.group('obj-schema-SiteVerificationWebResourceListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteVerificationWebResourceListResponse();
-      var od = api.SiteVerificationWebResourceListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteVerificationWebResourceListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteVerificationWebResourceListResponse(
           od as api.SiteVerificationWebResourceListResponse);
     });
@@ -269,7 +274,9 @@
   unittest.group('obj-schema-SiteVerificationWebResourceResourceSite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteVerificationWebResourceResourceSite();
-      var od = api.SiteVerificationWebResourceResourceSite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteVerificationWebResourceResourceSite.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteVerificationWebResourceResourceSite(
           od as api.SiteVerificationWebResourceResourceSite);
     });
@@ -278,7 +285,9 @@
   unittest.group('obj-schema-SiteVerificationWebResourceResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSiteVerificationWebResourceResource();
-      var od = api.SiteVerificationWebResourceResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SiteVerificationWebResourceResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSiteVerificationWebResourceResource(
           od as api.SiteVerificationWebResourceResource);
     });
diff --git a/generated/googleapis/test/slides/v1_test.dart b/generated/googleapis/test/slides/v1_test.dart
index e2c6316..d1e7074 100644
--- a/generated/googleapis/test/slides/v1_test.dart
+++ b/generated/googleapis/test/slides/v1_test.dart
@@ -4353,7 +4353,9 @@
   unittest.group('obj-schema-AffineTransform', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAffineTransform();
-      var od = api.AffineTransform.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AffineTransform.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAffineTransform(od as api.AffineTransform);
     });
   });
@@ -4361,7 +4363,9 @@
   unittest.group('obj-schema-AutoText', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoText();
-      var od = api.AutoText.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AutoText.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAutoText(od as api.AutoText);
     });
   });
@@ -4369,7 +4373,9 @@
   unittest.group('obj-schema-Autofit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutofit();
-      var od = api.Autofit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Autofit.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAutofit(od as api.Autofit);
     });
   });
@@ -4377,7 +4383,9 @@
   unittest.group('obj-schema-BatchUpdatePresentationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdatePresentationRequest();
-      var od = api.BatchUpdatePresentationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdatePresentationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdatePresentationRequest(
           od as api.BatchUpdatePresentationRequest);
     });
@@ -4386,7 +4394,9 @@
   unittest.group('obj-schema-BatchUpdatePresentationResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdatePresentationResponse();
-      var od = api.BatchUpdatePresentationResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdatePresentationResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdatePresentationResponse(
           od as api.BatchUpdatePresentationResponse);
     });
@@ -4395,7 +4405,9 @@
   unittest.group('obj-schema-Bullet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBullet();
-      var od = api.Bullet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Bullet.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBullet(od as api.Bullet);
     });
   });
@@ -4403,7 +4415,9 @@
   unittest.group('obj-schema-ColorScheme', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColorScheme();
-      var od = api.ColorScheme.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ColorScheme.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkColorScheme(od as api.ColorScheme);
     });
   });
@@ -4411,7 +4425,9 @@
   unittest.group('obj-schema-ColorStop', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColorStop();
-      var od = api.ColorStop.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ColorStop.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColorStop(od as api.ColorStop);
     });
   });
@@ -4419,7 +4435,9 @@
   unittest.group('obj-schema-CreateImageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateImageRequest();
-      var od = api.CreateImageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateImageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateImageRequest(od as api.CreateImageRequest);
     });
   });
@@ -4427,7 +4445,9 @@
   unittest.group('obj-schema-CreateImageResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateImageResponse();
-      var od = api.CreateImageResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateImageResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateImageResponse(od as api.CreateImageResponse);
     });
   });
@@ -4435,7 +4455,9 @@
   unittest.group('obj-schema-CreateLineRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateLineRequest();
-      var od = api.CreateLineRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateLineRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateLineRequest(od as api.CreateLineRequest);
     });
   });
@@ -4443,7 +4465,9 @@
   unittest.group('obj-schema-CreateLineResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateLineResponse();
-      var od = api.CreateLineResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateLineResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateLineResponse(od as api.CreateLineResponse);
     });
   });
@@ -4451,7 +4475,9 @@
   unittest.group('obj-schema-CreateParagraphBulletsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateParagraphBulletsRequest();
-      var od = api.CreateParagraphBulletsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateParagraphBulletsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateParagraphBulletsRequest(
           od as api.CreateParagraphBulletsRequest);
     });
@@ -4460,7 +4486,9 @@
   unittest.group('obj-schema-CreateShapeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateShapeRequest();
-      var od = api.CreateShapeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateShapeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateShapeRequest(od as api.CreateShapeRequest);
     });
   });
@@ -4468,7 +4496,9 @@
   unittest.group('obj-schema-CreateShapeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateShapeResponse();
-      var od = api.CreateShapeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateShapeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateShapeResponse(od as api.CreateShapeResponse);
     });
   });
@@ -4476,7 +4506,9 @@
   unittest.group('obj-schema-CreateSheetsChartRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateSheetsChartRequest();
-      var od = api.CreateSheetsChartRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateSheetsChartRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateSheetsChartRequest(od as api.CreateSheetsChartRequest);
     });
   });
@@ -4484,7 +4516,9 @@
   unittest.group('obj-schema-CreateSheetsChartResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateSheetsChartResponse();
-      var od = api.CreateSheetsChartResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateSheetsChartResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateSheetsChartResponse(od as api.CreateSheetsChartResponse);
     });
   });
@@ -4492,7 +4526,9 @@
   unittest.group('obj-schema-CreateSlideRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateSlideRequest();
-      var od = api.CreateSlideRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateSlideRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateSlideRequest(od as api.CreateSlideRequest);
     });
   });
@@ -4500,7 +4536,9 @@
   unittest.group('obj-schema-CreateSlideResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateSlideResponse();
-      var od = api.CreateSlideResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateSlideResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateSlideResponse(od as api.CreateSlideResponse);
     });
   });
@@ -4508,7 +4546,9 @@
   unittest.group('obj-schema-CreateTableRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTableRequest();
-      var od = api.CreateTableRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTableRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTableRequest(od as api.CreateTableRequest);
     });
   });
@@ -4516,7 +4556,9 @@
   unittest.group('obj-schema-CreateTableResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTableResponse();
-      var od = api.CreateTableResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTableResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTableResponse(od as api.CreateTableResponse);
     });
   });
@@ -4524,7 +4566,9 @@
   unittest.group('obj-schema-CreateVideoRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateVideoRequest();
-      var od = api.CreateVideoRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateVideoRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateVideoRequest(od as api.CreateVideoRequest);
     });
   });
@@ -4532,7 +4576,9 @@
   unittest.group('obj-schema-CreateVideoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateVideoResponse();
-      var od = api.CreateVideoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateVideoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateVideoResponse(od as api.CreateVideoResponse);
     });
   });
@@ -4540,7 +4586,9 @@
   unittest.group('obj-schema-CropProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCropProperties();
-      var od = api.CropProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CropProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCropProperties(od as api.CropProperties);
     });
   });
@@ -4548,7 +4596,9 @@
   unittest.group('obj-schema-DeleteObjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteObjectRequest();
-      var od = api.DeleteObjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteObjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteObjectRequest(od as api.DeleteObjectRequest);
     });
   });
@@ -4556,7 +4606,9 @@
   unittest.group('obj-schema-DeleteParagraphBulletsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteParagraphBulletsRequest();
-      var od = api.DeleteParagraphBulletsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteParagraphBulletsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteParagraphBulletsRequest(
           od as api.DeleteParagraphBulletsRequest);
     });
@@ -4565,7 +4617,9 @@
   unittest.group('obj-schema-DeleteTableColumnRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTableColumnRequest();
-      var od = api.DeleteTableColumnRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTableColumnRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTableColumnRequest(od as api.DeleteTableColumnRequest);
     });
   });
@@ -4573,7 +4627,9 @@
   unittest.group('obj-schema-DeleteTableRowRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTableRowRequest();
-      var od = api.DeleteTableRowRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTableRowRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTableRowRequest(od as api.DeleteTableRowRequest);
     });
   });
@@ -4581,7 +4637,9 @@
   unittest.group('obj-schema-DeleteTextRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteTextRequest();
-      var od = api.DeleteTextRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteTextRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteTextRequest(od as api.DeleteTextRequest);
     });
   });
@@ -4589,7 +4647,9 @@
   unittest.group('obj-schema-Dimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimension();
-      var od = api.Dimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Dimension.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDimension(od as api.Dimension);
     });
   });
@@ -4597,7 +4657,9 @@
   unittest.group('obj-schema-DuplicateObjectRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDuplicateObjectRequest();
-      var od = api.DuplicateObjectRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DuplicateObjectRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDuplicateObjectRequest(od as api.DuplicateObjectRequest);
     });
   });
@@ -4605,7 +4667,9 @@
   unittest.group('obj-schema-DuplicateObjectResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDuplicateObjectResponse();
-      var od = api.DuplicateObjectResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DuplicateObjectResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDuplicateObjectResponse(od as api.DuplicateObjectResponse);
     });
   });
@@ -4613,7 +4677,8 @@
   unittest.group('obj-schema-Group', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroup();
-      var od = api.Group.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Group.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGroup(od as api.Group);
     });
   });
@@ -4621,7 +4686,9 @@
   unittest.group('obj-schema-GroupObjectsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupObjectsRequest();
-      var od = api.GroupObjectsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupObjectsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupObjectsRequest(od as api.GroupObjectsRequest);
     });
   });
@@ -4629,7 +4696,9 @@
   unittest.group('obj-schema-GroupObjectsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupObjectsResponse();
-      var od = api.GroupObjectsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupObjectsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupObjectsResponse(od as api.GroupObjectsResponse);
     });
   });
@@ -4637,7 +4706,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -4645,7 +4715,9 @@
   unittest.group('obj-schema-ImageProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageProperties();
-      var od = api.ImageProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageProperties(od as api.ImageProperties);
     });
   });
@@ -4653,7 +4725,9 @@
   unittest.group('obj-schema-InsertTableColumnsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertTableColumnsRequest();
-      var od = api.InsertTableColumnsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertTableColumnsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertTableColumnsRequest(od as api.InsertTableColumnsRequest);
     });
   });
@@ -4661,7 +4735,9 @@
   unittest.group('obj-schema-InsertTableRowsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertTableRowsRequest();
-      var od = api.InsertTableRowsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertTableRowsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertTableRowsRequest(od as api.InsertTableRowsRequest);
     });
   });
@@ -4669,7 +4745,9 @@
   unittest.group('obj-schema-InsertTextRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsertTextRequest();
-      var od = api.InsertTextRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsertTextRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsertTextRequest(od as api.InsertTextRequest);
     });
   });
@@ -4677,7 +4755,9 @@
   unittest.group('obj-schema-LayoutPlaceholderIdMapping', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLayoutPlaceholderIdMapping();
-      var od = api.LayoutPlaceholderIdMapping.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LayoutPlaceholderIdMapping.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLayoutPlaceholderIdMapping(od as api.LayoutPlaceholderIdMapping);
     });
   });
@@ -4685,7 +4765,9 @@
   unittest.group('obj-schema-LayoutProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLayoutProperties();
-      var od = api.LayoutProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LayoutProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLayoutProperties(od as api.LayoutProperties);
     });
   });
@@ -4693,7 +4775,9 @@
   unittest.group('obj-schema-LayoutReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLayoutReference();
-      var od = api.LayoutReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LayoutReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLayoutReference(od as api.LayoutReference);
     });
   });
@@ -4701,7 +4785,8 @@
   unittest.group('obj-schema-Line', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLine();
-      var od = api.Line.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Line.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLine(od as api.Line);
     });
   });
@@ -4709,7 +4794,9 @@
   unittest.group('obj-schema-LineConnection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLineConnection();
-      var od = api.LineConnection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LineConnection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLineConnection(od as api.LineConnection);
     });
   });
@@ -4717,7 +4804,9 @@
   unittest.group('obj-schema-LineFill', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLineFill();
-      var od = api.LineFill.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LineFill.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLineFill(od as api.LineFill);
     });
   });
@@ -4725,7 +4814,9 @@
   unittest.group('obj-schema-LineProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLineProperties();
-      var od = api.LineProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LineProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLineProperties(od as api.LineProperties);
     });
   });
@@ -4733,7 +4824,8 @@
   unittest.group('obj-schema-Link', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLink();
-      var od = api.Link.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Link.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLink(od as api.Link);
     });
   });
@@ -4741,7 +4833,8 @@
   unittest.group('obj-schema-List', () {
     unittest.test('to-json--from-json', () async {
       var o = buildList();
-      var od = api.List.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.List.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkList(od as api.List);
     });
   });
@@ -4749,7 +4842,9 @@
   unittest.group('obj-schema-MasterProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMasterProperties();
-      var od = api.MasterProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MasterProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMasterProperties(od as api.MasterProperties);
     });
   });
@@ -4757,7 +4852,9 @@
   unittest.group('obj-schema-MergeTableCellsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMergeTableCellsRequest();
-      var od = api.MergeTableCellsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MergeTableCellsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMergeTableCellsRequest(od as api.MergeTableCellsRequest);
     });
   });
@@ -4765,7 +4862,9 @@
   unittest.group('obj-schema-NestingLevel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNestingLevel();
-      var od = api.NestingLevel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NestingLevel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNestingLevel(od as api.NestingLevel);
     });
   });
@@ -4773,7 +4872,9 @@
   unittest.group('obj-schema-NotesProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotesProperties();
-      var od = api.NotesProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotesProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotesProperties(od as api.NotesProperties);
     });
   });
@@ -4781,7 +4882,9 @@
   unittest.group('obj-schema-OpaqueColor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOpaqueColor();
-      var od = api.OpaqueColor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OpaqueColor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOpaqueColor(od as api.OpaqueColor);
     });
   });
@@ -4789,7 +4892,9 @@
   unittest.group('obj-schema-OptionalColor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOptionalColor();
-      var od = api.OptionalColor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OptionalColor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOptionalColor(od as api.OptionalColor);
     });
   });
@@ -4797,7 +4902,9 @@
   unittest.group('obj-schema-Outline', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOutline();
-      var od = api.Outline.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Outline.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOutline(od as api.Outline);
     });
   });
@@ -4805,7 +4912,9 @@
   unittest.group('obj-schema-OutlineFill', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOutlineFill();
-      var od = api.OutlineFill.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OutlineFill.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOutlineFill(od as api.OutlineFill);
     });
   });
@@ -4813,7 +4922,8 @@
   unittest.group('obj-schema-Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPage();
-      var od = api.Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Page.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPage(od as api.Page);
     });
   });
@@ -4821,7 +4931,9 @@
   unittest.group('obj-schema-PageBackgroundFill', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageBackgroundFill();
-      var od = api.PageBackgroundFill.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PageBackgroundFill.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPageBackgroundFill(od as api.PageBackgroundFill);
     });
   });
@@ -4829,7 +4941,9 @@
   unittest.group('obj-schema-PageElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageElement();
-      var od = api.PageElement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PageElement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPageElement(od as api.PageElement);
     });
   });
@@ -4837,7 +4951,9 @@
   unittest.group('obj-schema-PageElementProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageElementProperties();
-      var od = api.PageElementProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PageElementProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPageElementProperties(od as api.PageElementProperties);
     });
   });
@@ -4845,7 +4961,9 @@
   unittest.group('obj-schema-PageProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageProperties();
-      var od = api.PageProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PageProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPageProperties(od as api.PageProperties);
     });
   });
@@ -4853,7 +4971,9 @@
   unittest.group('obj-schema-ParagraphMarker', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParagraphMarker();
-      var od = api.ParagraphMarker.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParagraphMarker.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParagraphMarker(od as api.ParagraphMarker);
     });
   });
@@ -4861,7 +4981,9 @@
   unittest.group('obj-schema-ParagraphStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParagraphStyle();
-      var od = api.ParagraphStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParagraphStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParagraphStyle(od as api.ParagraphStyle);
     });
   });
@@ -4869,7 +4991,9 @@
   unittest.group('obj-schema-Placeholder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaceholder();
-      var od = api.Placeholder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Placeholder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaceholder(od as api.Placeholder);
     });
   });
@@ -4877,7 +5001,9 @@
   unittest.group('obj-schema-Presentation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPresentation();
-      var od = api.Presentation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Presentation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPresentation(od as api.Presentation);
     });
   });
@@ -4885,7 +5011,8 @@
   unittest.group('obj-schema-Range', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRange();
-      var od = api.Range.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Range.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRange(od as api.Range);
     });
   });
@@ -4893,7 +5020,9 @@
   unittest.group('obj-schema-Recolor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecolor();
-      var od = api.Recolor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Recolor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRecolor(od as api.Recolor);
     });
   });
@@ -4901,7 +5030,9 @@
   unittest.group('obj-schema-RefreshSheetsChartRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRefreshSheetsChartRequest();
-      var od = api.RefreshSheetsChartRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RefreshSheetsChartRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRefreshSheetsChartRequest(od as api.RefreshSheetsChartRequest);
     });
   });
@@ -4909,7 +5040,9 @@
   unittest.group('obj-schema-ReplaceAllShapesWithImageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceAllShapesWithImageRequest();
-      var od = api.ReplaceAllShapesWithImageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceAllShapesWithImageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceAllShapesWithImageRequest(
           od as api.ReplaceAllShapesWithImageRequest);
     });
@@ -4918,7 +5051,9 @@
   unittest.group('obj-schema-ReplaceAllShapesWithImageResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceAllShapesWithImageResponse();
-      var od = api.ReplaceAllShapesWithImageResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceAllShapesWithImageResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceAllShapesWithImageResponse(
           od as api.ReplaceAllShapesWithImageResponse);
     });
@@ -4927,7 +5062,9 @@
   unittest.group('obj-schema-ReplaceAllShapesWithSheetsChartRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceAllShapesWithSheetsChartRequest();
-      var od = api.ReplaceAllShapesWithSheetsChartRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceAllShapesWithSheetsChartRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceAllShapesWithSheetsChartRequest(
           od as api.ReplaceAllShapesWithSheetsChartRequest);
     });
@@ -4936,7 +5073,9 @@
   unittest.group('obj-schema-ReplaceAllShapesWithSheetsChartResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceAllShapesWithSheetsChartResponse();
-      var od = api.ReplaceAllShapesWithSheetsChartResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceAllShapesWithSheetsChartResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceAllShapesWithSheetsChartResponse(
           od as api.ReplaceAllShapesWithSheetsChartResponse);
     });
@@ -4945,7 +5084,9 @@
   unittest.group('obj-schema-ReplaceAllTextRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceAllTextRequest();
-      var od = api.ReplaceAllTextRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceAllTextRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceAllTextRequest(od as api.ReplaceAllTextRequest);
     });
   });
@@ -4953,7 +5094,9 @@
   unittest.group('obj-schema-ReplaceAllTextResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceAllTextResponse();
-      var od = api.ReplaceAllTextResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceAllTextResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceAllTextResponse(od as api.ReplaceAllTextResponse);
     });
   });
@@ -4961,7 +5104,9 @@
   unittest.group('obj-schema-ReplaceImageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplaceImageRequest();
-      var od = api.ReplaceImageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplaceImageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplaceImageRequest(od as api.ReplaceImageRequest);
     });
   });
@@ -4969,7 +5114,9 @@
   unittest.group('obj-schema-Request', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequest();
-      var od = api.Request.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Request.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRequest(od as api.Request);
     });
   });
@@ -4977,7 +5124,9 @@
   unittest.group('obj-schema-RerouteLineRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRerouteLineRequest();
-      var od = api.RerouteLineRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RerouteLineRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRerouteLineRequest(od as api.RerouteLineRequest);
     });
   });
@@ -4985,7 +5134,9 @@
   unittest.group('obj-schema-Response', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResponse();
-      var od = api.Response.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Response.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResponse(od as api.Response);
     });
   });
@@ -4993,7 +5144,9 @@
   unittest.group('obj-schema-RgbColor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRgbColor();
-      var od = api.RgbColor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RgbColor.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRgbColor(od as api.RgbColor);
     });
   });
@@ -5001,7 +5154,9 @@
   unittest.group('obj-schema-Shadow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShadow();
-      var od = api.Shadow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Shadow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkShadow(od as api.Shadow);
     });
   });
@@ -5009,7 +5164,8 @@
   unittest.group('obj-schema-Shape', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShape();
-      var od = api.Shape.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Shape.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkShape(od as api.Shape);
     });
   });
@@ -5017,7 +5173,9 @@
   unittest.group('obj-schema-ShapeBackgroundFill', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShapeBackgroundFill();
-      var od = api.ShapeBackgroundFill.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShapeBackgroundFill.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShapeBackgroundFill(od as api.ShapeBackgroundFill);
     });
   });
@@ -5025,7 +5183,9 @@
   unittest.group('obj-schema-ShapeProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShapeProperties();
-      var od = api.ShapeProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShapeProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShapeProperties(od as api.ShapeProperties);
     });
   });
@@ -5033,7 +5193,9 @@
   unittest.group('obj-schema-SheetsChart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSheetsChart();
-      var od = api.SheetsChart.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SheetsChart.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSheetsChart(od as api.SheetsChart);
     });
   });
@@ -5041,7 +5203,9 @@
   unittest.group('obj-schema-SheetsChartProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSheetsChartProperties();
-      var od = api.SheetsChartProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SheetsChartProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSheetsChartProperties(od as api.SheetsChartProperties);
     });
   });
@@ -5049,7 +5213,8 @@
   unittest.group('obj-schema-Size', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSize();
-      var od = api.Size.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Size.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSize(od as api.Size);
     });
   });
@@ -5057,7 +5222,9 @@
   unittest.group('obj-schema-SlideProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSlideProperties();
-      var od = api.SlideProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SlideProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSlideProperties(od as api.SlideProperties);
     });
   });
@@ -5065,7 +5232,9 @@
   unittest.group('obj-schema-SolidFill', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSolidFill();
-      var od = api.SolidFill.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SolidFill.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSolidFill(od as api.SolidFill);
     });
   });
@@ -5073,7 +5242,9 @@
   unittest.group('obj-schema-StretchedPictureFill', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStretchedPictureFill();
-      var od = api.StretchedPictureFill.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StretchedPictureFill.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStretchedPictureFill(od as api.StretchedPictureFill);
     });
   });
@@ -5081,7 +5252,9 @@
   unittest.group('obj-schema-SubstringMatchCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubstringMatchCriteria();
-      var od = api.SubstringMatchCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubstringMatchCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubstringMatchCriteria(od as api.SubstringMatchCriteria);
     });
   });
@@ -5089,7 +5262,8 @@
   unittest.group('obj-schema-Table', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTable();
-      var od = api.Table.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Table.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTable(od as api.Table);
     });
   });
@@ -5097,7 +5271,9 @@
   unittest.group('obj-schema-TableBorderCell', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableBorderCell();
-      var od = api.TableBorderCell.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableBorderCell.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableBorderCell(od as api.TableBorderCell);
     });
   });
@@ -5105,7 +5281,9 @@
   unittest.group('obj-schema-TableBorderFill', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableBorderFill();
-      var od = api.TableBorderFill.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableBorderFill.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableBorderFill(od as api.TableBorderFill);
     });
   });
@@ -5113,7 +5291,9 @@
   unittest.group('obj-schema-TableBorderProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableBorderProperties();
-      var od = api.TableBorderProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableBorderProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableBorderProperties(od as api.TableBorderProperties);
     });
   });
@@ -5121,7 +5301,9 @@
   unittest.group('obj-schema-TableBorderRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableBorderRow();
-      var od = api.TableBorderRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableBorderRow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableBorderRow(od as api.TableBorderRow);
     });
   });
@@ -5129,7 +5311,9 @@
   unittest.group('obj-schema-TableCell', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableCell();
-      var od = api.TableCell.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TableCell.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTableCell(od as api.TableCell);
     });
   });
@@ -5137,7 +5321,9 @@
   unittest.group('obj-schema-TableCellBackgroundFill', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableCellBackgroundFill();
-      var od = api.TableCellBackgroundFill.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableCellBackgroundFill.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableCellBackgroundFill(od as api.TableCellBackgroundFill);
     });
   });
@@ -5145,7 +5331,9 @@
   unittest.group('obj-schema-TableCellLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableCellLocation();
-      var od = api.TableCellLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableCellLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableCellLocation(od as api.TableCellLocation);
     });
   });
@@ -5153,7 +5341,9 @@
   unittest.group('obj-schema-TableCellProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableCellProperties();
-      var od = api.TableCellProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableCellProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableCellProperties(od as api.TableCellProperties);
     });
   });
@@ -5161,7 +5351,9 @@
   unittest.group('obj-schema-TableColumnProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableColumnProperties();
-      var od = api.TableColumnProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableColumnProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableColumnProperties(od as api.TableColumnProperties);
     });
   });
@@ -5169,7 +5361,9 @@
   unittest.group('obj-schema-TableRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableRange();
-      var od = api.TableRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TableRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTableRange(od as api.TableRange);
     });
   });
@@ -5177,7 +5371,9 @@
   unittest.group('obj-schema-TableRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableRow();
-      var od = api.TableRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TableRow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTableRow(od as api.TableRow);
     });
   });
@@ -5185,7 +5381,9 @@
   unittest.group('obj-schema-TableRowProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTableRowProperties();
-      var od = api.TableRowProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TableRowProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTableRowProperties(od as api.TableRowProperties);
     });
   });
@@ -5193,7 +5391,9 @@
   unittest.group('obj-schema-TextContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextContent();
-      var od = api.TextContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextContent(od as api.TextContent);
     });
   });
@@ -5201,7 +5401,9 @@
   unittest.group('obj-schema-TextElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextElement();
-      var od = api.TextElement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextElement.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextElement(od as api.TextElement);
     });
   });
@@ -5209,7 +5411,9 @@
   unittest.group('obj-schema-TextRun', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextRun();
-      var od = api.TextRun.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextRun.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextRun(od as api.TextRun);
     });
   });
@@ -5217,7 +5421,9 @@
   unittest.group('obj-schema-TextStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextStyle();
-      var od = api.TextStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextStyle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextStyle(od as api.TextStyle);
     });
   });
@@ -5225,7 +5431,9 @@
   unittest.group('obj-schema-ThemeColorPair', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThemeColorPair();
-      var od = api.ThemeColorPair.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThemeColorPair.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThemeColorPair(od as api.ThemeColorPair);
     });
   });
@@ -5233,7 +5441,9 @@
   unittest.group('obj-schema-Thumbnail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThumbnail();
-      var od = api.Thumbnail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Thumbnail.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkThumbnail(od as api.Thumbnail);
     });
   });
@@ -5241,7 +5451,9 @@
   unittest.group('obj-schema-UngroupObjectsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUngroupObjectsRequest();
-      var od = api.UngroupObjectsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UngroupObjectsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUngroupObjectsRequest(od as api.UngroupObjectsRequest);
     });
   });
@@ -5249,7 +5461,9 @@
   unittest.group('obj-schema-UnmergeTableCellsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnmergeTableCellsRequest();
-      var od = api.UnmergeTableCellsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnmergeTableCellsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnmergeTableCellsRequest(od as api.UnmergeTableCellsRequest);
     });
   });
@@ -5257,7 +5471,9 @@
   unittest.group('obj-schema-UpdateImagePropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateImagePropertiesRequest();
-      var od = api.UpdateImagePropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateImagePropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateImagePropertiesRequest(od as api.UpdateImagePropertiesRequest);
     });
   });
@@ -5265,7 +5481,9 @@
   unittest.group('obj-schema-UpdateLineCategoryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateLineCategoryRequest();
-      var od = api.UpdateLineCategoryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateLineCategoryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateLineCategoryRequest(od as api.UpdateLineCategoryRequest);
     });
   });
@@ -5273,7 +5491,9 @@
   unittest.group('obj-schema-UpdateLinePropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateLinePropertiesRequest();
-      var od = api.UpdateLinePropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateLinePropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateLinePropertiesRequest(od as api.UpdateLinePropertiesRequest);
     });
   });
@@ -5281,7 +5501,9 @@
   unittest.group('obj-schema-UpdatePageElementAltTextRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdatePageElementAltTextRequest();
-      var od = api.UpdatePageElementAltTextRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdatePageElementAltTextRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdatePageElementAltTextRequest(
           od as api.UpdatePageElementAltTextRequest);
     });
@@ -5290,7 +5512,9 @@
   unittest.group('obj-schema-UpdatePageElementTransformRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdatePageElementTransformRequest();
-      var od = api.UpdatePageElementTransformRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdatePageElementTransformRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdatePageElementTransformRequest(
           od as api.UpdatePageElementTransformRequest);
     });
@@ -5299,7 +5523,9 @@
   unittest.group('obj-schema-UpdatePageElementsZOrderRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdatePageElementsZOrderRequest();
-      var od = api.UpdatePageElementsZOrderRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdatePageElementsZOrderRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdatePageElementsZOrderRequest(
           od as api.UpdatePageElementsZOrderRequest);
     });
@@ -5308,7 +5534,9 @@
   unittest.group('obj-schema-UpdatePagePropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdatePagePropertiesRequest();
-      var od = api.UpdatePagePropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdatePagePropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdatePagePropertiesRequest(od as api.UpdatePagePropertiesRequest);
     });
   });
@@ -5316,7 +5544,9 @@
   unittest.group('obj-schema-UpdateParagraphStyleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateParagraphStyleRequest();
-      var od = api.UpdateParagraphStyleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateParagraphStyleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateParagraphStyleRequest(od as api.UpdateParagraphStyleRequest);
     });
   });
@@ -5324,7 +5554,9 @@
   unittest.group('obj-schema-UpdateShapePropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateShapePropertiesRequest();
-      var od = api.UpdateShapePropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateShapePropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateShapePropertiesRequest(od as api.UpdateShapePropertiesRequest);
     });
   });
@@ -5332,7 +5564,9 @@
   unittest.group('obj-schema-UpdateSlidesPositionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateSlidesPositionRequest();
-      var od = api.UpdateSlidesPositionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateSlidesPositionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateSlidesPositionRequest(od as api.UpdateSlidesPositionRequest);
     });
   });
@@ -5340,7 +5574,9 @@
   unittest.group('obj-schema-UpdateTableBorderPropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTableBorderPropertiesRequest();
-      var od = api.UpdateTableBorderPropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTableBorderPropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTableBorderPropertiesRequest(
           od as api.UpdateTableBorderPropertiesRequest);
     });
@@ -5349,7 +5585,9 @@
   unittest.group('obj-schema-UpdateTableCellPropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTableCellPropertiesRequest();
-      var od = api.UpdateTableCellPropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTableCellPropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTableCellPropertiesRequest(
           od as api.UpdateTableCellPropertiesRequest);
     });
@@ -5358,7 +5596,9 @@
   unittest.group('obj-schema-UpdateTableColumnPropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTableColumnPropertiesRequest();
-      var od = api.UpdateTableColumnPropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTableColumnPropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTableColumnPropertiesRequest(
           od as api.UpdateTableColumnPropertiesRequest);
     });
@@ -5367,7 +5607,9 @@
   unittest.group('obj-schema-UpdateTableRowPropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTableRowPropertiesRequest();
-      var od = api.UpdateTableRowPropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTableRowPropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTableRowPropertiesRequest(
           od as api.UpdateTableRowPropertiesRequest);
     });
@@ -5376,7 +5618,9 @@
   unittest.group('obj-schema-UpdateTextStyleRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTextStyleRequest();
-      var od = api.UpdateTextStyleRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTextStyleRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTextStyleRequest(od as api.UpdateTextStyleRequest);
     });
   });
@@ -5384,7 +5628,9 @@
   unittest.group('obj-schema-UpdateVideoPropertiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateVideoPropertiesRequest();
-      var od = api.UpdateVideoPropertiesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateVideoPropertiesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateVideoPropertiesRequest(od as api.UpdateVideoPropertiesRequest);
     });
   });
@@ -5392,7 +5638,8 @@
   unittest.group('obj-schema-Video', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideo();
-      var od = api.Video.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Video.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVideo(od as api.Video);
     });
   });
@@ -5400,7 +5647,9 @@
   unittest.group('obj-schema-VideoProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoProperties();
-      var od = api.VideoProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoProperties(od as api.VideoProperties);
     });
   });
@@ -5408,7 +5657,9 @@
   unittest.group('obj-schema-WeightedFontFamily', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWeightedFontFamily();
-      var od = api.WeightedFontFamily.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WeightedFontFamily.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWeightedFontFamily(od as api.WeightedFontFamily);
     });
   });
@@ -5416,7 +5667,9 @@
   unittest.group('obj-schema-WordArt', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWordArt();
-      var od = api.WordArt.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WordArt.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWordArt(od as api.WordArt);
     });
   });
@@ -5424,7 +5677,9 @@
   unittest.group('obj-schema-WriteControl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWriteControl();
-      var od = api.WriteControl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WriteControl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWriteControl(od as api.WriteControl);
     });
   });
diff --git a/generated/googleapis/test/smartdevicemanagement/v1_test.dart b/generated/googleapis/test/smartdevicemanagement/v1_test.dart
index 5879a4b..93f3fe7 100644
--- a/generated/googleapis/test/smartdevicemanagement/v1_test.dart
+++ b/generated/googleapis/test/smartdevicemanagement/v1_test.dart
@@ -561,7 +561,9 @@
   unittest.group('obj-schema-GoogleHomeEnterpriseSdmV1Device', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleHomeEnterpriseSdmV1Device();
-      var od = api.GoogleHomeEnterpriseSdmV1Device.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleHomeEnterpriseSdmV1Device.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleHomeEnterpriseSdmV1Device(
           od as api.GoogleHomeEnterpriseSdmV1Device);
     });
@@ -571,9 +573,10 @@
       'obj-schema-GoogleHomeEnterpriseSdmV1ExecuteDeviceCommandRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleHomeEnterpriseSdmV1ExecuteDeviceCommandRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleHomeEnterpriseSdmV1ExecuteDeviceCommandRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleHomeEnterpriseSdmV1ExecuteDeviceCommandRequest(
           od as api.GoogleHomeEnterpriseSdmV1ExecuteDeviceCommandRequest);
     });
@@ -583,9 +586,10 @@
       'obj-schema-GoogleHomeEnterpriseSdmV1ExecuteDeviceCommandResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleHomeEnterpriseSdmV1ExecuteDeviceCommandResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleHomeEnterpriseSdmV1ExecuteDeviceCommandResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleHomeEnterpriseSdmV1ExecuteDeviceCommandResponse(
           od as api.GoogleHomeEnterpriseSdmV1ExecuteDeviceCommandResponse);
     });
@@ -594,8 +598,9 @@
   unittest.group('obj-schema-GoogleHomeEnterpriseSdmV1ListDevicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleHomeEnterpriseSdmV1ListDevicesResponse();
-      var od =
-          api.GoogleHomeEnterpriseSdmV1ListDevicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleHomeEnterpriseSdmV1ListDevicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleHomeEnterpriseSdmV1ListDevicesResponse(
           od as api.GoogleHomeEnterpriseSdmV1ListDevicesResponse);
     });
@@ -604,8 +609,9 @@
   unittest.group('obj-schema-GoogleHomeEnterpriseSdmV1ListRoomsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleHomeEnterpriseSdmV1ListRoomsResponse();
-      var od =
-          api.GoogleHomeEnterpriseSdmV1ListRoomsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleHomeEnterpriseSdmV1ListRoomsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleHomeEnterpriseSdmV1ListRoomsResponse(
           od as api.GoogleHomeEnterpriseSdmV1ListRoomsResponse);
     });
@@ -615,8 +621,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleHomeEnterpriseSdmV1ListStructuresResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleHomeEnterpriseSdmV1ListStructuresResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleHomeEnterpriseSdmV1ListStructuresResponse(
           od as api.GoogleHomeEnterpriseSdmV1ListStructuresResponse);
     });
@@ -625,7 +632,9 @@
   unittest.group('obj-schema-GoogleHomeEnterpriseSdmV1ParentRelation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleHomeEnterpriseSdmV1ParentRelation();
-      var od = api.GoogleHomeEnterpriseSdmV1ParentRelation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleHomeEnterpriseSdmV1ParentRelation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleHomeEnterpriseSdmV1ParentRelation(
           od as api.GoogleHomeEnterpriseSdmV1ParentRelation);
     });
@@ -634,7 +643,9 @@
   unittest.group('obj-schema-GoogleHomeEnterpriseSdmV1Room', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleHomeEnterpriseSdmV1Room();
-      var od = api.GoogleHomeEnterpriseSdmV1Room.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleHomeEnterpriseSdmV1Room.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleHomeEnterpriseSdmV1Room(
           od as api.GoogleHomeEnterpriseSdmV1Room);
     });
@@ -643,7 +654,9 @@
   unittest.group('obj-schema-GoogleHomeEnterpriseSdmV1Structure', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleHomeEnterpriseSdmV1Structure();
-      var od = api.GoogleHomeEnterpriseSdmV1Structure.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleHomeEnterpriseSdmV1Structure.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleHomeEnterpriseSdmV1Structure(
           od as api.GoogleHomeEnterpriseSdmV1Structure);
     });
diff --git a/generated/googleapis/test/sourcerepo/v1_test.dart b/generated/googleapis/test/sourcerepo/v1_test.dart
index f83e4fd..13f5fda 100644
--- a/generated/googleapis/test/sourcerepo/v1_test.dart
+++ b/generated/googleapis/test/sourcerepo/v1_test.dart
@@ -867,7 +867,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -875,7 +877,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -883,7 +887,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -891,7 +897,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -899,7 +906,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -907,7 +915,9 @@
   unittest.group('obj-schema-ListReposResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListReposResponse();
-      var od = api.ListReposResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListReposResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListReposResponse(od as api.ListReposResponse);
     });
   });
@@ -915,7 +925,9 @@
   unittest.group('obj-schema-MirrorConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMirrorConfig();
-      var od = api.MirrorConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MirrorConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMirrorConfig(od as api.MirrorConfig);
     });
   });
@@ -923,7 +935,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -931,7 +945,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -939,7 +955,9 @@
   unittest.group('obj-schema-ProjectConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectConfig();
-      var od = api.ProjectConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectConfig(od as api.ProjectConfig);
     });
   });
@@ -947,7 +965,9 @@
   unittest.group('obj-schema-PubsubConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubsubConfig();
-      var od = api.PubsubConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PubsubConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPubsubConfig(od as api.PubsubConfig);
     });
   });
@@ -955,7 +975,8 @@
   unittest.group('obj-schema-Repo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepo();
-      var od = api.Repo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Repo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRepo(od as api.Repo);
     });
   });
@@ -963,7 +984,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -971,7 +994,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -979,7 +1004,9 @@
   unittest.group('obj-schema-SyncRepoMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSyncRepoMetadata();
-      var od = api.SyncRepoMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SyncRepoMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSyncRepoMetadata(od as api.SyncRepoMetadata);
     });
   });
@@ -987,7 +1014,9 @@
   unittest.group('obj-schema-SyncRepoRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSyncRepoRequest();
-      var od = api.SyncRepoRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SyncRepoRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSyncRepoRequest(od as api.SyncRepoRequest);
     });
   });
@@ -995,7 +1024,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1003,7 +1034,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -1011,7 +1044,9 @@
   unittest.group('obj-schema-UpdateProjectConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateProjectConfigRequest();
-      var od = api.UpdateProjectConfigRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateProjectConfigRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateProjectConfigRequest(od as api.UpdateProjectConfigRequest);
     });
   });
@@ -1019,7 +1054,9 @@
   unittest.group('obj-schema-UpdateRepoRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateRepoRequest();
-      var od = api.UpdateRepoRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateRepoRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateRepoRequest(od as api.UpdateRepoRequest);
     });
   });
diff --git a/generated/googleapis/test/spanner/v1_test.dart b/generated/googleapis/test/spanner/v1_test.dart
index 04617b6..8afb26b 100644
--- a/generated/googleapis/test/spanner/v1_test.dart
+++ b/generated/googleapis/test/spanner/v1_test.dart
@@ -3807,7 +3807,9 @@
   unittest.group('obj-schema-Backup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackup();
-      var od = api.Backup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Backup.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackup(od as api.Backup);
     });
   });
@@ -3815,7 +3817,9 @@
   unittest.group('obj-schema-BackupInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackupInfo();
-      var od = api.BackupInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BackupInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackupInfo(od as api.BackupInfo);
     });
   });
@@ -3823,7 +3827,9 @@
   unittest.group('obj-schema-BatchCreateSessionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateSessionsRequest();
-      var od = api.BatchCreateSessionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateSessionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateSessionsRequest(od as api.BatchCreateSessionsRequest);
     });
   });
@@ -3831,7 +3837,9 @@
   unittest.group('obj-schema-BatchCreateSessionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateSessionsResponse();
-      var od = api.BatchCreateSessionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateSessionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateSessionsResponse(od as api.BatchCreateSessionsResponse);
     });
   });
@@ -3839,7 +3847,9 @@
   unittest.group('obj-schema-BeginTransactionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBeginTransactionRequest();
-      var od = api.BeginTransactionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BeginTransactionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBeginTransactionRequest(od as api.BeginTransactionRequest);
     });
   });
@@ -3847,7 +3857,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -3855,7 +3867,9 @@
   unittest.group('obj-schema-ChildLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChildLink();
-      var od = api.ChildLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ChildLink.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChildLink(od as api.ChildLink);
     });
   });
@@ -3863,7 +3877,9 @@
   unittest.group('obj-schema-CommitRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitRequest();
-      var od = api.CommitRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitRequest(od as api.CommitRequest);
     });
   });
@@ -3871,7 +3887,9 @@
   unittest.group('obj-schema-CommitResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitResponse();
-      var od = api.CommitResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitResponse(od as api.CommitResponse);
     });
   });
@@ -3879,7 +3897,9 @@
   unittest.group('obj-schema-CommitStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitStats();
-      var od = api.CommitStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitStats(od as api.CommitStats);
     });
   });
@@ -3887,7 +3907,9 @@
   unittest.group('obj-schema-CreateBackupMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateBackupMetadata();
-      var od = api.CreateBackupMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateBackupMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateBackupMetadata(od as api.CreateBackupMetadata);
     });
   });
@@ -3895,7 +3917,9 @@
   unittest.group('obj-schema-CreateDatabaseMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateDatabaseMetadata();
-      var od = api.CreateDatabaseMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateDatabaseMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateDatabaseMetadata(od as api.CreateDatabaseMetadata);
     });
   });
@@ -3903,7 +3927,9 @@
   unittest.group('obj-schema-CreateDatabaseRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateDatabaseRequest();
-      var od = api.CreateDatabaseRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateDatabaseRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateDatabaseRequest(od as api.CreateDatabaseRequest);
     });
   });
@@ -3911,7 +3937,9 @@
   unittest.group('obj-schema-CreateInstanceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateInstanceMetadata();
-      var od = api.CreateInstanceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateInstanceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateInstanceMetadata(od as api.CreateInstanceMetadata);
     });
   });
@@ -3919,7 +3947,9 @@
   unittest.group('obj-schema-CreateInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateInstanceRequest();
-      var od = api.CreateInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateInstanceRequest(od as api.CreateInstanceRequest);
     });
   });
@@ -3927,7 +3957,9 @@
   unittest.group('obj-schema-CreateSessionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateSessionRequest();
-      var od = api.CreateSessionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateSessionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateSessionRequest(od as api.CreateSessionRequest);
     });
   });
@@ -3935,7 +3967,9 @@
   unittest.group('obj-schema-Database', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabase();
-      var od = api.Database.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Database.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDatabase(od as api.Database);
     });
   });
@@ -3943,7 +3977,9 @@
   unittest.group('obj-schema-Delete', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDelete();
-      var od = api.Delete.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Delete.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDelete(od as api.Delete);
     });
   });
@@ -3951,7 +3987,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -3959,7 +3996,9 @@
   unittest.group('obj-schema-EncryptionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncryptionConfig();
-      var od = api.EncryptionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EncryptionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEncryptionConfig(od as api.EncryptionConfig);
     });
   });
@@ -3967,7 +4006,9 @@
   unittest.group('obj-schema-EncryptionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncryptionInfo();
-      var od = api.EncryptionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EncryptionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEncryptionInfo(od as api.EncryptionInfo);
     });
   });
@@ -3975,7 +4016,9 @@
   unittest.group('obj-schema-ExecuteBatchDmlRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecuteBatchDmlRequest();
-      var od = api.ExecuteBatchDmlRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecuteBatchDmlRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecuteBatchDmlRequest(od as api.ExecuteBatchDmlRequest);
     });
   });
@@ -3983,7 +4026,9 @@
   unittest.group('obj-schema-ExecuteBatchDmlResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecuteBatchDmlResponse();
-      var od = api.ExecuteBatchDmlResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecuteBatchDmlResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecuteBatchDmlResponse(od as api.ExecuteBatchDmlResponse);
     });
   });
@@ -3991,7 +4036,9 @@
   unittest.group('obj-schema-ExecuteSqlRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecuteSqlRequest();
-      var od = api.ExecuteSqlRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecuteSqlRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecuteSqlRequest(od as api.ExecuteSqlRequest);
     });
   });
@@ -3999,7 +4046,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -4007,7 +4055,8 @@
   unittest.group('obj-schema-Field', () {
     unittest.test('to-json--from-json', () async {
       var o = buildField();
-      var od = api.Field.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Field.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkField(od as api.Field);
     });
   });
@@ -4015,7 +4064,9 @@
   unittest.group('obj-schema-GetDatabaseDdlResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetDatabaseDdlResponse();
-      var od = api.GetDatabaseDdlResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetDatabaseDdlResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetDatabaseDdlResponse(od as api.GetDatabaseDdlResponse);
     });
   });
@@ -4023,7 +4074,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -4031,7 +4084,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -4039,7 +4094,9 @@
   unittest.group('obj-schema-Instance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstance();
-      var od = api.Instance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Instance.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInstance(od as api.Instance);
     });
   });
@@ -4047,7 +4104,9 @@
   unittest.group('obj-schema-InstanceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstanceConfig();
-      var od = api.InstanceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstanceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstanceConfig(od as api.InstanceConfig);
     });
   });
@@ -4055,7 +4114,9 @@
   unittest.group('obj-schema-KeyRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyRange();
-      var od = api.KeyRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.KeyRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKeyRange(od as api.KeyRange);
     });
   });
@@ -4063,7 +4124,9 @@
   unittest.group('obj-schema-KeySet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeySet();
-      var od = api.KeySet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.KeySet.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKeySet(od as api.KeySet);
     });
   });
@@ -4071,7 +4134,9 @@
   unittest.group('obj-schema-ListBackupOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBackupOperationsResponse();
-      var od = api.ListBackupOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBackupOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBackupOperationsResponse(od as api.ListBackupOperationsResponse);
     });
   });
@@ -4079,7 +4144,9 @@
   unittest.group('obj-schema-ListBackupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBackupsResponse();
-      var od = api.ListBackupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBackupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBackupsResponse(od as api.ListBackupsResponse);
     });
   });
@@ -4087,7 +4154,9 @@
   unittest.group('obj-schema-ListDatabaseOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDatabaseOperationsResponse();
-      var od = api.ListDatabaseOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDatabaseOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDatabaseOperationsResponse(
           od as api.ListDatabaseOperationsResponse);
     });
@@ -4096,7 +4165,9 @@
   unittest.group('obj-schema-ListDatabasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDatabasesResponse();
-      var od = api.ListDatabasesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDatabasesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDatabasesResponse(od as api.ListDatabasesResponse);
     });
   });
@@ -4104,7 +4175,9 @@
   unittest.group('obj-schema-ListInstanceConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInstanceConfigsResponse();
-      var od = api.ListInstanceConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInstanceConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInstanceConfigsResponse(od as api.ListInstanceConfigsResponse);
     });
   });
@@ -4112,7 +4185,9 @@
   unittest.group('obj-schema-ListInstancesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListInstancesResponse();
-      var od = api.ListInstancesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListInstancesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
@@ -4120,7 +4195,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -4128,7 +4205,9 @@
   unittest.group('obj-schema-ListSessionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSessionsResponse();
-      var od = api.ListSessionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSessionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSessionsResponse(od as api.ListSessionsResponse);
     });
   });
@@ -4136,7 +4215,9 @@
   unittest.group('obj-schema-Mutation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMutation();
-      var od = api.Mutation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Mutation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMutation(od as api.Mutation);
     });
   });
@@ -4144,7 +4225,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -4152,7 +4235,9 @@
   unittest.group('obj-schema-OperationProgress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationProgress();
-      var od = api.OperationProgress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationProgress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationProgress(od as api.OperationProgress);
     });
   });
@@ -4160,7 +4245,9 @@
   unittest.group('obj-schema-OptimizeRestoredDatabaseMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOptimizeRestoredDatabaseMetadata();
-      var od = api.OptimizeRestoredDatabaseMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OptimizeRestoredDatabaseMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOptimizeRestoredDatabaseMetadata(
           od as api.OptimizeRestoredDatabaseMetadata);
     });
@@ -4169,7 +4256,9 @@
   unittest.group('obj-schema-PartialResultSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartialResultSet();
-      var od = api.PartialResultSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartialResultSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartialResultSet(od as api.PartialResultSet);
     });
   });
@@ -4177,7 +4266,9 @@
   unittest.group('obj-schema-Partition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartition();
-      var od = api.Partition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Partition.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPartition(od as api.Partition);
     });
   });
@@ -4185,7 +4276,9 @@
   unittest.group('obj-schema-PartitionOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionOptions();
-      var od = api.PartitionOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionOptions(od as api.PartitionOptions);
     });
   });
@@ -4193,7 +4286,9 @@
   unittest.group('obj-schema-PartitionQueryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionQueryRequest();
-      var od = api.PartitionQueryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionQueryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionQueryRequest(od as api.PartitionQueryRequest);
     });
   });
@@ -4201,7 +4296,9 @@
   unittest.group('obj-schema-PartitionReadRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionReadRequest();
-      var od = api.PartitionReadRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionReadRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionReadRequest(od as api.PartitionReadRequest);
     });
   });
@@ -4209,7 +4306,9 @@
   unittest.group('obj-schema-PartitionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionResponse();
-      var od = api.PartitionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionResponse(od as api.PartitionResponse);
     });
   });
@@ -4217,7 +4316,9 @@
   unittest.group('obj-schema-PartitionedDml', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartitionedDml();
-      var od = api.PartitionedDml.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartitionedDml.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartitionedDml(od as api.PartitionedDml);
     });
   });
@@ -4225,7 +4326,9 @@
   unittest.group('obj-schema-PlanNode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlanNode();
-      var od = api.PlanNode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PlanNode.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPlanNode(od as api.PlanNode);
     });
   });
@@ -4233,7 +4336,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -4241,7 +4346,9 @@
   unittest.group('obj-schema-QueryOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryOptions();
-      var od = api.QueryOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryOptions(od as api.QueryOptions);
     });
   });
@@ -4249,7 +4356,9 @@
   unittest.group('obj-schema-QueryPlan', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryPlan();
-      var od = api.QueryPlan.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.QueryPlan.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQueryPlan(od as api.QueryPlan);
     });
   });
@@ -4257,7 +4366,9 @@
   unittest.group('obj-schema-ReadOnly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadOnly();
-      var od = api.ReadOnly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReadOnly.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReadOnly(od as api.ReadOnly);
     });
   });
@@ -4265,7 +4376,9 @@
   unittest.group('obj-schema-ReadRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadRequest();
-      var od = api.ReadRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReadRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReadRequest(od as api.ReadRequest);
     });
   });
@@ -4273,7 +4386,9 @@
   unittest.group('obj-schema-ReadWrite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadWrite();
-      var od = api.ReadWrite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReadWrite.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReadWrite(od as api.ReadWrite);
     });
   });
@@ -4281,7 +4396,9 @@
   unittest.group('obj-schema-ReplicaInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplicaInfo();
-      var od = api.ReplicaInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplicaInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplicaInfo(od as api.ReplicaInfo);
     });
   });
@@ -4289,7 +4406,9 @@
   unittest.group('obj-schema-RestoreDatabaseEncryptionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreDatabaseEncryptionConfig();
-      var od = api.RestoreDatabaseEncryptionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreDatabaseEncryptionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreDatabaseEncryptionConfig(
           od as api.RestoreDatabaseEncryptionConfig);
     });
@@ -4298,7 +4417,9 @@
   unittest.group('obj-schema-RestoreDatabaseMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreDatabaseMetadata();
-      var od = api.RestoreDatabaseMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreDatabaseMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreDatabaseMetadata(od as api.RestoreDatabaseMetadata);
     });
   });
@@ -4306,7 +4427,9 @@
   unittest.group('obj-schema-RestoreDatabaseRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreDatabaseRequest();
-      var od = api.RestoreDatabaseRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreDatabaseRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreDatabaseRequest(od as api.RestoreDatabaseRequest);
     });
   });
@@ -4314,7 +4437,9 @@
   unittest.group('obj-schema-RestoreInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreInfo();
-      var od = api.RestoreInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreInfo(od as api.RestoreInfo);
     });
   });
@@ -4322,7 +4447,9 @@
   unittest.group('obj-schema-ResultSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultSet();
-      var od = api.ResultSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ResultSet.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResultSet(od as api.ResultSet);
     });
   });
@@ -4330,7 +4457,9 @@
   unittest.group('obj-schema-ResultSetMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultSetMetadata();
-      var od = api.ResultSetMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultSetMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultSetMetadata(od as api.ResultSetMetadata);
     });
   });
@@ -4338,7 +4467,9 @@
   unittest.group('obj-schema-ResultSetStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultSetStats();
-      var od = api.ResultSetStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultSetStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultSetStats(od as api.ResultSetStats);
     });
   });
@@ -4346,7 +4477,9 @@
   unittest.group('obj-schema-RollbackRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRollbackRequest();
-      var od = api.RollbackRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RollbackRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRollbackRequest(od as api.RollbackRequest);
     });
   });
@@ -4354,7 +4487,9 @@
   unittest.group('obj-schema-Session', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSession();
-      var od = api.Session.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Session.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSession(od as api.Session);
     });
   });
@@ -4362,7 +4497,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -4370,7 +4507,9 @@
   unittest.group('obj-schema-ShortRepresentation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShortRepresentation();
-      var od = api.ShortRepresentation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShortRepresentation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShortRepresentation(od as api.ShortRepresentation);
     });
   });
@@ -4378,7 +4517,9 @@
   unittest.group('obj-schema-Statement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatement();
-      var od = api.Statement.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Statement.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatement(od as api.Statement);
     });
   });
@@ -4386,7 +4527,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4394,7 +4537,9 @@
   unittest.group('obj-schema-StructType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStructType();
-      var od = api.StructType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.StructType.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStructType(od as api.StructType);
     });
   });
@@ -4402,7 +4547,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -4410,7 +4557,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -4418,7 +4567,9 @@
   unittest.group('obj-schema-Transaction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransaction();
-      var od = api.Transaction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Transaction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransaction(od as api.Transaction);
     });
   });
@@ -4426,7 +4577,9 @@
   unittest.group('obj-schema-TransactionOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransactionOptions();
-      var od = api.TransactionOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransactionOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransactionOptions(od as api.TransactionOptions);
     });
   });
@@ -4434,7 +4587,9 @@
   unittest.group('obj-schema-TransactionSelector', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransactionSelector();
-      var od = api.TransactionSelector.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransactionSelector.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransactionSelector(od as api.TransactionSelector);
     });
   });
@@ -4442,7 +4597,8 @@
   unittest.group('obj-schema-Type', () {
     unittest.test('to-json--from-json', () async {
       var o = buildType();
-      var od = api.Type.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Type.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkType(od as api.Type);
     });
   });
@@ -4450,7 +4606,9 @@
   unittest.group('obj-schema-UpdateDatabaseDdlMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDatabaseDdlMetadata();
-      var od = api.UpdateDatabaseDdlMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDatabaseDdlMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDatabaseDdlMetadata(od as api.UpdateDatabaseDdlMetadata);
     });
   });
@@ -4458,7 +4616,9 @@
   unittest.group('obj-schema-UpdateDatabaseDdlRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateDatabaseDdlRequest();
-      var od = api.UpdateDatabaseDdlRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateDatabaseDdlRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateDatabaseDdlRequest(od as api.UpdateDatabaseDdlRequest);
     });
   });
@@ -4466,7 +4626,9 @@
   unittest.group('obj-schema-UpdateInstanceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateInstanceMetadata();
-      var od = api.UpdateInstanceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateInstanceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateInstanceMetadata(od as api.UpdateInstanceMetadata);
     });
   });
@@ -4474,7 +4636,9 @@
   unittest.group('obj-schema-UpdateInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateInstanceRequest();
-      var od = api.UpdateInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateInstanceRequest(od as api.UpdateInstanceRequest);
     });
   });
@@ -4482,7 +4646,8 @@
   unittest.group('obj-schema-Write', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWrite();
-      var od = api.Write.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Write.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWrite(od as api.Write);
     });
   });
diff --git a/generated/googleapis/test/speech/v1_test.dart b/generated/googleapis/test/speech/v1_test.dart
index 0962222..ab5f61a 100644
--- a/generated/googleapis/test/speech/v1_test.dart
+++ b/generated/googleapis/test/speech/v1_test.dart
@@ -773,7 +773,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -781,7 +783,9 @@
   unittest.group('obj-schema-LongRunningRecognizeMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLongRunningRecognizeMetadata();
-      var od = api.LongRunningRecognizeMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LongRunningRecognizeMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLongRunningRecognizeMetadata(od as api.LongRunningRecognizeMetadata);
     });
   });
@@ -789,7 +793,9 @@
   unittest.group('obj-schema-LongRunningRecognizeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLongRunningRecognizeRequest();
-      var od = api.LongRunningRecognizeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LongRunningRecognizeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLongRunningRecognizeRequest(od as api.LongRunningRecognizeRequest);
     });
   });
@@ -797,7 +803,9 @@
   unittest.group('obj-schema-LongRunningRecognizeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLongRunningRecognizeResponse();
-      var od = api.LongRunningRecognizeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LongRunningRecognizeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLongRunningRecognizeResponse(od as api.LongRunningRecognizeResponse);
     });
   });
@@ -805,7 +813,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -813,7 +823,9 @@
   unittest.group('obj-schema-RecognitionAudio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecognitionAudio();
-      var od = api.RecognitionAudio.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RecognitionAudio.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRecognitionAudio(od as api.RecognitionAudio);
     });
   });
@@ -821,7 +833,9 @@
   unittest.group('obj-schema-RecognitionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecognitionConfig();
-      var od = api.RecognitionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RecognitionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRecognitionConfig(od as api.RecognitionConfig);
     });
   });
@@ -829,7 +843,9 @@
   unittest.group('obj-schema-RecognitionMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecognitionMetadata();
-      var od = api.RecognitionMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RecognitionMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRecognitionMetadata(od as api.RecognitionMetadata);
     });
   });
@@ -837,7 +853,9 @@
   unittest.group('obj-schema-RecognizeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecognizeRequest();
-      var od = api.RecognizeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RecognizeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRecognizeRequest(od as api.RecognizeRequest);
     });
   });
@@ -845,7 +863,9 @@
   unittest.group('obj-schema-RecognizeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRecognizeResponse();
-      var od = api.RecognizeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RecognizeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRecognizeResponse(od as api.RecognizeResponse);
     });
   });
@@ -853,7 +873,9 @@
   unittest.group('obj-schema-SpeakerDiarizationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpeakerDiarizationConfig();
-      var od = api.SpeakerDiarizationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpeakerDiarizationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpeakerDiarizationConfig(od as api.SpeakerDiarizationConfig);
     });
   });
@@ -861,7 +883,9 @@
   unittest.group('obj-schema-SpeechContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpeechContext();
-      var od = api.SpeechContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpeechContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpeechContext(od as api.SpeechContext);
     });
   });
@@ -869,7 +893,9 @@
   unittest.group('obj-schema-SpeechRecognitionAlternative', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpeechRecognitionAlternative();
-      var od = api.SpeechRecognitionAlternative.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpeechRecognitionAlternative.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpeechRecognitionAlternative(od as api.SpeechRecognitionAlternative);
     });
   });
@@ -877,7 +903,9 @@
   unittest.group('obj-schema-SpeechRecognitionResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpeechRecognitionResult();
-      var od = api.SpeechRecognitionResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpeechRecognitionResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpeechRecognitionResult(od as api.SpeechRecognitionResult);
     });
   });
@@ -885,7 +913,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -893,7 +923,9 @@
   unittest.group('obj-schema-WordInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWordInfo();
-      var od = api.WordInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WordInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWordInfo(od as api.WordInfo);
     });
   });
diff --git a/generated/googleapis/test/storage/v1_test.dart b/generated/googleapis/test/storage/v1_test.dart
index aa87139..1f4b52d 100644
--- a/generated/googleapis/test/storage/v1_test.dart
+++ b/generated/googleapis/test/storage/v1_test.dart
@@ -2071,7 +2071,9 @@
   unittest.group('obj-schema-BucketBilling', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketBilling();
-      var od = api.BucketBilling.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketBilling.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketBilling(od as api.BucketBilling);
     });
   });
@@ -2079,7 +2081,9 @@
   unittest.group('obj-schema-BucketCors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketCors();
-      var od = api.BucketCors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BucketCors.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBucketCors(od as api.BucketCors);
     });
   });
@@ -2087,7 +2091,9 @@
   unittest.group('obj-schema-BucketEncryption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketEncryption();
-      var od = api.BucketEncryption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketEncryption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketEncryption(od as api.BucketEncryption);
     });
   });
@@ -2095,7 +2101,9 @@
   unittest.group('obj-schema-BucketIamConfigurationBucketPolicyOnly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketIamConfigurationBucketPolicyOnly();
-      var od = api.BucketIamConfigurationBucketPolicyOnly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketIamConfigurationBucketPolicyOnly.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketIamConfigurationBucketPolicyOnly(
           od as api.BucketIamConfigurationBucketPolicyOnly);
     });
@@ -2105,8 +2113,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketIamConfigurationUniformBucketLevelAccess();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.BucketIamConfigurationUniformBucketLevelAccess.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketIamConfigurationUniformBucketLevelAccess(
           od as api.BucketIamConfigurationUniformBucketLevelAccess);
     });
@@ -2115,7 +2124,9 @@
   unittest.group('obj-schema-BucketIamConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketIamConfiguration();
-      var od = api.BucketIamConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketIamConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketIamConfiguration(od as api.BucketIamConfiguration);
     });
   });
@@ -2123,7 +2134,9 @@
   unittest.group('obj-schema-BucketLifecycleRuleAction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketLifecycleRuleAction();
-      var od = api.BucketLifecycleRuleAction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketLifecycleRuleAction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketLifecycleRuleAction(od as api.BucketLifecycleRuleAction);
     });
   });
@@ -2131,7 +2144,9 @@
   unittest.group('obj-schema-BucketLifecycleRuleCondition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketLifecycleRuleCondition();
-      var od = api.BucketLifecycleRuleCondition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketLifecycleRuleCondition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketLifecycleRuleCondition(od as api.BucketLifecycleRuleCondition);
     });
   });
@@ -2139,7 +2154,9 @@
   unittest.group('obj-schema-BucketLifecycleRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketLifecycleRule();
-      var od = api.BucketLifecycleRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketLifecycleRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketLifecycleRule(od as api.BucketLifecycleRule);
     });
   });
@@ -2147,7 +2164,9 @@
   unittest.group('obj-schema-BucketLifecycle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketLifecycle();
-      var od = api.BucketLifecycle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketLifecycle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketLifecycle(od as api.BucketLifecycle);
     });
   });
@@ -2155,7 +2174,9 @@
   unittest.group('obj-schema-BucketLogging', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketLogging();
-      var od = api.BucketLogging.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketLogging.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketLogging(od as api.BucketLogging);
     });
   });
@@ -2163,7 +2184,9 @@
   unittest.group('obj-schema-BucketOwner', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketOwner();
-      var od = api.BucketOwner.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketOwner.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketOwner(od as api.BucketOwner);
     });
   });
@@ -2171,7 +2194,9 @@
   unittest.group('obj-schema-BucketRetentionPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketRetentionPolicy();
-      var od = api.BucketRetentionPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketRetentionPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketRetentionPolicy(od as api.BucketRetentionPolicy);
     });
   });
@@ -2179,7 +2204,9 @@
   unittest.group('obj-schema-BucketVersioning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketVersioning();
-      var od = api.BucketVersioning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketVersioning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketVersioning(od as api.BucketVersioning);
     });
   });
@@ -2187,7 +2214,9 @@
   unittest.group('obj-schema-BucketWebsite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketWebsite();
-      var od = api.BucketWebsite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketWebsite.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketWebsite(od as api.BucketWebsite);
     });
   });
@@ -2195,7 +2224,9 @@
   unittest.group('obj-schema-Bucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucket();
-      var od = api.Bucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Bucket.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBucket(od as api.Bucket);
     });
   });
@@ -2203,7 +2234,9 @@
   unittest.group('obj-schema-BucketAccessControlProjectTeam', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketAccessControlProjectTeam();
-      var od = api.BucketAccessControlProjectTeam.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketAccessControlProjectTeam.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketAccessControlProjectTeam(
           od as api.BucketAccessControlProjectTeam);
     });
@@ -2212,7 +2245,9 @@
   unittest.group('obj-schema-BucketAccessControl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketAccessControl();
-      var od = api.BucketAccessControl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketAccessControl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketAccessControl(od as api.BucketAccessControl);
     });
   });
@@ -2220,7 +2255,9 @@
   unittest.group('obj-schema-BucketAccessControls', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBucketAccessControls();
-      var od = api.BucketAccessControls.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BucketAccessControls.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBucketAccessControls(od as api.BucketAccessControls);
     });
   });
@@ -2228,7 +2265,9 @@
   unittest.group('obj-schema-Buckets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuckets();
-      var od = api.Buckets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Buckets.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuckets(od as api.Buckets);
     });
   });
@@ -2236,7 +2275,9 @@
   unittest.group('obj-schema-Channel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannel();
-      var od = api.Channel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Channel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChannel(od as api.Channel);
     });
   });
@@ -2245,8 +2286,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildComposeRequestSourceObjectsObjectPreconditions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ComposeRequestSourceObjectsObjectPreconditions.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkComposeRequestSourceObjectsObjectPreconditions(
           od as api.ComposeRequestSourceObjectsObjectPreconditions);
     });
@@ -2255,7 +2297,9 @@
   unittest.group('obj-schema-ComposeRequestSourceObjects', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComposeRequestSourceObjects();
-      var od = api.ComposeRequestSourceObjects.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComposeRequestSourceObjects.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComposeRequestSourceObjects(od as api.ComposeRequestSourceObjects);
     });
   });
@@ -2263,7 +2307,9 @@
   unittest.group('obj-schema-ComposeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComposeRequest();
-      var od = api.ComposeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComposeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComposeRequest(od as api.ComposeRequest);
     });
   });
@@ -2271,7 +2317,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -2279,7 +2326,9 @@
   unittest.group('obj-schema-HmacKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHmacKey();
-      var od = api.HmacKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HmacKey.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHmacKey(od as api.HmacKey);
     });
   });
@@ -2287,7 +2336,9 @@
   unittest.group('obj-schema-HmacKeyMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHmacKeyMetadata();
-      var od = api.HmacKeyMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HmacKeyMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHmacKeyMetadata(od as api.HmacKeyMetadata);
     });
   });
@@ -2295,7 +2346,9 @@
   unittest.group('obj-schema-HmacKeysMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHmacKeysMetadata();
-      var od = api.HmacKeysMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HmacKeysMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHmacKeysMetadata(od as api.HmacKeysMetadata);
     });
   });
@@ -2303,7 +2356,9 @@
   unittest.group('obj-schema-Notification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotification();
-      var od = api.Notification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Notification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotification(od as api.Notification);
     });
   });
@@ -2311,7 +2366,9 @@
   unittest.group('obj-schema-Notifications', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotifications();
-      var od = api.Notifications.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Notifications.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotifications(od as api.Notifications);
     });
   });
@@ -2319,7 +2376,9 @@
   unittest.group('obj-schema-ObjectCustomerEncryption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectCustomerEncryption();
-      var od = api.ObjectCustomerEncryption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectCustomerEncryption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectCustomerEncryption(od as api.ObjectCustomerEncryption);
     });
   });
@@ -2327,7 +2386,9 @@
   unittest.group('obj-schema-ObjectOwner', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectOwner();
-      var od = api.ObjectOwner.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectOwner.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectOwner(od as api.ObjectOwner);
     });
   });
@@ -2335,7 +2396,9 @@
   unittest.group('obj-schema-Object', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObject();
-      var od = api.Object.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Object.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkObject(od as api.Object);
     });
   });
@@ -2343,7 +2406,9 @@
   unittest.group('obj-schema-ObjectAccessControlProjectTeam', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectAccessControlProjectTeam();
-      var od = api.ObjectAccessControlProjectTeam.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectAccessControlProjectTeam.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectAccessControlProjectTeam(
           od as api.ObjectAccessControlProjectTeam);
     });
@@ -2352,7 +2417,9 @@
   unittest.group('obj-schema-ObjectAccessControl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectAccessControl();
-      var od = api.ObjectAccessControl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectAccessControl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectAccessControl(od as api.ObjectAccessControl);
     });
   });
@@ -2360,7 +2427,9 @@
   unittest.group('obj-schema-ObjectAccessControls', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectAccessControls();
-      var od = api.ObjectAccessControls.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectAccessControls.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectAccessControls(od as api.ObjectAccessControls);
     });
   });
@@ -2368,7 +2437,9 @@
   unittest.group('obj-schema-Objects', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjects();
-      var od = api.Objects.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Objects.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkObjects(od as api.Objects);
     });
   });
@@ -2376,7 +2447,9 @@
   unittest.group('obj-schema-PolicyBindings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicyBindings();
-      var od = api.PolicyBindings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PolicyBindings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPolicyBindings(od as api.PolicyBindings);
     });
   });
@@ -2384,7 +2457,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2392,7 +2467,9 @@
   unittest.group('obj-schema-RewriteResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRewriteResponse();
-      var od = api.RewriteResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RewriteResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRewriteResponse(od as api.RewriteResponse);
     });
   });
@@ -2400,7 +2477,9 @@
   unittest.group('obj-schema-ServiceAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccount();
-      var od = api.ServiceAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccount(od as api.ServiceAccount);
     });
   });
@@ -2408,7 +2487,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis/test/storagetransfer/v1_test.dart b/generated/googleapis/test/storagetransfer/v1_test.dart
index 4039d1f..ced3783 100644
--- a/generated/googleapis/test/storagetransfer/v1_test.dart
+++ b/generated/googleapis/test/storagetransfer/v1_test.dart
@@ -1206,7 +1206,9 @@
   unittest.group('obj-schema-AwsAccessKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAwsAccessKey();
-      var od = api.AwsAccessKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AwsAccessKey.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAwsAccessKey(od as api.AwsAccessKey);
     });
   });
@@ -1214,7 +1216,9 @@
   unittest.group('obj-schema-AwsS3Data', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAwsS3Data();
-      var od = api.AwsS3Data.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AwsS3Data.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAwsS3Data(od as api.AwsS3Data);
     });
   });
@@ -1222,7 +1226,9 @@
   unittest.group('obj-schema-AzureBlobStorageData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAzureBlobStorageData();
-      var od = api.AzureBlobStorageData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AzureBlobStorageData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAzureBlobStorageData(od as api.AzureBlobStorageData);
     });
   });
@@ -1230,7 +1236,9 @@
   unittest.group('obj-schema-AzureCredentials', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAzureCredentials();
-      var od = api.AzureCredentials.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AzureCredentials.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAzureCredentials(od as api.AzureCredentials);
     });
   });
@@ -1238,7 +1246,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -1246,7 +1256,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -1254,7 +1265,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1262,7 +1274,9 @@
   unittest.group('obj-schema-ErrorLogEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorLogEntry();
-      var od = api.ErrorLogEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ErrorLogEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkErrorLogEntry(od as api.ErrorLogEntry);
     });
   });
@@ -1270,7 +1284,9 @@
   unittest.group('obj-schema-ErrorSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorSummary();
-      var od = api.ErrorSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ErrorSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkErrorSummary(od as api.ErrorSummary);
     });
   });
@@ -1278,7 +1294,9 @@
   unittest.group('obj-schema-GcsData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcsData();
-      var od = api.GcsData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GcsData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGcsData(od as api.GcsData);
     });
   });
@@ -1286,7 +1304,9 @@
   unittest.group('obj-schema-GoogleServiceAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleServiceAccount();
-      var od = api.GoogleServiceAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleServiceAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleServiceAccount(od as api.GoogleServiceAccount);
     });
   });
@@ -1294,7 +1314,9 @@
   unittest.group('obj-schema-HttpData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpData();
-      var od = api.HttpData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.HttpData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHttpData(od as api.HttpData);
     });
   });
@@ -1302,7 +1324,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1310,7 +1334,9 @@
   unittest.group('obj-schema-ListTransferJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTransferJobsResponse();
-      var od = api.ListTransferJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTransferJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTransferJobsResponse(od as api.ListTransferJobsResponse);
     });
   });
@@ -1318,7 +1344,9 @@
   unittest.group('obj-schema-NotificationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotificationConfig();
-      var od = api.NotificationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NotificationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotificationConfig(od as api.NotificationConfig);
     });
   });
@@ -1326,7 +1354,9 @@
   unittest.group('obj-schema-ObjectConditions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectConditions();
-      var od = api.ObjectConditions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectConditions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectConditions(od as api.ObjectConditions);
     });
   });
@@ -1334,7 +1364,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1342,7 +1374,9 @@
   unittest.group('obj-schema-PauseTransferOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPauseTransferOperationRequest();
-      var od = api.PauseTransferOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PauseTransferOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPauseTransferOperationRequest(
           od as api.PauseTransferOperationRequest);
     });
@@ -1351,7 +1385,9 @@
   unittest.group('obj-schema-ResumeTransferOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResumeTransferOperationRequest();
-      var od = api.ResumeTransferOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResumeTransferOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResumeTransferOperationRequest(
           od as api.ResumeTransferOperationRequest);
     });
@@ -1360,7 +1396,9 @@
   unittest.group('obj-schema-RunTransferJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunTransferJobRequest();
-      var od = api.RunTransferJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunTransferJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunTransferJobRequest(od as api.RunTransferJobRequest);
     });
   });
@@ -1368,7 +1406,9 @@
   unittest.group('obj-schema-Schedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchedule();
-      var od = api.Schedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schedule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchedule(od as api.Schedule);
     });
   });
@@ -1376,7 +1416,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1384,7 +1426,9 @@
   unittest.group('obj-schema-TimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeOfDay();
-      var od = api.TimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeOfDay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeOfDay(od as api.TimeOfDay);
     });
   });
@@ -1392,7 +1436,9 @@
   unittest.group('obj-schema-TransferCounters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransferCounters();
-      var od = api.TransferCounters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransferCounters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransferCounters(od as api.TransferCounters);
     });
   });
@@ -1400,7 +1446,9 @@
   unittest.group('obj-schema-TransferJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransferJob();
-      var od = api.TransferJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransferJob.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransferJob(od as api.TransferJob);
     });
   });
@@ -1408,7 +1456,9 @@
   unittest.group('obj-schema-TransferOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransferOperation();
-      var od = api.TransferOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransferOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransferOperation(od as api.TransferOperation);
     });
   });
@@ -1416,7 +1466,9 @@
   unittest.group('obj-schema-TransferOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransferOptions();
-      var od = api.TransferOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransferOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransferOptions(od as api.TransferOptions);
     });
   });
@@ -1424,7 +1476,9 @@
   unittest.group('obj-schema-TransferSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransferSpec();
-      var od = api.TransferSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransferSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransferSpec(od as api.TransferSpec);
     });
   });
@@ -1432,7 +1486,9 @@
   unittest.group('obj-schema-UpdateTransferJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateTransferJobRequest();
-      var od = api.UpdateTransferJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateTransferJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateTransferJobRequest(od as api.UpdateTransferJobRequest);
     });
   });
diff --git a/generated/googleapis/test/streetviewpublish/v1_test.dart b/generated/googleapis/test/streetviewpublish/v1_test.dart
index 46b6312..2d11828 100644
--- a/generated/googleapis/test/streetviewpublish/v1_test.dart
+++ b/generated/googleapis/test/streetviewpublish/v1_test.dart
@@ -809,7 +809,9 @@
   unittest.group('obj-schema-BatchDeletePhotosRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchDeletePhotosRequest();
-      var od = api.BatchDeletePhotosRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchDeletePhotosRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchDeletePhotosRequest(od as api.BatchDeletePhotosRequest);
     });
   });
@@ -817,7 +819,9 @@
   unittest.group('obj-schema-BatchDeletePhotosResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchDeletePhotosResponse();
-      var od = api.BatchDeletePhotosResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchDeletePhotosResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchDeletePhotosResponse(od as api.BatchDeletePhotosResponse);
     });
   });
@@ -825,7 +829,9 @@
   unittest.group('obj-schema-BatchGetPhotosResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchGetPhotosResponse();
-      var od = api.BatchGetPhotosResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchGetPhotosResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchGetPhotosResponse(od as api.BatchGetPhotosResponse);
     });
   });
@@ -833,7 +839,9 @@
   unittest.group('obj-schema-BatchUpdatePhotosRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdatePhotosRequest();
-      var od = api.BatchUpdatePhotosRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdatePhotosRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdatePhotosRequest(od as api.BatchUpdatePhotosRequest);
     });
   });
@@ -841,7 +849,9 @@
   unittest.group('obj-schema-BatchUpdatePhotosResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdatePhotosResponse();
-      var od = api.BatchUpdatePhotosResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdatePhotosResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdatePhotosResponse(od as api.BatchUpdatePhotosResponse);
     });
   });
@@ -849,7 +859,9 @@
   unittest.group('obj-schema-Connection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConnection();
-      var od = api.Connection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Connection.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkConnection(od as api.Connection);
     });
   });
@@ -857,7 +869,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -865,7 +878,9 @@
   unittest.group('obj-schema-LatLng', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLatLng();
-      var od = api.LatLng.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LatLng.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLatLng(od as api.LatLng);
     });
   });
@@ -873,7 +888,8 @@
   unittest.group('obj-schema-Level', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLevel();
-      var od = api.Level.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Level.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLevel(od as api.Level);
     });
   });
@@ -881,7 +897,9 @@
   unittest.group('obj-schema-ListPhotosResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPhotosResponse();
-      var od = api.ListPhotosResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPhotosResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPhotosResponse(od as api.ListPhotosResponse);
     });
   });
@@ -889,7 +907,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -897,7 +917,8 @@
   unittest.group('obj-schema-Photo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPhoto();
-      var od = api.Photo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Photo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPhoto(od as api.Photo);
     });
   });
@@ -905,7 +926,9 @@
   unittest.group('obj-schema-PhotoId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPhotoId();
-      var od = api.PhotoId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PhotoId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPhotoId(od as api.PhotoId);
     });
   });
@@ -913,7 +936,9 @@
   unittest.group('obj-schema-PhotoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPhotoResponse();
-      var od = api.PhotoResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PhotoResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPhotoResponse(od as api.PhotoResponse);
     });
   });
@@ -921,7 +946,8 @@
   unittest.group('obj-schema-Place', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlace();
-      var od = api.Place.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Place.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPlace(od as api.Place);
     });
   });
@@ -929,7 +955,8 @@
   unittest.group('obj-schema-Pose', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPose();
-      var od = api.Pose.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Pose.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPose(od as api.Pose);
     });
   });
@@ -937,7 +964,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -945,7 +974,9 @@
   unittest.group('obj-schema-UpdatePhotoRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdatePhotoRequest();
-      var od = api.UpdatePhotoRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdatePhotoRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdatePhotoRequest(od as api.UpdatePhotoRequest);
     });
   });
@@ -953,7 +984,9 @@
   unittest.group('obj-schema-UploadRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUploadRef();
-      var od = api.UploadRef.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UploadRef.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUploadRef(od as api.UploadRef);
     });
   });
diff --git a/generated/googleapis/test/sts/v1_test.dart b/generated/googleapis/test/sts/v1_test.dart
index b13c272..d6684eb 100644
--- a/generated/googleapis/test/sts/v1_test.dart
+++ b/generated/googleapis/test/sts/v1_test.dart
@@ -124,7 +124,9 @@
   unittest.group('obj-schema-GoogleIdentityStsV1ExchangeTokenRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityStsV1ExchangeTokenRequest();
-      var od = api.GoogleIdentityStsV1ExchangeTokenRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIdentityStsV1ExchangeTokenRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityStsV1ExchangeTokenRequest(
           od as api.GoogleIdentityStsV1ExchangeTokenRequest);
     });
@@ -133,8 +135,9 @@
   unittest.group('obj-schema-GoogleIdentityStsV1ExchangeTokenResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIdentityStsV1ExchangeTokenResponse();
-      var od =
-          api.GoogleIdentityStsV1ExchangeTokenResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIdentityStsV1ExchangeTokenResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIdentityStsV1ExchangeTokenResponse(
           od as api.GoogleIdentityStsV1ExchangeTokenResponse);
     });
diff --git a/generated/googleapis/test/tagmanager/v1_test.dart b/generated/googleapis/test/tagmanager/v1_test.dart
index 1d18b62..6755c4b 100644
--- a/generated/googleapis/test/tagmanager/v1_test.dart
+++ b/generated/googleapis/test/tagmanager/v1_test.dart
@@ -1942,7 +1942,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -1950,7 +1952,9 @@
   unittest.group('obj-schema-AccountAccess', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountAccess();
-      var od = api.AccountAccess.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountAccess.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountAccess(od as api.AccountAccess);
     });
   });
@@ -1958,7 +1962,9 @@
   unittest.group('obj-schema-Condition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCondition();
-      var od = api.Condition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Condition.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCondition(od as api.Condition);
     });
   });
@@ -1966,7 +1972,9 @@
   unittest.group('obj-schema-Container', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainer();
-      var od = api.Container.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Container.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkContainer(od as api.Container);
     });
   });
@@ -1974,7 +1982,9 @@
   unittest.group('obj-schema-ContainerAccess', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerAccess();
-      var od = api.ContainerAccess.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerAccess.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerAccess(od as api.ContainerAccess);
     });
   });
@@ -1982,7 +1992,9 @@
   unittest.group('obj-schema-ContainerVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerVersion();
-      var od = api.ContainerVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerVersion(od as api.ContainerVersion);
     });
   });
@@ -1990,7 +2002,9 @@
   unittest.group('obj-schema-ContainerVersionHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerVersionHeader();
-      var od = api.ContainerVersionHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerVersionHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerVersionHeader(od as api.ContainerVersionHeader);
     });
   });
@@ -1998,8 +2012,9 @@
   unittest.group('obj-schema-CreateContainerVersionRequestVersionOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateContainerVersionRequestVersionOptions();
-      var od =
-          api.CreateContainerVersionRequestVersionOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateContainerVersionRequestVersionOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateContainerVersionRequestVersionOptions(
           od as api.CreateContainerVersionRequestVersionOptions);
     });
@@ -2008,7 +2023,9 @@
   unittest.group('obj-schema-CreateContainerVersionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateContainerVersionResponse();
-      var od = api.CreateContainerVersionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateContainerVersionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateContainerVersionResponse(
           od as api.CreateContainerVersionResponse);
     });
@@ -2017,7 +2034,9 @@
   unittest.group('obj-schema-Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironment();
-      var od = api.Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironment(od as api.Environment);
     });
   });
@@ -2025,7 +2044,9 @@
   unittest.group('obj-schema-Folder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolder();
-      var od = api.Folder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Folder.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFolder(od as api.Folder);
     });
   });
@@ -2033,7 +2054,9 @@
   unittest.group('obj-schema-FolderEntities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolderEntities();
-      var od = api.FolderEntities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FolderEntities.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFolderEntities(od as api.FolderEntities);
     });
   });
@@ -2041,7 +2064,9 @@
   unittest.group('obj-schema-ListAccountUsersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAccountUsersResponse();
-      var od = api.ListAccountUsersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAccountUsersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAccountUsersResponse(od as api.ListAccountUsersResponse);
     });
   });
@@ -2049,7 +2074,9 @@
   unittest.group('obj-schema-ListAccountsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAccountsResponse();
-      var od = api.ListAccountsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAccountsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAccountsResponse(od as api.ListAccountsResponse);
     });
   });
@@ -2057,7 +2084,9 @@
   unittest.group('obj-schema-ListContainerVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListContainerVersionsResponse();
-      var od = api.ListContainerVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListContainerVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListContainerVersionsResponse(
           od as api.ListContainerVersionsResponse);
     });
@@ -2066,7 +2095,9 @@
   unittest.group('obj-schema-ListContainersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListContainersResponse();
-      var od = api.ListContainersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListContainersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListContainersResponse(od as api.ListContainersResponse);
     });
   });
@@ -2074,7 +2105,9 @@
   unittest.group('obj-schema-ListEnvironmentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListEnvironmentsResponse();
-      var od = api.ListEnvironmentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListEnvironmentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListEnvironmentsResponse(od as api.ListEnvironmentsResponse);
     });
   });
@@ -2082,7 +2115,9 @@
   unittest.group('obj-schema-ListFoldersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFoldersResponse();
-      var od = api.ListFoldersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFoldersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFoldersResponse(od as api.ListFoldersResponse);
     });
   });
@@ -2090,7 +2125,9 @@
   unittest.group('obj-schema-ListTagsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTagsResponse();
-      var od = api.ListTagsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTagsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTagsResponse(od as api.ListTagsResponse);
     });
   });
@@ -2098,7 +2135,9 @@
   unittest.group('obj-schema-ListTriggersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTriggersResponse();
-      var od = api.ListTriggersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTriggersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTriggersResponse(od as api.ListTriggersResponse);
     });
   });
@@ -2106,7 +2145,9 @@
   unittest.group('obj-schema-ListVariablesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListVariablesResponse();
-      var od = api.ListVariablesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListVariablesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListVariablesResponse(od as api.ListVariablesResponse);
     });
   });
@@ -2114,7 +2155,8 @@
   unittest.group('obj-schema-Macro', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMacro();
-      var od = api.Macro.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Macro.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMacro(od as api.Macro);
     });
   });
@@ -2122,7 +2164,9 @@
   unittest.group('obj-schema-Parameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParameter();
-      var od = api.Parameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Parameter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkParameter(od as api.Parameter);
     });
   });
@@ -2130,7 +2174,9 @@
   unittest.group('obj-schema-PublishContainerVersionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublishContainerVersionResponse();
-      var od = api.PublishContainerVersionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublishContainerVersionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublishContainerVersionResponse(
           od as api.PublishContainerVersionResponse);
     });
@@ -2139,7 +2185,8 @@
   unittest.group('obj-schema-Rule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRule();
-      var od = api.Rule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Rule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRule(od as api.Rule);
     });
   });
@@ -2147,7 +2194,9 @@
   unittest.group('obj-schema-SetupTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetupTag();
-      var od = api.SetupTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SetupTag.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSetupTag(od as api.SetupTag);
     });
   });
@@ -2155,7 +2204,8 @@
   unittest.group('obj-schema-Tag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTag();
-      var od = api.Tag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Tag.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTag(od as api.Tag);
     });
   });
@@ -2163,7 +2213,9 @@
   unittest.group('obj-schema-TeardownTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeardownTag();
-      var od = api.TeardownTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeardownTag.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeardownTag(od as api.TeardownTag);
     });
   });
@@ -2171,7 +2223,9 @@
   unittest.group('obj-schema-Trigger', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrigger();
-      var od = api.Trigger.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Trigger.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTrigger(od as api.Trigger);
     });
   });
@@ -2179,7 +2233,9 @@
   unittest.group('obj-schema-UserAccess', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserAccess();
-      var od = api.UserAccess.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserAccess.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserAccess(od as api.UserAccess);
     });
   });
@@ -2187,7 +2243,9 @@
   unittest.group('obj-schema-Variable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVariable();
-      var od = api.Variable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Variable.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVariable(od as api.Variable);
     });
   });
diff --git a/generated/googleapis/test/tagmanager/v2_test.dart b/generated/googleapis/test/tagmanager/v2_test.dart
index d2d8bf1..92bca79 100644
--- a/generated/googleapis/test/tagmanager/v2_test.dart
+++ b/generated/googleapis/test/tagmanager/v2_test.dart
@@ -2973,7 +2973,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -2981,7 +2983,9 @@
   unittest.group('obj-schema-AccountAccess', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountAccess();
-      var od = api.AccountAccess.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountAccess.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountAccess(od as api.AccountAccess);
     });
   });
@@ -2989,7 +2993,9 @@
   unittest.group('obj-schema-BuiltInVariable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuiltInVariable();
-      var od = api.BuiltInVariable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuiltInVariable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuiltInVariable(od as api.BuiltInVariable);
     });
   });
@@ -2997,7 +3003,9 @@
   unittest.group('obj-schema-Client', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClient();
-      var od = api.Client.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Client.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkClient(od as api.Client);
     });
   });
@@ -3005,7 +3013,9 @@
   unittest.group('obj-schema-Condition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCondition();
-      var od = api.Condition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Condition.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCondition(od as api.Condition);
     });
   });
@@ -3013,7 +3023,9 @@
   unittest.group('obj-schema-Container', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainer();
-      var od = api.Container.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Container.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkContainer(od as api.Container);
     });
   });
@@ -3021,7 +3033,9 @@
   unittest.group('obj-schema-ContainerAccess', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerAccess();
-      var od = api.ContainerAccess.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerAccess.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerAccess(od as api.ContainerAccess);
     });
   });
@@ -3029,7 +3043,9 @@
   unittest.group('obj-schema-ContainerVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerVersion();
-      var od = api.ContainerVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerVersion(od as api.ContainerVersion);
     });
   });
@@ -3037,7 +3053,9 @@
   unittest.group('obj-schema-ContainerVersionHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerVersionHeader();
-      var od = api.ContainerVersionHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerVersionHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerVersionHeader(od as api.ContainerVersionHeader);
     });
   });
@@ -3045,7 +3063,9 @@
   unittest.group('obj-schema-CreateBuiltInVariableResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateBuiltInVariableResponse();
-      var od = api.CreateBuiltInVariableResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateBuiltInVariableResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateBuiltInVariableResponse(
           od as api.CreateBuiltInVariableResponse);
     });
@@ -3054,8 +3074,9 @@
   unittest.group('obj-schema-CreateContainerVersionRequestVersionOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateContainerVersionRequestVersionOptions();
-      var od =
-          api.CreateContainerVersionRequestVersionOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateContainerVersionRequestVersionOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateContainerVersionRequestVersionOptions(
           od as api.CreateContainerVersionRequestVersionOptions);
     });
@@ -3064,7 +3085,9 @@
   unittest.group('obj-schema-CreateContainerVersionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateContainerVersionResponse();
-      var od = api.CreateContainerVersionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateContainerVersionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateContainerVersionResponse(
           od as api.CreateContainerVersionResponse);
     });
@@ -3073,7 +3096,9 @@
   unittest.group('obj-schema-CustomTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomTemplate();
-      var od = api.CustomTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomTemplate(od as api.CustomTemplate);
     });
   });
@@ -3081,7 +3106,9 @@
   unittest.group('obj-schema-Entity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntity();
-      var od = api.Entity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Entity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEntity(od as api.Entity);
     });
   });
@@ -3089,7 +3116,9 @@
   unittest.group('obj-schema-Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironment();
-      var od = api.Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironment(od as api.Environment);
     });
   });
@@ -3097,7 +3126,9 @@
   unittest.group('obj-schema-Folder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolder();
-      var od = api.Folder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Folder.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFolder(od as api.Folder);
     });
   });
@@ -3105,7 +3136,9 @@
   unittest.group('obj-schema-FolderEntities', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFolderEntities();
-      var od = api.FolderEntities.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FolderEntities.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFolderEntities(od as api.FolderEntities);
     });
   });
@@ -3113,7 +3146,9 @@
   unittest.group('obj-schema-GalleryReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGalleryReference();
-      var od = api.GalleryReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GalleryReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGalleryReference(od as api.GalleryReference);
     });
   });
@@ -3121,7 +3156,9 @@
   unittest.group('obj-schema-GetWorkspaceStatusResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetWorkspaceStatusResponse();
-      var od = api.GetWorkspaceStatusResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetWorkspaceStatusResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetWorkspaceStatusResponse(od as api.GetWorkspaceStatusResponse);
     });
   });
@@ -3129,7 +3166,9 @@
   unittest.group('obj-schema-ListAccountsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAccountsResponse();
-      var od = api.ListAccountsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAccountsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAccountsResponse(od as api.ListAccountsResponse);
     });
   });
@@ -3137,7 +3176,9 @@
   unittest.group('obj-schema-ListContainerVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListContainerVersionsResponse();
-      var od = api.ListContainerVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListContainerVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListContainerVersionsResponse(
           od as api.ListContainerVersionsResponse);
     });
@@ -3146,7 +3187,9 @@
   unittest.group('obj-schema-ListContainersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListContainersResponse();
-      var od = api.ListContainersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListContainersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListContainersResponse(od as api.ListContainersResponse);
     });
   });
@@ -3154,7 +3197,9 @@
   unittest.group('obj-schema-ListEnabledBuiltInVariablesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListEnabledBuiltInVariablesResponse();
-      var od = api.ListEnabledBuiltInVariablesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListEnabledBuiltInVariablesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListEnabledBuiltInVariablesResponse(
           od as api.ListEnabledBuiltInVariablesResponse);
     });
@@ -3163,7 +3208,9 @@
   unittest.group('obj-schema-ListEnvironmentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListEnvironmentsResponse();
-      var od = api.ListEnvironmentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListEnvironmentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListEnvironmentsResponse(od as api.ListEnvironmentsResponse);
     });
   });
@@ -3171,7 +3218,9 @@
   unittest.group('obj-schema-ListFoldersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFoldersResponse();
-      var od = api.ListFoldersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFoldersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFoldersResponse(od as api.ListFoldersResponse);
     });
   });
@@ -3179,7 +3228,9 @@
   unittest.group('obj-schema-ListTagsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTagsResponse();
-      var od = api.ListTagsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTagsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTagsResponse(od as api.ListTagsResponse);
     });
   });
@@ -3187,7 +3238,9 @@
   unittest.group('obj-schema-ListTemplatesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTemplatesResponse();
-      var od = api.ListTemplatesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTemplatesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTemplatesResponse(od as api.ListTemplatesResponse);
     });
   });
@@ -3195,7 +3248,9 @@
   unittest.group('obj-schema-ListTriggersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTriggersResponse();
-      var od = api.ListTriggersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTriggersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTriggersResponse(od as api.ListTriggersResponse);
     });
   });
@@ -3203,7 +3258,9 @@
   unittest.group('obj-schema-ListUserPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListUserPermissionsResponse();
-      var od = api.ListUserPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListUserPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListUserPermissionsResponse(od as api.ListUserPermissionsResponse);
     });
   });
@@ -3211,7 +3268,9 @@
   unittest.group('obj-schema-ListVariablesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListVariablesResponse();
-      var od = api.ListVariablesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListVariablesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListVariablesResponse(od as api.ListVariablesResponse);
     });
   });
@@ -3219,7 +3278,9 @@
   unittest.group('obj-schema-ListWorkspacesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListWorkspacesResponse();
-      var od = api.ListWorkspacesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListWorkspacesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListWorkspacesResponse(od as api.ListWorkspacesResponse);
     });
   });
@@ -3227,7 +3288,9 @@
   unittest.group('obj-schema-ListZonesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListZonesResponse();
-      var od = api.ListZonesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListZonesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListZonesResponse(od as api.ListZonesResponse);
     });
   });
@@ -3235,7 +3298,9 @@
   unittest.group('obj-schema-MergeConflict', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMergeConflict();
-      var od = api.MergeConflict.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MergeConflict.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMergeConflict(od as api.MergeConflict);
     });
   });
@@ -3243,7 +3308,9 @@
   unittest.group('obj-schema-Parameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParameter();
-      var od = api.Parameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Parameter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkParameter(od as api.Parameter);
     });
   });
@@ -3251,7 +3318,9 @@
   unittest.group('obj-schema-PublishContainerVersionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublishContainerVersionResponse();
-      var od = api.PublishContainerVersionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublishContainerVersionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublishContainerVersionResponse(
           od as api.PublishContainerVersionResponse);
     });
@@ -3260,7 +3329,9 @@
   unittest.group('obj-schema-QuickPreviewResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuickPreviewResponse();
-      var od = api.QuickPreviewResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QuickPreviewResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQuickPreviewResponse(od as api.QuickPreviewResponse);
     });
   });
@@ -3268,7 +3339,9 @@
   unittest.group('obj-schema-RevertBuiltInVariableResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevertBuiltInVariableResponse();
-      var od = api.RevertBuiltInVariableResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevertBuiltInVariableResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevertBuiltInVariableResponse(
           od as api.RevertBuiltInVariableResponse);
     });
@@ -3277,7 +3350,9 @@
   unittest.group('obj-schema-RevertFolderResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevertFolderResponse();
-      var od = api.RevertFolderResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevertFolderResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevertFolderResponse(od as api.RevertFolderResponse);
     });
   });
@@ -3285,7 +3360,9 @@
   unittest.group('obj-schema-RevertTagResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevertTagResponse();
-      var od = api.RevertTagResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevertTagResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevertTagResponse(od as api.RevertTagResponse);
     });
   });
@@ -3293,7 +3370,9 @@
   unittest.group('obj-schema-RevertTemplateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevertTemplateResponse();
-      var od = api.RevertTemplateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevertTemplateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevertTemplateResponse(od as api.RevertTemplateResponse);
     });
   });
@@ -3301,7 +3380,9 @@
   unittest.group('obj-schema-RevertTriggerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevertTriggerResponse();
-      var od = api.RevertTriggerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevertTriggerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevertTriggerResponse(od as api.RevertTriggerResponse);
     });
   });
@@ -3309,7 +3390,9 @@
   unittest.group('obj-schema-RevertVariableResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevertVariableResponse();
-      var od = api.RevertVariableResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevertVariableResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevertVariableResponse(od as api.RevertVariableResponse);
     });
   });
@@ -3317,7 +3400,9 @@
   unittest.group('obj-schema-RevertZoneResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevertZoneResponse();
-      var od = api.RevertZoneResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevertZoneResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevertZoneResponse(od as api.RevertZoneResponse);
     });
   });
@@ -3325,7 +3410,9 @@
   unittest.group('obj-schema-SetupTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetupTag();
-      var od = api.SetupTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SetupTag.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSetupTag(od as api.SetupTag);
     });
   });
@@ -3333,7 +3420,9 @@
   unittest.group('obj-schema-SyncStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSyncStatus();
-      var od = api.SyncStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SyncStatus.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSyncStatus(od as api.SyncStatus);
     });
   });
@@ -3341,7 +3430,9 @@
   unittest.group('obj-schema-SyncWorkspaceResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSyncWorkspaceResponse();
-      var od = api.SyncWorkspaceResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SyncWorkspaceResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSyncWorkspaceResponse(od as api.SyncWorkspaceResponse);
     });
   });
@@ -3349,7 +3440,8 @@
   unittest.group('obj-schema-Tag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTag();
-      var od = api.Tag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Tag.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTag(od as api.Tag);
     });
   });
@@ -3357,7 +3449,9 @@
   unittest.group('obj-schema-TeardownTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeardownTag();
-      var od = api.TeardownTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeardownTag.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeardownTag(od as api.TeardownTag);
     });
   });
@@ -3365,7 +3459,9 @@
   unittest.group('obj-schema-Trigger', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrigger();
-      var od = api.Trigger.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Trigger.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTrigger(od as api.Trigger);
     });
   });
@@ -3373,7 +3469,9 @@
   unittest.group('obj-schema-UserPermission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserPermission();
-      var od = api.UserPermission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserPermission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserPermission(od as api.UserPermission);
     });
   });
@@ -3381,7 +3479,9 @@
   unittest.group('obj-schema-Variable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVariable();
-      var od = api.Variable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Variable.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVariable(od as api.Variable);
     });
   });
@@ -3389,7 +3489,9 @@
   unittest.group('obj-schema-VariableFormatValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVariableFormatValue();
-      var od = api.VariableFormatValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VariableFormatValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVariableFormatValue(od as api.VariableFormatValue);
     });
   });
@@ -3397,7 +3499,9 @@
   unittest.group('obj-schema-Workspace', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkspace();
-      var od = api.Workspace.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Workspace.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWorkspace(od as api.Workspace);
     });
   });
@@ -3405,7 +3509,8 @@
   unittest.group('obj-schema-Zone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZone();
-      var od = api.Zone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Zone.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkZone(od as api.Zone);
     });
   });
@@ -3413,7 +3518,9 @@
   unittest.group('obj-schema-ZoneBoundary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZoneBoundary();
-      var od = api.ZoneBoundary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ZoneBoundary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkZoneBoundary(od as api.ZoneBoundary);
     });
   });
@@ -3421,7 +3528,9 @@
   unittest.group('obj-schema-ZoneChildContainer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZoneChildContainer();
-      var od = api.ZoneChildContainer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ZoneChildContainer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkZoneChildContainer(od as api.ZoneChildContainer);
     });
   });
@@ -3429,7 +3538,9 @@
   unittest.group('obj-schema-ZoneTypeRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildZoneTypeRestriction();
-      var od = api.ZoneTypeRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ZoneTypeRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkZoneTypeRestriction(od as api.ZoneTypeRestriction);
     });
   });
diff --git a/generated/googleapis/test/tasks/v1_test.dart b/generated/googleapis/test/tasks/v1_test.dart
index 52a6646..1e322e2 100644
--- a/generated/googleapis/test/tasks/v1_test.dart
+++ b/generated/googleapis/test/tasks/v1_test.dart
@@ -300,7 +300,9 @@
   unittest.group('obj-schema-TaskLinks', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTaskLinks();
-      var od = api.TaskLinks.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TaskLinks.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTaskLinks(od as api.TaskLinks);
     });
   });
@@ -308,7 +310,8 @@
   unittest.group('obj-schema-Task', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTask();
-      var od = api.Task.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Task.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTask(od as api.Task);
     });
   });
@@ -316,7 +319,9 @@
   unittest.group('obj-schema-TaskList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTaskList();
-      var od = api.TaskList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TaskList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTaskList(od as api.TaskList);
     });
   });
@@ -324,7 +329,9 @@
   unittest.group('obj-schema-TaskLists', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTaskLists();
-      var od = api.TaskLists.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TaskLists.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTaskLists(od as api.TaskLists);
     });
   });
@@ -332,7 +339,8 @@
   unittest.group('obj-schema-Tasks', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTasks();
-      var od = api.Tasks.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Tasks.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTasks(od as api.Tasks);
     });
   });
diff --git a/generated/googleapis/test/testing/v1_test.dart b/generated/googleapis/test/testing/v1_test.dart
index 83b5471..727d7f1 100644
--- a/generated/googleapis/test/testing/v1_test.dart
+++ b/generated/googleapis/test/testing/v1_test.dart
@@ -2910,7 +2910,9 @@
   unittest.group('obj-schema-Account', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccount();
-      var od = api.Account.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Account.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccount(od as api.Account);
     });
   });
@@ -2918,7 +2920,9 @@
   unittest.group('obj-schema-AndroidDevice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidDevice();
-      var od = api.AndroidDevice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidDevice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidDevice(od as api.AndroidDevice);
     });
   });
@@ -2926,7 +2930,9 @@
   unittest.group('obj-schema-AndroidDeviceCatalog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidDeviceCatalog();
-      var od = api.AndroidDeviceCatalog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidDeviceCatalog.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidDeviceCatalog(od as api.AndroidDeviceCatalog);
     });
   });
@@ -2934,7 +2940,9 @@
   unittest.group('obj-schema-AndroidDeviceList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidDeviceList();
-      var od = api.AndroidDeviceList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidDeviceList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidDeviceList(od as api.AndroidDeviceList);
     });
   });
@@ -2942,7 +2950,9 @@
   unittest.group('obj-schema-AndroidInstrumentationTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidInstrumentationTest();
-      var od = api.AndroidInstrumentationTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidInstrumentationTest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidInstrumentationTest(od as api.AndroidInstrumentationTest);
     });
   });
@@ -2950,7 +2960,9 @@
   unittest.group('obj-schema-AndroidMatrix', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidMatrix();
-      var od = api.AndroidMatrix.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidMatrix.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidMatrix(od as api.AndroidMatrix);
     });
   });
@@ -2958,7 +2970,9 @@
   unittest.group('obj-schema-AndroidModel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidModel();
-      var od = api.AndroidModel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidModel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidModel(od as api.AndroidModel);
     });
   });
@@ -2966,7 +2980,9 @@
   unittest.group('obj-schema-AndroidRoboTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidRoboTest();
-      var od = api.AndroidRoboTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidRoboTest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidRoboTest(od as api.AndroidRoboTest);
     });
   });
@@ -2974,7 +2990,9 @@
   unittest.group('obj-schema-AndroidRuntimeConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidRuntimeConfiguration();
-      var od = api.AndroidRuntimeConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidRuntimeConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidRuntimeConfiguration(od as api.AndroidRuntimeConfiguration);
     });
   });
@@ -2982,7 +3000,9 @@
   unittest.group('obj-schema-AndroidTestLoop', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidTestLoop();
-      var od = api.AndroidTestLoop.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidTestLoop.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidTestLoop(od as api.AndroidTestLoop);
     });
   });
@@ -2990,7 +3010,9 @@
   unittest.group('obj-schema-AndroidVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidVersion();
-      var od = api.AndroidVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidVersion(od as api.AndroidVersion);
     });
   });
@@ -2998,7 +3020,8 @@
   unittest.group('obj-schema-Apk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApk();
-      var od = api.Apk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Apk.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApk(od as api.Apk);
     });
   });
@@ -3006,7 +3029,9 @@
   unittest.group('obj-schema-ApkDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApkDetail();
-      var od = api.ApkDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ApkDetail.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApkDetail(od as api.ApkDetail);
     });
   });
@@ -3014,7 +3039,9 @@
   unittest.group('obj-schema-ApkManifest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApkManifest();
-      var od = api.ApkManifest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApkManifest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApkManifest(od as api.ApkManifest);
     });
   });
@@ -3022,7 +3049,9 @@
   unittest.group('obj-schema-AppBundle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppBundle();
-      var od = api.AppBundle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AppBundle.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAppBundle(od as api.AppBundle);
     });
   });
@@ -3030,7 +3059,9 @@
   unittest.group('obj-schema-CancelTestMatrixResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelTestMatrixResponse();
-      var od = api.CancelTestMatrixResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelTestMatrixResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelTestMatrixResponse(od as api.CancelTestMatrixResponse);
     });
   });
@@ -3038,7 +3069,9 @@
   unittest.group('obj-schema-ClientInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientInfo();
-      var od = api.ClientInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ClientInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkClientInfo(od as api.ClientInfo);
     });
   });
@@ -3046,7 +3079,9 @@
   unittest.group('obj-schema-ClientInfoDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientInfoDetail();
-      var od = api.ClientInfoDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClientInfoDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClientInfoDetail(od as api.ClientInfoDetail);
     });
   });
@@ -3054,7 +3089,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -3062,7 +3098,9 @@
   unittest.group('obj-schema-DeviceFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceFile();
-      var od = api.DeviceFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DeviceFile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeviceFile(od as api.DeviceFile);
     });
   });
@@ -3070,7 +3108,9 @@
   unittest.group('obj-schema-DeviceIpBlock', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceIpBlock();
-      var od = api.DeviceIpBlock.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceIpBlock.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceIpBlock(od as api.DeviceIpBlock);
     });
   });
@@ -3078,7 +3118,9 @@
   unittest.group('obj-schema-DeviceIpBlockCatalog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceIpBlockCatalog();
-      var od = api.DeviceIpBlockCatalog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceIpBlockCatalog.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceIpBlockCatalog(od as api.DeviceIpBlockCatalog);
     });
   });
@@ -3086,7 +3128,9 @@
   unittest.group('obj-schema-Distribution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDistribution();
-      var od = api.Distribution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Distribution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDistribution(od as api.Distribution);
     });
   });
@@ -3094,7 +3138,9 @@
   unittest.group('obj-schema-Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironment();
-      var od = api.Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironment(od as api.Environment);
     });
   });
@@ -3102,7 +3148,9 @@
   unittest.group('obj-schema-EnvironmentMatrix', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironmentMatrix();
-      var od = api.EnvironmentMatrix.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnvironmentMatrix.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironmentMatrix(od as api.EnvironmentMatrix);
     });
   });
@@ -3110,7 +3158,9 @@
   unittest.group('obj-schema-EnvironmentVariable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironmentVariable();
-      var od = api.EnvironmentVariable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnvironmentVariable.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironmentVariable(od as api.EnvironmentVariable);
     });
   });
@@ -3118,7 +3168,9 @@
   unittest.group('obj-schema-FileReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileReference();
-      var od = api.FileReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileReference(od as api.FileReference);
     });
   });
@@ -3126,7 +3178,9 @@
   unittest.group('obj-schema-GetApkDetailsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetApkDetailsResponse();
-      var od = api.GetApkDetailsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetApkDetailsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetApkDetailsResponse(od as api.GetApkDetailsResponse);
     });
   });
@@ -3134,7 +3188,9 @@
   unittest.group('obj-schema-GoogleAuto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAuto();
-      var od = api.GoogleAuto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GoogleAuto.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAuto(od as api.GoogleAuto);
     });
   });
@@ -3142,7 +3198,9 @@
   unittest.group('obj-schema-GoogleCloudStorage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudStorage();
-      var od = api.GoogleCloudStorage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudStorage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudStorage(od as api.GoogleCloudStorage);
     });
   });
@@ -3150,7 +3208,9 @@
   unittest.group('obj-schema-IntentFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntentFilter();
-      var od = api.IntentFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntentFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntentFilter(od as api.IntentFilter);
     });
   });
@@ -3158,7 +3218,9 @@
   unittest.group('obj-schema-IosDevice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosDevice();
-      var od = api.IosDevice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IosDevice.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIosDevice(od as api.IosDevice);
     });
   });
@@ -3166,7 +3228,9 @@
   unittest.group('obj-schema-IosDeviceCatalog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosDeviceCatalog();
-      var od = api.IosDeviceCatalog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IosDeviceCatalog.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIosDeviceCatalog(od as api.IosDeviceCatalog);
     });
   });
@@ -3174,7 +3238,9 @@
   unittest.group('obj-schema-IosDeviceFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosDeviceFile();
-      var od = api.IosDeviceFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IosDeviceFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIosDeviceFile(od as api.IosDeviceFile);
     });
   });
@@ -3182,7 +3248,9 @@
   unittest.group('obj-schema-IosDeviceList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosDeviceList();
-      var od = api.IosDeviceList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IosDeviceList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIosDeviceList(od as api.IosDeviceList);
     });
   });
@@ -3190,7 +3258,9 @@
   unittest.group('obj-schema-IosModel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosModel();
-      var od = api.IosModel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IosModel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIosModel(od as api.IosModel);
     });
   });
@@ -3198,7 +3268,9 @@
   unittest.group('obj-schema-IosRuntimeConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosRuntimeConfiguration();
-      var od = api.IosRuntimeConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IosRuntimeConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIosRuntimeConfiguration(od as api.IosRuntimeConfiguration);
     });
   });
@@ -3206,7 +3278,9 @@
   unittest.group('obj-schema-IosTestLoop', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosTestLoop();
-      var od = api.IosTestLoop.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IosTestLoop.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIosTestLoop(od as api.IosTestLoop);
     });
   });
@@ -3214,7 +3288,9 @@
   unittest.group('obj-schema-IosTestSetup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosTestSetup();
-      var od = api.IosTestSetup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IosTestSetup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIosTestSetup(od as api.IosTestSetup);
     });
   });
@@ -3222,7 +3298,9 @@
   unittest.group('obj-schema-IosVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosVersion();
-      var od = api.IosVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IosVersion.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIosVersion(od as api.IosVersion);
     });
   });
@@ -3230,7 +3308,9 @@
   unittest.group('obj-schema-IosXcTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosXcTest();
-      var od = api.IosXcTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IosXcTest.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIosXcTest(od as api.IosXcTest);
     });
   });
@@ -3238,7 +3318,9 @@
   unittest.group('obj-schema-LauncherActivityIntent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLauncherActivityIntent();
-      var od = api.LauncherActivityIntent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LauncherActivityIntent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLauncherActivityIntent(od as api.LauncherActivityIntent);
     });
   });
@@ -3246,7 +3328,9 @@
   unittest.group('obj-schema-Locale', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocale();
-      var od = api.Locale.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Locale.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocale(od as api.Locale);
     });
   });
@@ -3254,7 +3338,9 @@
   unittest.group('obj-schema-ManualSharding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManualSharding();
-      var od = api.ManualSharding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManualSharding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManualSharding(od as api.ManualSharding);
     });
   });
@@ -3262,7 +3348,9 @@
   unittest.group('obj-schema-NetworkConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkConfiguration();
-      var od = api.NetworkConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkConfiguration(od as api.NetworkConfiguration);
     });
   });
@@ -3270,7 +3358,9 @@
   unittest.group('obj-schema-NetworkConfigurationCatalog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkConfigurationCatalog();
-      var od = api.NetworkConfigurationCatalog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkConfigurationCatalog.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkConfigurationCatalog(od as api.NetworkConfigurationCatalog);
     });
   });
@@ -3278,7 +3368,9 @@
   unittest.group('obj-schema-ObbFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObbFile();
-      var od = api.ObbFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ObbFile.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkObbFile(od as api.ObbFile);
     });
   });
@@ -3286,7 +3378,9 @@
   unittest.group('obj-schema-Orientation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrientation();
-      var od = api.Orientation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Orientation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrientation(od as api.Orientation);
     });
   });
@@ -3294,7 +3388,9 @@
   unittest.group('obj-schema-ProvidedSoftwareCatalog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProvidedSoftwareCatalog();
-      var od = api.ProvidedSoftwareCatalog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProvidedSoftwareCatalog.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProvidedSoftwareCatalog(od as api.ProvidedSoftwareCatalog);
     });
   });
@@ -3302,7 +3398,9 @@
   unittest.group('obj-schema-RegularFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegularFile();
-      var od = api.RegularFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegularFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegularFile(od as api.RegularFile);
     });
   });
@@ -3310,7 +3408,9 @@
   unittest.group('obj-schema-ResultStorage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultStorage();
-      var od = api.ResultStorage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultStorage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultStorage(od as api.ResultStorage);
     });
   });
@@ -3318,7 +3418,9 @@
   unittest.group('obj-schema-RoboDirective', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoboDirective();
-      var od = api.RoboDirective.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoboDirective.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoboDirective(od as api.RoboDirective);
     });
   });
@@ -3326,7 +3428,9 @@
   unittest.group('obj-schema-RoboStartingIntent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoboStartingIntent();
-      var od = api.RoboStartingIntent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoboStartingIntent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoboStartingIntent(od as api.RoboStartingIntent);
     });
   });
@@ -3334,7 +3438,8 @@
   unittest.group('obj-schema-Shard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShard();
-      var od = api.Shard.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Shard.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkShard(od as api.Shard);
     });
   });
@@ -3342,7 +3447,9 @@
   unittest.group('obj-schema-ShardingOption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShardingOption();
-      var od = api.ShardingOption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShardingOption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShardingOption(od as api.ShardingOption);
     });
   });
@@ -3350,7 +3457,9 @@
   unittest.group('obj-schema-StartActivityIntent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartActivityIntent();
-      var od = api.StartActivityIntent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartActivityIntent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartActivityIntent(od as api.StartActivityIntent);
     });
   });
@@ -3358,7 +3467,9 @@
   unittest.group('obj-schema-SystraceSetup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSystraceSetup();
-      var od = api.SystraceSetup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SystraceSetup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSystraceSetup(od as api.SystraceSetup);
     });
   });
@@ -3366,7 +3477,9 @@
   unittest.group('obj-schema-TestDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestDetails();
-      var od = api.TestDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestDetails(od as api.TestDetails);
     });
   });
@@ -3374,7 +3487,9 @@
   unittest.group('obj-schema-TestEnvironmentCatalog', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestEnvironmentCatalog();
-      var od = api.TestEnvironmentCatalog.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestEnvironmentCatalog.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestEnvironmentCatalog(od as api.TestEnvironmentCatalog);
     });
   });
@@ -3382,7 +3497,9 @@
   unittest.group('obj-schema-TestExecution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestExecution();
-      var od = api.TestExecution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestExecution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestExecution(od as api.TestExecution);
     });
   });
@@ -3390,7 +3507,9 @@
   unittest.group('obj-schema-TestMatrix', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestMatrix();
-      var od = api.TestMatrix.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestMatrix.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestMatrix(od as api.TestMatrix);
     });
   });
@@ -3398,7 +3517,9 @@
   unittest.group('obj-schema-TestSetup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestSetup();
-      var od = api.TestSetup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestSetup.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestSetup(od as api.TestSetup);
     });
   });
@@ -3406,7 +3527,9 @@
   unittest.group('obj-schema-TestSpecification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestSpecification();
-      var od = api.TestSpecification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestSpecification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestSpecification(od as api.TestSpecification);
     });
   });
@@ -3414,7 +3537,9 @@
   unittest.group('obj-schema-TestTargetsForShard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestTargetsForShard();
-      var od = api.TestTargetsForShard.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestTargetsForShard.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestTargetsForShard(od as api.TestTargetsForShard);
     });
   });
@@ -3422,7 +3547,9 @@
   unittest.group('obj-schema-ToolResultsExecution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildToolResultsExecution();
-      var od = api.ToolResultsExecution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ToolResultsExecution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkToolResultsExecution(od as api.ToolResultsExecution);
     });
   });
@@ -3430,7 +3557,9 @@
   unittest.group('obj-schema-ToolResultsHistory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildToolResultsHistory();
-      var od = api.ToolResultsHistory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ToolResultsHistory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkToolResultsHistory(od as api.ToolResultsHistory);
     });
   });
@@ -3438,7 +3567,9 @@
   unittest.group('obj-schema-ToolResultsStep', () {
     unittest.test('to-json--from-json', () async {
       var o = buildToolResultsStep();
-      var od = api.ToolResultsStep.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ToolResultsStep.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkToolResultsStep(od as api.ToolResultsStep);
     });
   });
@@ -3446,7 +3577,9 @@
   unittest.group('obj-schema-TrafficRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrafficRule();
-      var od = api.TrafficRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrafficRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrafficRule(od as api.TrafficRule);
     });
   });
@@ -3454,7 +3587,9 @@
   unittest.group('obj-schema-UniformSharding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUniformSharding();
-      var od = api.UniformSharding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UniformSharding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUniformSharding(od as api.UniformSharding);
     });
   });
@@ -3462,7 +3597,9 @@
   unittest.group('obj-schema-XcodeVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildXcodeVersion();
-      var od = api.XcodeVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.XcodeVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkXcodeVersion(od as api.XcodeVersion);
     });
   });
diff --git a/generated/googleapis/test/texttospeech/v1_test.dart b/generated/googleapis/test/texttospeech/v1_test.dart
index d56e0ed..4cf408c 100644
--- a/generated/googleapis/test/texttospeech/v1_test.dart
+++ b/generated/googleapis/test/texttospeech/v1_test.dart
@@ -283,7 +283,9 @@
   unittest.group('obj-schema-AudioConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAudioConfig();
-      var od = api.AudioConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AudioConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAudioConfig(od as api.AudioConfig);
     });
   });
@@ -291,7 +293,9 @@
   unittest.group('obj-schema-ListVoicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListVoicesResponse();
-      var od = api.ListVoicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListVoicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListVoicesResponse(od as api.ListVoicesResponse);
     });
   });
@@ -299,7 +303,9 @@
   unittest.group('obj-schema-SynthesisInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSynthesisInput();
-      var od = api.SynthesisInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SynthesisInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSynthesisInput(od as api.SynthesisInput);
     });
   });
@@ -307,7 +313,9 @@
   unittest.group('obj-schema-SynthesizeSpeechRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSynthesizeSpeechRequest();
-      var od = api.SynthesizeSpeechRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SynthesizeSpeechRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSynthesizeSpeechRequest(od as api.SynthesizeSpeechRequest);
     });
   });
@@ -315,7 +323,9 @@
   unittest.group('obj-schema-SynthesizeSpeechResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSynthesizeSpeechResponse();
-      var od = api.SynthesizeSpeechResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SynthesizeSpeechResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSynthesizeSpeechResponse(od as api.SynthesizeSpeechResponse);
     });
   });
@@ -323,7 +333,8 @@
   unittest.group('obj-schema-Voice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVoice();
-      var od = api.Voice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Voice.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVoice(od as api.Voice);
     });
   });
@@ -331,7 +342,9 @@
   unittest.group('obj-schema-VoiceSelectionParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVoiceSelectionParams();
-      var od = api.VoiceSelectionParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VoiceSelectionParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVoiceSelectionParams(od as api.VoiceSelectionParams);
     });
   });
diff --git a/generated/googleapis/test/tpu/v1_test.dart b/generated/googleapis/test/tpu/v1_test.dart
index 322ebd1..fdb5b01 100644
--- a/generated/googleapis/test/tpu/v1_test.dart
+++ b/generated/googleapis/test/tpu/v1_test.dart
@@ -986,7 +986,9 @@
   unittest.group('obj-schema-AcceleratorType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceleratorType();
-      var od = api.AcceleratorType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceleratorType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceleratorType(od as api.AcceleratorType);
     });
   });
@@ -994,7 +996,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1002,7 +1005,9 @@
   unittest.group('obj-schema-ListAcceleratorTypesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAcceleratorTypesResponse();
-      var od = api.ListAcceleratorTypesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAcceleratorTypesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAcceleratorTypesResponse(od as api.ListAcceleratorTypesResponse);
     });
   });
@@ -1010,7 +1015,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1018,7 +1025,9 @@
   unittest.group('obj-schema-ListNodesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNodesResponse();
-      var od = api.ListNodesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNodesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNodesResponse(od as api.ListNodesResponse);
     });
   });
@@ -1026,7 +1035,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1034,7 +1045,9 @@
   unittest.group('obj-schema-ListTensorFlowVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTensorFlowVersionsResponse();
-      var od = api.ListTensorFlowVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTensorFlowVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTensorFlowVersionsResponse(
           od as api.ListTensorFlowVersionsResponse);
     });
@@ -1043,7 +1056,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1051,7 +1066,9 @@
   unittest.group('obj-schema-NetworkEndpoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetworkEndpoint();
-      var od = api.NetworkEndpoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NetworkEndpoint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNetworkEndpoint(od as api.NetworkEndpoint);
     });
   });
@@ -1059,7 +1076,8 @@
   unittest.group('obj-schema-Node', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNode();
-      var od = api.Node.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Node.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNode(od as api.Node);
     });
   });
@@ -1067,7 +1085,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1075,7 +1095,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -1083,7 +1105,9 @@
   unittest.group('obj-schema-ReimageNodeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReimageNodeRequest();
-      var od = api.ReimageNodeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReimageNodeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReimageNodeRequest(od as api.ReimageNodeRequest);
     });
   });
@@ -1091,7 +1115,9 @@
   unittest.group('obj-schema-SchedulingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchedulingConfig();
-      var od = api.SchedulingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SchedulingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSchedulingConfig(od as api.SchedulingConfig);
     });
   });
@@ -1099,7 +1125,9 @@
   unittest.group('obj-schema-StartNodeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartNodeRequest();
-      var od = api.StartNodeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartNodeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartNodeRequest(od as api.StartNodeRequest);
     });
   });
@@ -1107,7 +1135,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1115,7 +1145,9 @@
   unittest.group('obj-schema-StopNodeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStopNodeRequest();
-      var od = api.StopNodeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StopNodeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStopNodeRequest(od as api.StopNodeRequest);
     });
   });
@@ -1123,7 +1155,9 @@
   unittest.group('obj-schema-Symptom', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSymptom();
-      var od = api.Symptom.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Symptom.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSymptom(od as api.Symptom);
     });
   });
@@ -1131,7 +1165,9 @@
   unittest.group('obj-schema-TensorFlowVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTensorFlowVersion();
-      var od = api.TensorFlowVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TensorFlowVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTensorFlowVersion(od as api.TensorFlowVersion);
     });
   });
diff --git a/generated/googleapis/test/trafficdirector/v2_test.dart b/generated/googleapis/test/trafficdirector/v2_test.dart
index 03b7c46..eb4ab70 100644
--- a/generated/googleapis/test/trafficdirector/v2_test.dart
+++ b/generated/googleapis/test/trafficdirector/v2_test.dart
@@ -1800,7 +1800,9 @@
   unittest.group('obj-schema-Address', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddress();
-      var od = api.Address.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Address.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAddress(od as api.Address);
     });
   });
@@ -1808,7 +1810,9 @@
   unittest.group('obj-schema-BuildVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildVersion();
-      var od = api.BuildVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildVersion(od as api.BuildVersion);
     });
   });
@@ -1816,7 +1820,9 @@
   unittest.group('obj-schema-ClientConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientConfig();
-      var od = api.ClientConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClientConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClientConfig(od as api.ClientConfig);
     });
   });
@@ -1824,7 +1830,9 @@
   unittest.group('obj-schema-ClientStatusRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientStatusRequest();
-      var od = api.ClientStatusRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClientStatusRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClientStatusRequest(od as api.ClientStatusRequest);
     });
   });
@@ -1832,7 +1840,9 @@
   unittest.group('obj-schema-ClientStatusResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientStatusResponse();
-      var od = api.ClientStatusResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClientStatusResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClientStatusResponse(od as api.ClientStatusResponse);
     });
   });
@@ -1840,7 +1850,9 @@
   unittest.group('obj-schema-ClustersConfigDump', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClustersConfigDump();
-      var od = api.ClustersConfigDump.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClustersConfigDump.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClustersConfigDump(od as api.ClustersConfigDump);
     });
   });
@@ -1848,7 +1860,9 @@
   unittest.group('obj-schema-DoubleMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoubleMatcher();
-      var od = api.DoubleMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoubleMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoubleMatcher(od as api.DoubleMatcher);
     });
   });
@@ -1856,7 +1870,9 @@
   unittest.group('obj-schema-DoubleRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDoubleRange();
-      var od = api.DoubleRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DoubleRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDoubleRange(od as api.DoubleRange);
     });
   });
@@ -1864,7 +1880,9 @@
   unittest.group('obj-schema-DynamicCluster', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicCluster();
-      var od = api.DynamicCluster.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicCluster.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicCluster(od as api.DynamicCluster);
     });
   });
@@ -1872,7 +1890,9 @@
   unittest.group('obj-schema-DynamicListener', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicListener();
-      var od = api.DynamicListener.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicListener.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicListener(od as api.DynamicListener);
     });
   });
@@ -1880,7 +1900,9 @@
   unittest.group('obj-schema-DynamicListenerState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicListenerState();
-      var od = api.DynamicListenerState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicListenerState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicListenerState(od as api.DynamicListenerState);
     });
   });
@@ -1888,7 +1910,9 @@
   unittest.group('obj-schema-DynamicRouteConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicRouteConfig();
-      var od = api.DynamicRouteConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicRouteConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicRouteConfig(od as api.DynamicRouteConfig);
     });
   });
@@ -1896,7 +1920,9 @@
   unittest.group('obj-schema-DynamicScopedRouteConfigs', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicScopedRouteConfigs();
-      var od = api.DynamicScopedRouteConfigs.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicScopedRouteConfigs.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicScopedRouteConfigs(od as api.DynamicScopedRouteConfigs);
     });
   });
@@ -1904,7 +1930,9 @@
   unittest.group('obj-schema-Extension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExtension();
-      var od = api.Extension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Extension.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExtension(od as api.Extension);
     });
   });
@@ -1912,7 +1940,9 @@
   unittest.group('obj-schema-GoogleRE2', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRE2();
-      var od = api.GoogleRE2.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GoogleRE2.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRE2(od as api.GoogleRE2);
     });
   });
@@ -1920,7 +1950,9 @@
   unittest.group('obj-schema-InlineScopedRouteConfigs', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInlineScopedRouteConfigs();
-      var od = api.InlineScopedRouteConfigs.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InlineScopedRouteConfigs.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInlineScopedRouteConfigs(od as api.InlineScopedRouteConfigs);
     });
   });
@@ -1928,7 +1960,9 @@
   unittest.group('obj-schema-ListMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMatcher();
-      var od = api.ListMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMatcher(od as api.ListMatcher);
     });
   });
@@ -1936,7 +1970,9 @@
   unittest.group('obj-schema-ListenersConfigDump', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListenersConfigDump();
-      var od = api.ListenersConfigDump.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListenersConfigDump.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListenersConfigDump(od as api.ListenersConfigDump);
     });
   });
@@ -1944,7 +1980,9 @@
   unittest.group('obj-schema-Locality', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocality();
-      var od = api.Locality.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Locality.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocality(od as api.Locality);
     });
   });
@@ -1952,7 +1990,8 @@
   unittest.group('obj-schema-Node', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNode();
-      var od = api.Node.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Node.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNode(od as api.Node);
     });
   });
@@ -1960,7 +1999,9 @@
   unittest.group('obj-schema-NodeMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNodeMatcher();
-      var od = api.NodeMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NodeMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNodeMatcher(od as api.NodeMatcher);
     });
   });
@@ -1968,7 +2009,9 @@
   unittest.group('obj-schema-NullMatch', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNullMatch();
-      var od = api.NullMatch.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NullMatch.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNullMatch(od as api.NullMatch);
     });
   });
@@ -1976,7 +2019,9 @@
   unittest.group('obj-schema-PathSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPathSegment();
-      var od = api.PathSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PathSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPathSegment(od as api.PathSegment);
     });
   });
@@ -1984,7 +2029,9 @@
   unittest.group('obj-schema-PerXdsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerXdsConfig();
-      var od = api.PerXdsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerXdsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerXdsConfig(od as api.PerXdsConfig);
     });
   });
@@ -1992,7 +2039,8 @@
   unittest.group('obj-schema-Pipe', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPipe();
-      var od = api.Pipe.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Pipe.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPipe(od as api.Pipe);
     });
   });
@@ -2000,7 +2048,9 @@
   unittest.group('obj-schema-RegexMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegexMatcher();
-      var od = api.RegexMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegexMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegexMatcher(od as api.RegexMatcher);
     });
   });
@@ -2008,7 +2058,9 @@
   unittest.group('obj-schema-RoutesConfigDump', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoutesConfigDump();
-      var od = api.RoutesConfigDump.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoutesConfigDump.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoutesConfigDump(od as api.RoutesConfigDump);
     });
   });
@@ -2016,7 +2068,9 @@
   unittest.group('obj-schema-ScopedRoutesConfigDump', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScopedRoutesConfigDump();
-      var od = api.ScopedRoutesConfigDump.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScopedRoutesConfigDump.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScopedRoutesConfigDump(od as api.ScopedRoutesConfigDump);
     });
   });
@@ -2024,7 +2078,9 @@
   unittest.group('obj-schema-SemanticVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSemanticVersion();
-      var od = api.SemanticVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SemanticVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSemanticVersion(od as api.SemanticVersion);
     });
   });
@@ -2032,7 +2088,9 @@
   unittest.group('obj-schema-SocketAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSocketAddress();
-      var od = api.SocketAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SocketAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSocketAddress(od as api.SocketAddress);
     });
   });
@@ -2040,7 +2098,9 @@
   unittest.group('obj-schema-StaticCluster', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStaticCluster();
-      var od = api.StaticCluster.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StaticCluster.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStaticCluster(od as api.StaticCluster);
     });
   });
@@ -2048,7 +2108,9 @@
   unittest.group('obj-schema-StaticListener', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStaticListener();
-      var od = api.StaticListener.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StaticListener.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStaticListener(od as api.StaticListener);
     });
   });
@@ -2056,7 +2118,9 @@
   unittest.group('obj-schema-StaticRouteConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStaticRouteConfig();
-      var od = api.StaticRouteConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StaticRouteConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStaticRouteConfig(od as api.StaticRouteConfig);
     });
   });
@@ -2064,7 +2128,9 @@
   unittest.group('obj-schema-StringMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStringMatcher();
-      var od = api.StringMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StringMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStringMatcher(od as api.StringMatcher);
     });
   });
@@ -2072,7 +2138,9 @@
   unittest.group('obj-schema-StructMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStructMatcher();
-      var od = api.StructMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StructMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStructMatcher(od as api.StructMatcher);
     });
   });
@@ -2080,7 +2148,9 @@
   unittest.group('obj-schema-UpdateFailureState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateFailureState();
-      var od = api.UpdateFailureState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateFailureState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateFailureState(od as api.UpdateFailureState);
     });
   });
@@ -2088,7 +2158,9 @@
   unittest.group('obj-schema-ValueMatcher', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValueMatcher();
-      var od = api.ValueMatcher.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValueMatcher.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValueMatcher(od as api.ValueMatcher);
     });
   });
diff --git a/generated/googleapis/test/translate/v3_test.dart b/generated/googleapis/test/translate/v3_test.dart
index 039b356..eb79dfb 100644
--- a/generated/googleapis/test/translate/v3_test.dart
+++ b/generated/googleapis/test/translate/v3_test.dart
@@ -1204,7 +1204,9 @@
   unittest.group('obj-schema-BatchTranslateTextRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchTranslateTextRequest();
-      var od = api.BatchTranslateTextRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchTranslateTextRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchTranslateTextRequest(od as api.BatchTranslateTextRequest);
     });
   });
@@ -1212,7 +1214,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -1220,7 +1224,9 @@
   unittest.group('obj-schema-DetectLanguageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDetectLanguageRequest();
-      var od = api.DetectLanguageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DetectLanguageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDetectLanguageRequest(od as api.DetectLanguageRequest);
     });
   });
@@ -1228,7 +1234,9 @@
   unittest.group('obj-schema-DetectLanguageResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDetectLanguageResponse();
-      var od = api.DetectLanguageResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DetectLanguageResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDetectLanguageResponse(od as api.DetectLanguageResponse);
     });
   });
@@ -1236,7 +1244,9 @@
   unittest.group('obj-schema-DetectedLanguage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDetectedLanguage();
-      var od = api.DetectedLanguage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DetectedLanguage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDetectedLanguage(od as api.DetectedLanguage);
     });
   });
@@ -1244,7 +1254,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1252,7 +1263,9 @@
   unittest.group('obj-schema-GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcsDestination();
-      var od = api.GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGcsDestination(od as api.GcsDestination);
     });
   });
@@ -1260,7 +1273,9 @@
   unittest.group('obj-schema-GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcsSource();
-      var od = api.GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GcsSource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGcsSource(od as api.GcsSource);
     });
   });
@@ -1268,7 +1283,9 @@
   unittest.group('obj-schema-Glossary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlossary();
-      var od = api.Glossary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Glossary.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGlossary(od as api.Glossary);
     });
   });
@@ -1276,7 +1293,9 @@
   unittest.group('obj-schema-GlossaryInputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlossaryInputConfig();
-      var od = api.GlossaryInputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GlossaryInputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGlossaryInputConfig(od as api.GlossaryInputConfig);
     });
   });
@@ -1284,7 +1303,9 @@
   unittest.group('obj-schema-InputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInputConfig();
-      var od = api.InputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInputConfig(od as api.InputConfig);
     });
   });
@@ -1292,7 +1313,9 @@
   unittest.group('obj-schema-LanguageCodePair', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLanguageCodePair();
-      var od = api.LanguageCodePair.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LanguageCodePair.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLanguageCodePair(od as api.LanguageCodePair);
     });
   });
@@ -1300,7 +1323,9 @@
   unittest.group('obj-schema-LanguageCodesSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLanguageCodesSet();
-      var od = api.LanguageCodesSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LanguageCodesSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLanguageCodesSet(od as api.LanguageCodesSet);
     });
   });
@@ -1308,7 +1333,9 @@
   unittest.group('obj-schema-ListGlossariesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGlossariesResponse();
-      var od = api.ListGlossariesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGlossariesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGlossariesResponse(od as api.ListGlossariesResponse);
     });
   });
@@ -1316,7 +1343,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1324,7 +1353,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1332,7 +1363,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1340,7 +1373,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1348,7 +1383,9 @@
   unittest.group('obj-schema-OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOutputConfig();
-      var od = api.OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOutputConfig(od as api.OutputConfig);
     });
   });
@@ -1356,7 +1393,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1364,7 +1403,9 @@
   unittest.group('obj-schema-SupportedLanguage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSupportedLanguage();
-      var od = api.SupportedLanguage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SupportedLanguage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSupportedLanguage(od as api.SupportedLanguage);
     });
   });
@@ -1372,7 +1413,9 @@
   unittest.group('obj-schema-SupportedLanguages', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSupportedLanguages();
-      var od = api.SupportedLanguages.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SupportedLanguages.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSupportedLanguages(od as api.SupportedLanguages);
     });
   });
@@ -1380,7 +1423,9 @@
   unittest.group('obj-schema-TranslateTextGlossaryConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTranslateTextGlossaryConfig();
-      var od = api.TranslateTextGlossaryConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TranslateTextGlossaryConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTranslateTextGlossaryConfig(od as api.TranslateTextGlossaryConfig);
     });
   });
@@ -1388,7 +1433,9 @@
   unittest.group('obj-schema-TranslateTextRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTranslateTextRequest();
-      var od = api.TranslateTextRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TranslateTextRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTranslateTextRequest(od as api.TranslateTextRequest);
     });
   });
@@ -1396,7 +1443,9 @@
   unittest.group('obj-schema-TranslateTextResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTranslateTextResponse();
-      var od = api.TranslateTextResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TranslateTextResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTranslateTextResponse(od as api.TranslateTextResponse);
     });
   });
@@ -1404,7 +1453,9 @@
   unittest.group('obj-schema-Translation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTranslation();
-      var od = api.Translation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Translation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTranslation(od as api.Translation);
     });
   });
@@ -1412,7 +1463,9 @@
   unittest.group('obj-schema-WaitOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWaitOperationRequest();
-      var od = api.WaitOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WaitOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWaitOperationRequest(od as api.WaitOperationRequest);
     });
   });
diff --git a/generated/googleapis/test/vault/v1_test.dart b/generated/googleapis/test/vault/v1_test.dart
index 00d894a..56dda3f 100644
--- a/generated/googleapis/test/vault/v1_test.dart
+++ b/generated/googleapis/test/vault/v1_test.dart
@@ -2175,7 +2175,9 @@
   unittest.group('obj-schema-AccountCount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountCount();
-      var od = api.AccountCount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountCount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountCount(od as api.AccountCount);
     });
   });
@@ -2183,7 +2185,9 @@
   unittest.group('obj-schema-AccountCountError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountCountError();
-      var od = api.AccountCountError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountCountError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountCountError(od as api.AccountCountError);
     });
   });
@@ -2191,7 +2195,9 @@
   unittest.group('obj-schema-AccountInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountInfo();
-      var od = api.AccountInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountInfo(od as api.AccountInfo);
     });
   });
@@ -2199,7 +2205,9 @@
   unittest.group('obj-schema-AddHeldAccountResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddHeldAccountResult();
-      var od = api.AddHeldAccountResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddHeldAccountResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddHeldAccountResult(od as api.AddHeldAccountResult);
     });
   });
@@ -2207,7 +2215,9 @@
   unittest.group('obj-schema-AddHeldAccountsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddHeldAccountsRequest();
-      var od = api.AddHeldAccountsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddHeldAccountsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddHeldAccountsRequest(od as api.AddHeldAccountsRequest);
     });
   });
@@ -2215,7 +2225,9 @@
   unittest.group('obj-schema-AddHeldAccountsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddHeldAccountsResponse();
-      var od = api.AddHeldAccountsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddHeldAccountsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddHeldAccountsResponse(od as api.AddHeldAccountsResponse);
     });
   });
@@ -2223,7 +2235,9 @@
   unittest.group('obj-schema-AddMatterPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddMatterPermissionsRequest();
-      var od = api.AddMatterPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddMatterPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddMatterPermissionsRequest(od as api.AddMatterPermissionsRequest);
     });
   });
@@ -2231,7 +2245,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -2239,7 +2255,9 @@
   unittest.group('obj-schema-CloseMatterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloseMatterRequest();
-      var od = api.CloseMatterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloseMatterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloseMatterRequest(od as api.CloseMatterRequest);
     });
   });
@@ -2247,7 +2265,9 @@
   unittest.group('obj-schema-CloseMatterResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloseMatterResponse();
-      var od = api.CloseMatterResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloseMatterResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloseMatterResponse(od as api.CloseMatterResponse);
     });
   });
@@ -2255,7 +2275,9 @@
   unittest.group('obj-schema-CloudStorageFile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudStorageFile();
-      var od = api.CloudStorageFile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudStorageFile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudStorageFile(od as api.CloudStorageFile);
     });
   });
@@ -2263,7 +2285,9 @@
   unittest.group('obj-schema-CloudStorageSink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudStorageSink();
-      var od = api.CloudStorageSink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudStorageSink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudStorageSink(od as api.CloudStorageSink);
     });
   });
@@ -2271,7 +2295,9 @@
   unittest.group('obj-schema-CorpusQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCorpusQuery();
-      var od = api.CorpusQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CorpusQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCorpusQuery(od as api.CorpusQuery);
     });
   });
@@ -2279,7 +2305,9 @@
   unittest.group('obj-schema-CountArtifactsMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCountArtifactsMetadata();
-      var od = api.CountArtifactsMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CountArtifactsMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCountArtifactsMetadata(od as api.CountArtifactsMetadata);
     });
   });
@@ -2287,7 +2315,9 @@
   unittest.group('obj-schema-CountArtifactsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCountArtifactsRequest();
-      var od = api.CountArtifactsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CountArtifactsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCountArtifactsRequest(od as api.CountArtifactsRequest);
     });
   });
@@ -2295,7 +2325,9 @@
   unittest.group('obj-schema-CountArtifactsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCountArtifactsResponse();
-      var od = api.CountArtifactsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CountArtifactsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCountArtifactsResponse(od as api.CountArtifactsResponse);
     });
   });
@@ -2303,7 +2335,9 @@
   unittest.group('obj-schema-DriveExportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveExportOptions();
-      var od = api.DriveExportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveExportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveExportOptions(od as api.DriveExportOptions);
     });
   });
@@ -2311,7 +2345,9 @@
   unittest.group('obj-schema-DriveOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDriveOptions();
-      var od = api.DriveOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DriveOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDriveOptions(od as api.DriveOptions);
     });
   });
@@ -2319,7 +2355,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2327,7 +2364,9 @@
   unittest.group('obj-schema-Export', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExport();
-      var od = api.Export.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Export.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExport(od as api.Export);
     });
   });
@@ -2335,7 +2374,9 @@
   unittest.group('obj-schema-ExportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportOptions();
-      var od = api.ExportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportOptions(od as api.ExportOptions);
     });
   });
@@ -2343,7 +2384,9 @@
   unittest.group('obj-schema-ExportStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportStats();
-      var od = api.ExportStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportStats(od as api.ExportStats);
     });
   });
@@ -2351,7 +2394,9 @@
   unittest.group('obj-schema-GroupsCountResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupsCountResult();
-      var od = api.GroupsCountResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupsCountResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupsCountResult(od as api.GroupsCountResult);
     });
   });
@@ -2359,7 +2404,9 @@
   unittest.group('obj-schema-GroupsExportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupsExportOptions();
-      var od = api.GroupsExportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupsExportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupsExportOptions(od as api.GroupsExportOptions);
     });
   });
@@ -2367,7 +2414,9 @@
   unittest.group('obj-schema-HangoutsChatExportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHangoutsChatExportOptions();
-      var od = api.HangoutsChatExportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HangoutsChatExportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHangoutsChatExportOptions(od as api.HangoutsChatExportOptions);
     });
   });
@@ -2375,7 +2424,9 @@
   unittest.group('obj-schema-HangoutsChatInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHangoutsChatInfo();
-      var od = api.HangoutsChatInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HangoutsChatInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHangoutsChatInfo(od as api.HangoutsChatInfo);
     });
   });
@@ -2383,7 +2434,9 @@
   unittest.group('obj-schema-HangoutsChatOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHangoutsChatOptions();
-      var od = api.HangoutsChatOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HangoutsChatOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHangoutsChatOptions(od as api.HangoutsChatOptions);
     });
   });
@@ -2391,7 +2444,9 @@
   unittest.group('obj-schema-HeldAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHeldAccount();
-      var od = api.HeldAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HeldAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHeldAccount(od as api.HeldAccount);
     });
   });
@@ -2399,7 +2454,9 @@
   unittest.group('obj-schema-HeldDriveQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHeldDriveQuery();
-      var od = api.HeldDriveQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HeldDriveQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHeldDriveQuery(od as api.HeldDriveQuery);
     });
   });
@@ -2407,7 +2464,9 @@
   unittest.group('obj-schema-HeldGroupsQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHeldGroupsQuery();
-      var od = api.HeldGroupsQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HeldGroupsQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHeldGroupsQuery(od as api.HeldGroupsQuery);
     });
   });
@@ -2415,7 +2474,9 @@
   unittest.group('obj-schema-HeldHangoutsChatQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHeldHangoutsChatQuery();
-      var od = api.HeldHangoutsChatQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HeldHangoutsChatQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHeldHangoutsChatQuery(od as api.HeldHangoutsChatQuery);
     });
   });
@@ -2423,7 +2484,9 @@
   unittest.group('obj-schema-HeldMailQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHeldMailQuery();
-      var od = api.HeldMailQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HeldMailQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHeldMailQuery(od as api.HeldMailQuery);
     });
   });
@@ -2431,7 +2494,9 @@
   unittest.group('obj-schema-HeldOrgUnit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHeldOrgUnit();
-      var od = api.HeldOrgUnit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HeldOrgUnit.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHeldOrgUnit(od as api.HeldOrgUnit);
     });
   });
@@ -2439,7 +2504,9 @@
   unittest.group('obj-schema-HeldVoiceQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHeldVoiceQuery();
-      var od = api.HeldVoiceQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HeldVoiceQuery.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHeldVoiceQuery(od as api.HeldVoiceQuery);
     });
   });
@@ -2447,7 +2514,8 @@
   unittest.group('obj-schema-Hold', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHold();
-      var od = api.Hold.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Hold.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHold(od as api.Hold);
     });
   });
@@ -2455,7 +2523,9 @@
   unittest.group('obj-schema-ListExportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListExportsResponse();
-      var od = api.ListExportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListExportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListExportsResponse(od as api.ListExportsResponse);
     });
   });
@@ -2463,7 +2533,9 @@
   unittest.group('obj-schema-ListHeldAccountsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListHeldAccountsResponse();
-      var od = api.ListHeldAccountsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListHeldAccountsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListHeldAccountsResponse(od as api.ListHeldAccountsResponse);
     });
   });
@@ -2471,7 +2543,9 @@
   unittest.group('obj-schema-ListHoldsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListHoldsResponse();
-      var od = api.ListHoldsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListHoldsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListHoldsResponse(od as api.ListHoldsResponse);
     });
   });
@@ -2479,7 +2553,9 @@
   unittest.group('obj-schema-ListMattersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMattersResponse();
-      var od = api.ListMattersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMattersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMattersResponse(od as api.ListMattersResponse);
     });
   });
@@ -2487,7 +2563,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -2495,7 +2573,9 @@
   unittest.group('obj-schema-ListSavedQueriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSavedQueriesResponse();
-      var od = api.ListSavedQueriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSavedQueriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSavedQueriesResponse(od as api.ListSavedQueriesResponse);
     });
   });
@@ -2503,7 +2583,9 @@
   unittest.group('obj-schema-MailCountResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMailCountResult();
-      var od = api.MailCountResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MailCountResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMailCountResult(od as api.MailCountResult);
     });
   });
@@ -2511,7 +2593,9 @@
   unittest.group('obj-schema-MailExportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMailExportOptions();
-      var od = api.MailExportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MailExportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMailExportOptions(od as api.MailExportOptions);
     });
   });
@@ -2519,7 +2603,9 @@
   unittest.group('obj-schema-MailOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMailOptions();
-      var od = api.MailOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MailOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMailOptions(od as api.MailOptions);
     });
   });
@@ -2527,7 +2613,9 @@
   unittest.group('obj-schema-Matter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMatter();
-      var od = api.Matter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Matter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMatter(od as api.Matter);
     });
   });
@@ -2535,7 +2623,9 @@
   unittest.group('obj-schema-MatterPermission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMatterPermission();
-      var od = api.MatterPermission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MatterPermission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMatterPermission(od as api.MatterPermission);
     });
   });
@@ -2543,7 +2633,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2551,7 +2643,9 @@
   unittest.group('obj-schema-OrgUnitInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrgUnitInfo();
-      var od = api.OrgUnitInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OrgUnitInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOrgUnitInfo(od as api.OrgUnitInfo);
     });
   });
@@ -2559,7 +2653,8 @@
   unittest.group('obj-schema-Query', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuery();
-      var od = api.Query.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Query.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQuery(od as api.Query);
     });
   });
@@ -2567,7 +2662,9 @@
   unittest.group('obj-schema-RemoveHeldAccountsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveHeldAccountsRequest();
-      var od = api.RemoveHeldAccountsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveHeldAccountsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveHeldAccountsRequest(od as api.RemoveHeldAccountsRequest);
     });
   });
@@ -2575,7 +2672,9 @@
   unittest.group('obj-schema-RemoveHeldAccountsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveHeldAccountsResponse();
-      var od = api.RemoveHeldAccountsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveHeldAccountsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveHeldAccountsResponse(od as api.RemoveHeldAccountsResponse);
     });
   });
@@ -2583,7 +2682,9 @@
   unittest.group('obj-schema-RemoveMatterPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveMatterPermissionsRequest();
-      var od = api.RemoveMatterPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveMatterPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveMatterPermissionsRequest(
           od as api.RemoveMatterPermissionsRequest);
     });
@@ -2592,7 +2693,9 @@
   unittest.group('obj-schema-ReopenMatterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReopenMatterRequest();
-      var od = api.ReopenMatterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReopenMatterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReopenMatterRequest(od as api.ReopenMatterRequest);
     });
   });
@@ -2600,7 +2703,9 @@
   unittest.group('obj-schema-ReopenMatterResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReopenMatterResponse();
-      var od = api.ReopenMatterResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReopenMatterResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReopenMatterResponse(od as api.ReopenMatterResponse);
     });
   });
@@ -2608,7 +2713,9 @@
   unittest.group('obj-schema-SavedQuery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSavedQuery();
-      var od = api.SavedQuery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SavedQuery.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSavedQuery(od as api.SavedQuery);
     });
   });
@@ -2616,7 +2723,9 @@
   unittest.group('obj-schema-SharedDriveInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSharedDriveInfo();
-      var od = api.SharedDriveInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SharedDriveInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSharedDriveInfo(od as api.SharedDriveInfo);
     });
   });
@@ -2624,7 +2733,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2632,7 +2743,9 @@
   unittest.group('obj-schema-TeamDriveInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTeamDriveInfo();
-      var od = api.TeamDriveInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TeamDriveInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTeamDriveInfo(od as api.TeamDriveInfo);
     });
   });
@@ -2640,7 +2753,9 @@
   unittest.group('obj-schema-UndeleteMatterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteMatterRequest();
-      var od = api.UndeleteMatterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteMatterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteMatterRequest(od as api.UndeleteMatterRequest);
     });
   });
@@ -2648,7 +2763,9 @@
   unittest.group('obj-schema-UserInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserInfo();
-      var od = api.UserInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.UserInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUserInfo(od as api.UserInfo);
     });
   });
@@ -2656,7 +2773,9 @@
   unittest.group('obj-schema-VoiceExportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVoiceExportOptions();
-      var od = api.VoiceExportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VoiceExportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVoiceExportOptions(od as api.VoiceExportOptions);
     });
   });
@@ -2664,7 +2783,9 @@
   unittest.group('obj-schema-VoiceOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVoiceOptions();
-      var od = api.VoiceOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VoiceOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVoiceOptions(od as api.VoiceOptions);
     });
   });
diff --git a/generated/googleapis/test/vectortile/v1_test.dart b/generated/googleapis/test/vectortile/v1_test.dart
index 59d1d20..95cb33e 100644
--- a/generated/googleapis/test/vectortile/v1_test.dart
+++ b/generated/googleapis/test/vectortile/v1_test.dart
@@ -897,7 +897,8 @@
   unittest.group('obj-schema-Area', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArea();
-      var od = api.Area.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Area.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkArea(od as api.Area);
     });
   });
@@ -905,7 +906,9 @@
   unittest.group('obj-schema-BasemapZOrder', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasemapZOrder();
-      var od = api.BasemapZOrder.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasemapZOrder.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasemapZOrder(od as api.BasemapZOrder);
     });
   });
@@ -913,7 +916,9 @@
   unittest.group('obj-schema-ExtrudedArea', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExtrudedArea();
-      var od = api.ExtrudedArea.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExtrudedArea.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExtrudedArea(od as api.ExtrudedArea);
     });
   });
@@ -921,7 +926,9 @@
   unittest.group('obj-schema-Feature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeature();
-      var od = api.Feature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Feature.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFeature(od as api.Feature);
     });
   });
@@ -929,7 +936,9 @@
   unittest.group('obj-schema-FeatureTile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeatureTile();
-      var od = api.FeatureTile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FeatureTile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFeatureTile(od as api.FeatureTile);
     });
   });
@@ -937,7 +946,9 @@
   unittest.group('obj-schema-FirstDerivativeElevationGrid', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirstDerivativeElevationGrid();
-      var od = api.FirstDerivativeElevationGrid.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirstDerivativeElevationGrid.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirstDerivativeElevationGrid(od as api.FirstDerivativeElevationGrid);
     });
   });
@@ -945,7 +956,9 @@
   unittest.group('obj-schema-Geometry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeometry();
-      var od = api.Geometry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Geometry.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGeometry(od as api.Geometry);
     });
   });
@@ -953,7 +966,8 @@
   unittest.group('obj-schema-Line', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLine();
-      var od = api.Line.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Line.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLine(od as api.Line);
     });
   });
@@ -961,7 +975,9 @@
   unittest.group('obj-schema-ModeledVolume', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModeledVolume();
-      var od = api.ModeledVolume.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModeledVolume.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModeledVolume(od as api.ModeledVolume);
     });
   });
@@ -969,7 +985,9 @@
   unittest.group('obj-schema-ProviderInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProviderInfo();
-      var od = api.ProviderInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProviderInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProviderInfo(od as api.ProviderInfo);
     });
   });
@@ -977,7 +995,9 @@
   unittest.group('obj-schema-Relation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelation();
-      var od = api.Relation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Relation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRelation(od as api.Relation);
     });
   });
@@ -985,7 +1005,9 @@
   unittest.group('obj-schema-RoadInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoadInfo();
-      var od = api.RoadInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RoadInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRoadInfo(od as api.RoadInfo);
     });
   });
@@ -993,7 +1015,8 @@
   unittest.group('obj-schema-Row', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRow();
-      var od = api.Row.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Row.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRow(od as api.Row);
     });
   });
@@ -1001,7 +1024,9 @@
   unittest.group('obj-schema-SecondDerivativeElevationGrid', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecondDerivativeElevationGrid();
-      var od = api.SecondDerivativeElevationGrid.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecondDerivativeElevationGrid.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecondDerivativeElevationGrid(
           od as api.SecondDerivativeElevationGrid);
     });
@@ -1010,7 +1035,9 @@
   unittest.group('obj-schema-SegmentInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegmentInfo();
-      var od = api.SegmentInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SegmentInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSegmentInfo(od as api.SegmentInfo);
     });
   });
@@ -1018,7 +1045,9 @@
   unittest.group('obj-schema-TerrainTile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTerrainTile();
-      var od = api.TerrainTile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TerrainTile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTerrainTile(od as api.TerrainTile);
     });
   });
@@ -1026,7 +1055,9 @@
   unittest.group('obj-schema-TileCoordinates', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTileCoordinates();
-      var od = api.TileCoordinates.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TileCoordinates.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTileCoordinates(od as api.TileCoordinates);
     });
   });
@@ -1034,7 +1065,9 @@
   unittest.group('obj-schema-TriangleStrip', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTriangleStrip();
-      var od = api.TriangleStrip.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TriangleStrip.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTriangleStrip(od as api.TriangleStrip);
     });
   });
@@ -1042,7 +1075,9 @@
   unittest.group('obj-schema-Vertex2DList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVertex2DList();
-      var od = api.Vertex2DList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Vertex2DList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVertex2DList(od as api.Vertex2DList);
     });
   });
@@ -1050,7 +1085,9 @@
   unittest.group('obj-schema-Vertex3DList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVertex3DList();
-      var od = api.Vertex3DList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Vertex3DList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVertex3DList(od as api.Vertex3DList);
     });
   });
diff --git a/generated/googleapis/test/verifiedaccess/v1_test.dart b/generated/googleapis/test/verifiedaccess/v1_test.dart
index 1af76e7..3a3972f 100644
--- a/generated/googleapis/test/verifiedaccess/v1_test.dart
+++ b/generated/googleapis/test/verifiedaccess/v1_test.dart
@@ -155,7 +155,9 @@
   unittest.group('obj-schema-Challenge', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChallenge();
-      var od = api.Challenge.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Challenge.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChallenge(od as api.Challenge);
     });
   });
@@ -163,7 +165,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -171,7 +174,9 @@
   unittest.group('obj-schema-SignedData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignedData();
-      var od = api.SignedData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SignedData.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSignedData(od as api.SignedData);
     });
   });
@@ -179,7 +184,9 @@
   unittest.group('obj-schema-VerifyChallengeResponseRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVerifyChallengeResponseRequest();
-      var od = api.VerifyChallengeResponseRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VerifyChallengeResponseRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVerifyChallengeResponseRequest(
           od as api.VerifyChallengeResponseRequest);
     });
@@ -188,7 +195,9 @@
   unittest.group('obj-schema-VerifyChallengeResponseResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVerifyChallengeResponseResult();
-      var od = api.VerifyChallengeResponseResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VerifyChallengeResponseResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVerifyChallengeResponseResult(
           od as api.VerifyChallengeResponseResult);
     });
diff --git a/generated/googleapis/test/videointelligence/v1_test.dart b/generated/googleapis/test/videointelligence/v1_test.dart
index c764c93..8220359 100644
--- a/generated/googleapis/test/videointelligence/v1_test.dart
+++ b/generated/googleapis/test/videointelligence/v1_test.dart
@@ -9333,8 +9333,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1AnnotateVideoProgress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1AnnotateVideoProgress();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1AnnotateVideoProgress.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1AnnotateVideoProgress(
           od as api.GoogleCloudVideointelligenceV1AnnotateVideoProgress);
     });
@@ -9344,8 +9345,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1AnnotateVideoRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1AnnotateVideoRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1AnnotateVideoRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1AnnotateVideoRequest(
           od as api.GoogleCloudVideointelligenceV1AnnotateVideoRequest);
     });
@@ -9355,8 +9357,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1AnnotateVideoResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1AnnotateVideoResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1AnnotateVideoResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1AnnotateVideoResponse(
           od as api.GoogleCloudVideointelligenceV1AnnotateVideoResponse);
     });
@@ -9366,8 +9369,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1DetectedAttribute();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1DetectedAttribute.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1DetectedAttribute(
           od as api.GoogleCloudVideointelligenceV1DetectedAttribute);
     });
@@ -9377,8 +9381,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1DetectedLandmark();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1DetectedLandmark.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1DetectedLandmark(
           od as api.GoogleCloudVideointelligenceV1DetectedLandmark);
     });
@@ -9387,7 +9392,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1Entity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1Entity();
-      var od = api.GoogleCloudVideointelligenceV1Entity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1Entity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1Entity(
           od as api.GoogleCloudVideointelligenceV1Entity);
     });
@@ -9397,9 +9404,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1ExplicitContentAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1ExplicitContentAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1ExplicitContentAnnotation.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1ExplicitContentAnnotation(
           od as api.GoogleCloudVideointelligenceV1ExplicitContentAnnotation);
     });
@@ -9411,8 +9419,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1ExplicitContentDetectionConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1ExplicitContentDetectionConfig
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1ExplicitContentDetectionConfig(od
           as api.GoogleCloudVideointelligenceV1ExplicitContentDetectionConfig);
     });
@@ -9422,8 +9431,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1ExplicitContentFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1ExplicitContentFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1ExplicitContentFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1ExplicitContentFrame(
           od as api.GoogleCloudVideointelligenceV1ExplicitContentFrame);
     });
@@ -9432,8 +9442,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1FaceAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1FaceAnnotation();
-      var od =
-          api.GoogleCloudVideointelligenceV1FaceAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1FaceAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1FaceAnnotation(
           od as api.GoogleCloudVideointelligenceV1FaceAnnotation);
     });
@@ -9443,9 +9454,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1FaceDetectionAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1FaceDetectionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1FaceDetectionAnnotation.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1FaceDetectionAnnotation(
           od as api.GoogleCloudVideointelligenceV1FaceDetectionAnnotation);
     });
@@ -9455,8 +9467,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1FaceDetectionConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1FaceDetectionConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1FaceDetectionConfig(
           od as api.GoogleCloudVideointelligenceV1FaceDetectionConfig);
     });
@@ -9465,7 +9478,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1FaceFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1FaceFrame();
-      var od = api.GoogleCloudVideointelligenceV1FaceFrame.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1FaceFrame.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1FaceFrame(
           od as api.GoogleCloudVideointelligenceV1FaceFrame);
     });
@@ -9474,8 +9489,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1FaceSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1FaceSegment();
-      var od =
-          api.GoogleCloudVideointelligenceV1FaceSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1FaceSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1FaceSegment(
           od as api.GoogleCloudVideointelligenceV1FaceSegment);
     });
@@ -9485,8 +9501,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1LabelAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1LabelAnnotation(
           od as api.GoogleCloudVideointelligenceV1LabelAnnotation);
     });
@@ -9496,8 +9513,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1LabelDetectionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1LabelDetectionConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1LabelDetectionConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1LabelDetectionConfig(
           od as api.GoogleCloudVideointelligenceV1LabelDetectionConfig);
     });
@@ -9506,8 +9524,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1LabelFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1LabelFrame();
-      var od =
-          api.GoogleCloudVideointelligenceV1LabelFrame.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1LabelFrame.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1LabelFrame(
           od as api.GoogleCloudVideointelligenceV1LabelFrame);
     });
@@ -9516,8 +9535,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1LabelSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1LabelSegment();
-      var od =
-          api.GoogleCloudVideointelligenceV1LabelSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1LabelSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1LabelSegment(
           od as api.GoogleCloudVideointelligenceV1LabelSegment);
     });
@@ -9527,9 +9547,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1LogoRecognitionAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1LogoRecognitionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1LogoRecognitionAnnotation.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1LogoRecognitionAnnotation(
           od as api.GoogleCloudVideointelligenceV1LogoRecognitionAnnotation);
     });
@@ -9539,8 +9560,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1NormalizedBoundingBox', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1NormalizedBoundingBox();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1NormalizedBoundingBox.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1NormalizedBoundingBox(
           od as api.GoogleCloudVideointelligenceV1NormalizedBoundingBox);
     });
@@ -9550,9 +9572,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1NormalizedBoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1NormalizedBoundingPoly();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1NormalizedBoundingPoly.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1NormalizedBoundingPoly(
           od as api.GoogleCloudVideointelligenceV1NormalizedBoundingPoly);
     });
@@ -9562,8 +9585,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1NormalizedVertex();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1NormalizedVertex.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1NormalizedVertex(
           od as api.GoogleCloudVideointelligenceV1NormalizedVertex);
     });
@@ -9573,9 +9597,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1ObjectTrackingAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1ObjectTrackingAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1ObjectTrackingAnnotation.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1ObjectTrackingAnnotation(
           od as api.GoogleCloudVideointelligenceV1ObjectTrackingAnnotation);
     });
@@ -9585,8 +9610,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1ObjectTrackingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1ObjectTrackingConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1ObjectTrackingConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1ObjectTrackingConfig(
           od as api.GoogleCloudVideointelligenceV1ObjectTrackingConfig);
     });
@@ -9596,8 +9622,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1ObjectTrackingFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1ObjectTrackingFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1ObjectTrackingFrame(
           od as api.GoogleCloudVideointelligenceV1ObjectTrackingFrame);
     });
@@ -9607,9 +9634,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1PersonDetectionAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1PersonDetectionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1PersonDetectionAnnotation.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1PersonDetectionAnnotation(
           od as api.GoogleCloudVideointelligenceV1PersonDetectionAnnotation);
     });
@@ -9619,8 +9647,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1PersonDetectionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1PersonDetectionConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1PersonDetectionConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1PersonDetectionConfig(
           od as api.GoogleCloudVideointelligenceV1PersonDetectionConfig);
     });
@@ -9630,9 +9659,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1ShotChangeDetectionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1ShotChangeDetectionConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1ShotChangeDetectionConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1ShotChangeDetectionConfig(
           od as api.GoogleCloudVideointelligenceV1ShotChangeDetectionConfig);
     });
@@ -9641,8 +9671,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1SpeechContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1SpeechContext();
-      var od =
-          api.GoogleCloudVideointelligenceV1SpeechContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1SpeechContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1SpeechContext(
           od as api.GoogleCloudVideointelligenceV1SpeechContext);
     });
@@ -9653,8 +9684,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1SpeechRecognitionAlternative();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1SpeechRecognitionAlternative
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1SpeechRecognitionAlternative(
           od as api.GoogleCloudVideointelligenceV1SpeechRecognitionAlternative);
     });
@@ -9664,8 +9696,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1SpeechTranscription();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1SpeechTranscription.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1SpeechTranscription(
           od as api.GoogleCloudVideointelligenceV1SpeechTranscription);
     });
@@ -9675,9 +9708,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1SpeechTranscriptionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1SpeechTranscriptionConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1SpeechTranscriptionConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1SpeechTranscriptionConfig(
           od as api.GoogleCloudVideointelligenceV1SpeechTranscriptionConfig);
     });
@@ -9686,8 +9720,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1TextAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1TextAnnotation();
-      var od =
-          api.GoogleCloudVideointelligenceV1TextAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1TextAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1TextAnnotation(
           od as api.GoogleCloudVideointelligenceV1TextAnnotation);
     });
@@ -9697,8 +9732,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1TextDetectionConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1TextDetectionConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1TextDetectionConfig(
           od as api.GoogleCloudVideointelligenceV1TextDetectionConfig);
     });
@@ -9707,7 +9743,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1TextFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1TextFrame();
-      var od = api.GoogleCloudVideointelligenceV1TextFrame.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1TextFrame.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1TextFrame(
           od as api.GoogleCloudVideointelligenceV1TextFrame);
     });
@@ -9716,8 +9754,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1TextSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1TextSegment();
-      var od =
-          api.GoogleCloudVideointelligenceV1TextSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1TextSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1TextSegment(
           od as api.GoogleCloudVideointelligenceV1TextSegment);
     });
@@ -9727,8 +9766,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1TimestampedObject();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1TimestampedObject.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1TimestampedObject(
           od as api.GoogleCloudVideointelligenceV1TimestampedObject);
     });
@@ -9737,7 +9777,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1Track', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1Track();
-      var od = api.GoogleCloudVideointelligenceV1Track.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1Track.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1Track(
           od as api.GoogleCloudVideointelligenceV1Track);
     });
@@ -9747,9 +9789,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1VideoAnnotationProgress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1VideoAnnotationProgress();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1VideoAnnotationProgress.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1VideoAnnotationProgress(
           od as api.GoogleCloudVideointelligenceV1VideoAnnotationProgress);
     });
@@ -9759,9 +9802,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1VideoAnnotationResults', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1VideoAnnotationResults();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1VideoAnnotationResults.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1VideoAnnotationResults(
           od as api.GoogleCloudVideointelligenceV1VideoAnnotationResults);
     });
@@ -9770,8 +9814,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1VideoContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1VideoContext();
-      var od =
-          api.GoogleCloudVideointelligenceV1VideoContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1VideoContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1VideoContext(
           od as api.GoogleCloudVideointelligenceV1VideoContext);
     });
@@ -9780,8 +9825,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1VideoSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1VideoSegment();
-      var od =
-          api.GoogleCloudVideointelligenceV1VideoSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1VideoSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1VideoSegment(
           od as api.GoogleCloudVideointelligenceV1VideoSegment);
     });
@@ -9790,7 +9836,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1WordInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1WordInfo();
-      var od = api.GoogleCloudVideointelligenceV1WordInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1WordInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1WordInfo(
           od as api.GoogleCloudVideointelligenceV1WordInfo);
     });
@@ -9801,9 +9849,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2AnnotateVideoProgress();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1beta2AnnotateVideoProgress.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2AnnotateVideoProgress(
           od as api.GoogleCloudVideointelligenceV1beta2AnnotateVideoProgress);
     });
@@ -9814,9 +9863,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2AnnotateVideoResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1beta2AnnotateVideoResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2AnnotateVideoResponse(
           od as api.GoogleCloudVideointelligenceV1beta2AnnotateVideoResponse);
     });
@@ -9826,9 +9876,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1beta2DetectedAttribute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2DetectedAttribute();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1beta2DetectedAttribute.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(
           od as api.GoogleCloudVideointelligenceV1beta2DetectedAttribute);
     });
@@ -9838,8 +9889,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1beta2DetectedLandmark', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2DetectedLandmark();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2DetectedLandmark.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2DetectedLandmark(
           od as api.GoogleCloudVideointelligenceV1beta2DetectedLandmark);
     });
@@ -9848,8 +9900,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1beta2Entity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2Entity();
-      var od =
-          api.GoogleCloudVideointelligenceV1beta2Entity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1beta2Entity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2Entity(
           od as api.GoogleCloudVideointelligenceV1beta2Entity);
     });
@@ -9861,8 +9914,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation(od
           as api.GoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation);
     });
@@ -9872,9 +9926,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1beta2ExplicitContentFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2ExplicitContentFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1beta2ExplicitContentFrame.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2ExplicitContentFrame(
           od as api.GoogleCloudVideointelligenceV1beta2ExplicitContentFrame);
     });
@@ -9884,8 +9939,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2FaceAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2FaceAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2FaceAnnotation(
           od as api.GoogleCloudVideointelligenceV1beta2FaceAnnotation);
     });
@@ -9896,8 +9952,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2FaceDetectionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2FaceDetectionAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2FaceDetectionAnnotation(
           od as api.GoogleCloudVideointelligenceV1beta2FaceDetectionAnnotation);
     });
@@ -9906,8 +9963,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1beta2FaceFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2FaceFrame();
-      var od =
-          api.GoogleCloudVideointelligenceV1beta2FaceFrame.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1beta2FaceFrame.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2FaceFrame(
           od as api.GoogleCloudVideointelligenceV1beta2FaceFrame);
     });
@@ -9917,8 +9975,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2FaceSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2FaceSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2FaceSegment(
           od as api.GoogleCloudVideointelligenceV1beta2FaceSegment);
     });
@@ -9928,8 +9987,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1beta2LabelAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2LabelAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2LabelAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
           od as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
     });
@@ -9939,8 +9999,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2LabelFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2LabelFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2LabelFrame(
           od as api.GoogleCloudVideointelligenceV1beta2LabelFrame);
     });
@@ -9950,8 +10011,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2LabelSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2LabelSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2LabelSegment(
           od as api.GoogleCloudVideointelligenceV1beta2LabelSegment);
     });
@@ -9963,8 +10025,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation(od
           as api.GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation);
     });
@@ -9975,9 +10038,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2NormalizedBoundingBox();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingBox.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2NormalizedBoundingBox(
           od as api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingBox);
     });
@@ -9988,8 +10052,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly(
           od as api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly);
     });
@@ -9999,8 +10064,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1beta2NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2NormalizedVertex();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2NormalizedVertex.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2NormalizedVertex(
           od as api.GoogleCloudVideointelligenceV1beta2NormalizedVertex);
     });
@@ -10012,8 +10078,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation(od
           as api.GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation);
     });
@@ -10023,9 +10090,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1beta2ObjectTrackingFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1beta2ObjectTrackingFrame.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame(
           od as api.GoogleCloudVideointelligenceV1beta2ObjectTrackingFrame);
     });
@@ -10037,8 +10105,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1beta2PersonDetectionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2PersonDetectionAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2PersonDetectionAnnotation(od
           as api.GoogleCloudVideointelligenceV1beta2PersonDetectionAnnotation);
     });
@@ -10050,9 +10119,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative(od
           as api
               .GoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative);
@@ -10063,9 +10133,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1beta2SpeechTranscription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2SpeechTranscription();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1beta2SpeechTranscription.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2SpeechTranscription(
           od as api.GoogleCloudVideointelligenceV1beta2SpeechTranscription);
     });
@@ -10075,8 +10146,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2TextAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2TextAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2TextAnnotation(
           od as api.GoogleCloudVideointelligenceV1beta2TextAnnotation);
     });
@@ -10085,8 +10157,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1beta2TextFrame', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2TextFrame();
-      var od =
-          api.GoogleCloudVideointelligenceV1beta2TextFrame.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1beta2TextFrame.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2TextFrame(
           od as api.GoogleCloudVideointelligenceV1beta2TextFrame);
     });
@@ -10096,8 +10169,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2TextSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2TextSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2TextSegment(
           od as api.GoogleCloudVideointelligenceV1beta2TextSegment);
     });
@@ -10107,9 +10181,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1beta2TimestampedObject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2TimestampedObject();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1beta2TimestampedObject.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2TimestampedObject(
           od as api.GoogleCloudVideointelligenceV1beta2TimestampedObject);
     });
@@ -10118,8 +10193,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1beta2Track', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2Track();
-      var od =
-          api.GoogleCloudVideointelligenceV1beta2Track.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1beta2Track.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2Track(
           od as api.GoogleCloudVideointelligenceV1beta2Track);
     });
@@ -10130,8 +10206,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2VideoAnnotationProgress();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2VideoAnnotationProgress
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2VideoAnnotationProgress(
           od as api.GoogleCloudVideointelligenceV1beta2VideoAnnotationProgress);
     });
@@ -10142,8 +10219,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2VideoAnnotationResults();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2VideoAnnotationResults
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2VideoAnnotationResults(
           od as api.GoogleCloudVideointelligenceV1beta2VideoAnnotationResults);
     });
@@ -10153,8 +10231,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2VideoSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2VideoSegment(
           od as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
     });
@@ -10163,8 +10242,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1beta2WordInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1beta2WordInfo();
-      var od =
-          api.GoogleCloudVideointelligenceV1beta2WordInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1beta2WordInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1beta2WordInfo(
           od as api.GoogleCloudVideointelligenceV1beta2WordInfo);
     });
@@ -10175,8 +10255,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1AnnotateVideoProgress();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1AnnotateVideoProgress
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1AnnotateVideoProgress(
           od as api.GoogleCloudVideointelligenceV1p1beta1AnnotateVideoProgress);
     });
@@ -10187,8 +10268,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1AnnotateVideoResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1AnnotateVideoResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1AnnotateVideoResponse(
           od as api.GoogleCloudVideointelligenceV1p1beta1AnnotateVideoResponse);
     });
@@ -10198,9 +10280,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p1beta1DetectedAttribute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1DetectedAttribute();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1DetectedAttribute.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(
           od as api.GoogleCloudVideointelligenceV1p1beta1DetectedAttribute);
     });
@@ -10210,9 +10293,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p1beta1DetectedLandmark', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1DetectedLandmark();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1DetectedLandmark.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1DetectedLandmark(
           od as api.GoogleCloudVideointelligenceV1p1beta1DetectedLandmark);
     });
@@ -10221,8 +10305,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1p1beta1Entity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1Entity();
-      var od =
-          api.GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1Entity(
           od as api.GoogleCloudVideointelligenceV1p1beta1Entity);
     });
@@ -10234,9 +10319,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation(od
           as api
               .GoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation);
@@ -10248,8 +10334,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame(
           od as api.GoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame);
     });
@@ -10259,8 +10346,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1p1beta1FaceAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1FaceAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1FaceAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1FaceAnnotation(
           od as api.GoogleCloudVideointelligenceV1p1beta1FaceAnnotation);
     });
@@ -10272,8 +10360,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p1beta1FaceDetectionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1FaceDetectionAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1FaceDetectionAnnotation(od
           as api.GoogleCloudVideointelligenceV1p1beta1FaceDetectionAnnotation);
     });
@@ -10283,8 +10372,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1FaceFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1FaceFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1FaceFrame(
           od as api.GoogleCloudVideointelligenceV1p1beta1FaceFrame);
     });
@@ -10294,8 +10384,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1FaceSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1FaceSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1FaceSegment(
           od as api.GoogleCloudVideointelligenceV1p1beta1FaceSegment);
     });
@@ -10305,9 +10396,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p1beta1LabelAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1LabelAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
           od as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
     });
@@ -10317,8 +10409,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1LabelFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1LabelFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1LabelFrame(
           od as api.GoogleCloudVideointelligenceV1p1beta1LabelFrame);
     });
@@ -10328,8 +10421,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1LabelSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1LabelSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1LabelSegment(
           od as api.GoogleCloudVideointelligenceV1p1beta1LabelSegment);
     });
@@ -10341,9 +10435,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation(od
           as api
               .GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation);
@@ -10355,8 +10450,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox(
           od as api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox);
     });
@@ -10368,8 +10464,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly(od
           as api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly);
     });
@@ -10379,9 +10476,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p1beta1NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1NormalizedVertex();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1NormalizedVertex.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1NormalizedVertex(
           od as api.GoogleCloudVideointelligenceV1p1beta1NormalizedVertex);
     });
@@ -10393,8 +10491,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation(od
           as api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation);
     });
@@ -10405,9 +10504,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame(
           od as api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame);
     });
@@ -10419,9 +10519,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p1beta1PersonDetectionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1PersonDetectionAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1PersonDetectionAnnotation(od
           as api
               .GoogleCloudVideointelligenceV1p1beta1PersonDetectionAnnotation);
@@ -10434,9 +10535,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative(od
           as api
               .GoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative);
@@ -10448,9 +10550,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1SpeechTranscription();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1SpeechTranscription.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1SpeechTranscription(
           od as api.GoogleCloudVideointelligenceV1p1beta1SpeechTranscription);
     });
@@ -10460,8 +10563,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1p1beta1TextAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1TextAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1TextAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1TextAnnotation(
           od as api.GoogleCloudVideointelligenceV1p1beta1TextAnnotation);
     });
@@ -10471,8 +10575,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1TextFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1TextFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1TextFrame(
           od as api.GoogleCloudVideointelligenceV1p1beta1TextFrame);
     });
@@ -10482,8 +10587,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1TextSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1TextSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1TextSegment(
           od as api.GoogleCloudVideointelligenceV1p1beta1TextSegment);
     });
@@ -10493,9 +10599,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p1beta1TimestampedObject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1TimestampedObject();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1TimestampedObject.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1TimestampedObject(
           od as api.GoogleCloudVideointelligenceV1p1beta1TimestampedObject);
     });
@@ -10504,8 +10611,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1p1beta1Track', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1Track();
-      var od =
-          api.GoogleCloudVideointelligenceV1p1beta1Track.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1p1beta1Track.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1Track(
           od as api.GoogleCloudVideointelligenceV1p1beta1Track);
     });
@@ -10517,8 +10625,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress(od
           as api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress);
     });
@@ -10530,8 +10639,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults(od
           as api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults);
     });
@@ -10541,8 +10651,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1VideoSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
           od as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
     });
@@ -10552,8 +10663,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p1beta1WordInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p1beta1WordInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p1beta1WordInfo(
           od as api.GoogleCloudVideointelligenceV1p1beta1WordInfo);
     });
@@ -10564,8 +10676,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1AnnotateVideoProgress();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1AnnotateVideoProgress
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1AnnotateVideoProgress(
           od as api.GoogleCloudVideointelligenceV1p2beta1AnnotateVideoProgress);
     });
@@ -10576,8 +10689,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1AnnotateVideoResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1AnnotateVideoResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1AnnotateVideoResponse(
           od as api.GoogleCloudVideointelligenceV1p2beta1AnnotateVideoResponse);
     });
@@ -10587,9 +10701,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p2beta1DetectedAttribute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1DetectedAttribute();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1DetectedAttribute.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(
           od as api.GoogleCloudVideointelligenceV1p2beta1DetectedAttribute);
     });
@@ -10599,9 +10714,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p2beta1DetectedLandmark', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1DetectedLandmark();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1DetectedLandmark.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1DetectedLandmark(
           od as api.GoogleCloudVideointelligenceV1p2beta1DetectedLandmark);
     });
@@ -10610,8 +10726,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1p2beta1Entity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1Entity();
-      var od =
-          api.GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1Entity(
           od as api.GoogleCloudVideointelligenceV1p2beta1Entity);
     });
@@ -10623,9 +10740,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation(od
           as api
               .GoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation);
@@ -10637,8 +10755,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame(
           od as api.GoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame);
     });
@@ -10648,8 +10767,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1p2beta1FaceAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1FaceAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1FaceAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1FaceAnnotation(
           od as api.GoogleCloudVideointelligenceV1p2beta1FaceAnnotation);
     });
@@ -10661,8 +10781,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p2beta1FaceDetectionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1FaceDetectionAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1FaceDetectionAnnotation(od
           as api.GoogleCloudVideointelligenceV1p2beta1FaceDetectionAnnotation);
     });
@@ -10672,8 +10793,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1FaceFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1FaceFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1FaceFrame(
           od as api.GoogleCloudVideointelligenceV1p2beta1FaceFrame);
     });
@@ -10683,8 +10805,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1FaceSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1FaceSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1FaceSegment(
           od as api.GoogleCloudVideointelligenceV1p2beta1FaceSegment);
     });
@@ -10694,9 +10817,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p2beta1LabelAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1LabelAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
           od as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
     });
@@ -10706,8 +10830,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1LabelFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1LabelFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1LabelFrame(
           od as api.GoogleCloudVideointelligenceV1p2beta1LabelFrame);
     });
@@ -10717,8 +10842,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1LabelSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1LabelSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1LabelSegment(
           od as api.GoogleCloudVideointelligenceV1p2beta1LabelSegment);
     });
@@ -10730,9 +10856,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation(od
           as api
               .GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation);
@@ -10744,8 +10871,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox(
           od as api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox);
     });
@@ -10757,8 +10885,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly(od
           as api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly);
     });
@@ -10768,9 +10897,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p2beta1NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1NormalizedVertex();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1NormalizedVertex.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1NormalizedVertex(
           od as api.GoogleCloudVideointelligenceV1p2beta1NormalizedVertex);
     });
@@ -10782,8 +10912,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation(od
           as api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation);
     });
@@ -10794,9 +10925,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame(
           od as api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame);
     });
@@ -10808,9 +10940,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p2beta1PersonDetectionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1PersonDetectionAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1PersonDetectionAnnotation(od
           as api
               .GoogleCloudVideointelligenceV1p2beta1PersonDetectionAnnotation);
@@ -10823,9 +10956,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative(od
           as api
               .GoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative);
@@ -10837,9 +10971,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1SpeechTranscription();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1SpeechTranscription.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1SpeechTranscription(
           od as api.GoogleCloudVideointelligenceV1p2beta1SpeechTranscription);
     });
@@ -10849,8 +10984,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1p2beta1TextAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1TextAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1TextAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1TextAnnotation(
           od as api.GoogleCloudVideointelligenceV1p2beta1TextAnnotation);
     });
@@ -10860,8 +10996,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1TextFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1TextFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1TextFrame(
           od as api.GoogleCloudVideointelligenceV1p2beta1TextFrame);
     });
@@ -10871,8 +11008,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1TextSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1TextSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1TextSegment(
           od as api.GoogleCloudVideointelligenceV1p2beta1TextSegment);
     });
@@ -10882,9 +11020,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p2beta1TimestampedObject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1TimestampedObject();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1TimestampedObject.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1TimestampedObject(
           od as api.GoogleCloudVideointelligenceV1p2beta1TimestampedObject);
     });
@@ -10893,8 +11032,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1p2beta1Track', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1Track();
-      var od =
-          api.GoogleCloudVideointelligenceV1p2beta1Track.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1p2beta1Track.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1Track(
           od as api.GoogleCloudVideointelligenceV1p2beta1Track);
     });
@@ -10906,8 +11046,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress(od
           as api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress);
     });
@@ -10919,8 +11060,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults(od
           as api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults);
     });
@@ -10930,8 +11072,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1VideoSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
           od as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
     });
@@ -10941,8 +11084,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p2beta1WordInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p2beta1WordInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p2beta1WordInfo(
           od as api.GoogleCloudVideointelligenceV1p2beta1WordInfo);
     });
@@ -10953,8 +11097,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1AnnotateVideoProgress();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1AnnotateVideoProgress
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1AnnotateVideoProgress(
           od as api.GoogleCloudVideointelligenceV1p3beta1AnnotateVideoProgress);
     });
@@ -10965,8 +11110,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1AnnotateVideoResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1AnnotateVideoResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1AnnotateVideoResponse(
           od as api.GoogleCloudVideointelligenceV1p3beta1AnnotateVideoResponse);
     });
@@ -10976,8 +11122,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1Celebrity();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1Celebrity.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1Celebrity(
           od as api.GoogleCloudVideointelligenceV1p3beta1Celebrity);
     });
@@ -10989,9 +11136,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1CelebrityRecognitionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1CelebrityRecognitionAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1CelebrityRecognitionAnnotation(
           od as api
               .GoogleCloudVideointelligenceV1p3beta1CelebrityRecognitionAnnotation);
@@ -11002,8 +11150,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1p3beta1CelebrityTrack', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1CelebrityTrack();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1CelebrityTrack.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1CelebrityTrack(
           od as api.GoogleCloudVideointelligenceV1p3beta1CelebrityTrack);
     });
@@ -11013,9 +11162,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p3beta1DetectedAttribute', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1DetectedAttribute();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1DetectedAttribute.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(
           od as api.GoogleCloudVideointelligenceV1p3beta1DetectedAttribute);
     });
@@ -11025,9 +11175,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p3beta1DetectedLandmark', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1DetectedLandmark();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1DetectedLandmark.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1DetectedLandmark(
           od as api.GoogleCloudVideointelligenceV1p3beta1DetectedLandmark);
     });
@@ -11036,8 +11187,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1p3beta1Entity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1Entity();
-      var od =
-          api.GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1Entity(
           od as api.GoogleCloudVideointelligenceV1p3beta1Entity);
     });
@@ -11049,9 +11201,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation(od
           as api
               .GoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation);
@@ -11063,8 +11216,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame(
           od as api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame);
     });
@@ -11074,8 +11228,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1p3beta1FaceAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1FaceAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1FaceAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1FaceAnnotation(
           od as api.GoogleCloudVideointelligenceV1p3beta1FaceAnnotation);
     });
@@ -11087,8 +11242,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation(od
           as api.GoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation);
     });
@@ -11098,8 +11254,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1FaceFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1FaceFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1FaceFrame(
           od as api.GoogleCloudVideointelligenceV1p3beta1FaceFrame);
     });
@@ -11109,8 +11266,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1FaceSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1FaceSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1FaceSegment(
           od as api.GoogleCloudVideointelligenceV1p3beta1FaceSegment);
     });
@@ -11120,9 +11278,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p3beta1LabelAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1LabelAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
           od as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
     });
@@ -11132,8 +11291,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1LabelFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1LabelFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1LabelFrame(
           od as api.GoogleCloudVideointelligenceV1p3beta1LabelFrame);
     });
@@ -11143,8 +11303,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1LabelSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1LabelSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1LabelSegment(
           od as api.GoogleCloudVideointelligenceV1p3beta1LabelSegment);
     });
@@ -11156,9 +11317,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation(od
           as api
               .GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation);
@@ -11170,8 +11332,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox(
           od as api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox);
     });
@@ -11183,8 +11346,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly(od
           as api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly);
     });
@@ -11194,9 +11358,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p3beta1NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1NormalizedVertex();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1NormalizedVertex.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1NormalizedVertex(
           od as api.GoogleCloudVideointelligenceV1p3beta1NormalizedVertex);
     });
@@ -11208,8 +11373,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(od
           as api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation);
     });
@@ -11220,9 +11386,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame(
           od as api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame);
     });
@@ -11234,9 +11401,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation(od
           as api
               .GoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation);
@@ -11248,9 +11416,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity(
           od as api.GoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity);
     });
@@ -11262,9 +11431,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative(od
           as api
               .GoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative);
@@ -11276,9 +11446,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1SpeechTranscription();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1SpeechTranscription.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1SpeechTranscription(
           od as api.GoogleCloudVideointelligenceV1p3beta1SpeechTranscription);
     });
@@ -11290,9 +11461,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1StreamingAnnotateVideoResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1StreamingAnnotateVideoResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1StreamingAnnotateVideoResponse(
           od as api
               .GoogleCloudVideointelligenceV1p3beta1StreamingAnnotateVideoResponse);
@@ -11305,9 +11477,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults(
           od as api
               .GoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults);
@@ -11318,8 +11491,9 @@
       'obj-schema-GoogleCloudVideointelligenceV1p3beta1TextAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1TextAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1TextAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1TextAnnotation(
           od as api.GoogleCloudVideointelligenceV1p3beta1TextAnnotation);
     });
@@ -11329,8 +11503,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1TextFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1TextFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1TextFrame(
           od as api.GoogleCloudVideointelligenceV1p3beta1TextFrame);
     });
@@ -11340,8 +11515,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1TextSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1TextSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1TextSegment(
           od as api.GoogleCloudVideointelligenceV1p3beta1TextSegment);
     });
@@ -11351,9 +11527,10 @@
       'obj-schema-GoogleCloudVideointelligenceV1p3beta1TimestampedObject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1TimestampedObject();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1TimestampedObject.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1TimestampedObject(
           od as api.GoogleCloudVideointelligenceV1p3beta1TimestampedObject);
     });
@@ -11362,8 +11539,9 @@
   unittest.group('obj-schema-GoogleCloudVideointelligenceV1p3beta1Track', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1Track();
-      var od =
-          api.GoogleCloudVideointelligenceV1p3beta1Track.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVideointelligenceV1p3beta1Track.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1Track(
           od as api.GoogleCloudVideointelligenceV1p3beta1Track);
     });
@@ -11375,8 +11553,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress(od
           as api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress);
     });
@@ -11388,8 +11567,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults(od
           as api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults);
     });
@@ -11399,8 +11579,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1VideoSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
           od as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
     });
@@ -11410,8 +11591,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVideointelligenceV1p3beta1WordInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVideointelligenceV1p3beta1WordInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVideointelligenceV1p3beta1WordInfo(
           od as api.GoogleCloudVideointelligenceV1p3beta1WordInfo);
     });
@@ -11420,7 +11602,9 @@
   unittest.group('obj-schema-GoogleLongrunningCancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningCancelOperationRequest();
-      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningCancelOperationRequest(
           od as api.GoogleLongrunningCancelOperationRequest);
     });
@@ -11429,7 +11613,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -11438,7 +11624,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -11446,7 +11634,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -11454,7 +11644,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
diff --git a/generated/googleapis/test/vision/v1_test.dart b/generated/googleapis/test/vision/v1_test.dart
index 08bf9dc..840c592 100644
--- a/generated/googleapis/test/vision/v1_test.dart
+++ b/generated/googleapis/test/vision/v1_test.dart
@@ -11912,7 +11912,9 @@
   unittest.group('obj-schema-AddProductToProductSetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddProductToProductSetRequest();
-      var od = api.AddProductToProductSetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddProductToProductSetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddProductToProductSetRequest(
           od as api.AddProductToProductSetRequest);
     });
@@ -11921,7 +11923,9 @@
   unittest.group('obj-schema-AnnotateFileRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotateFileRequest();
-      var od = api.AnnotateFileRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotateFileRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotateFileRequest(od as api.AnnotateFileRequest);
     });
   });
@@ -11929,7 +11933,9 @@
   unittest.group('obj-schema-AnnotateFileResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotateFileResponse();
-      var od = api.AnnotateFileResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotateFileResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotateFileResponse(od as api.AnnotateFileResponse);
     });
   });
@@ -11937,7 +11943,9 @@
   unittest.group('obj-schema-AnnotateImageRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotateImageRequest();
-      var od = api.AnnotateImageRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotateImageRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotateImageRequest(od as api.AnnotateImageRequest);
     });
   });
@@ -11945,7 +11953,9 @@
   unittest.group('obj-schema-AnnotateImageResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnnotateImageResponse();
-      var od = api.AnnotateImageResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnnotateImageResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnnotateImageResponse(od as api.AnnotateImageResponse);
     });
   });
@@ -11953,7 +11963,9 @@
   unittest.group('obj-schema-AsyncAnnotateFileRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsyncAnnotateFileRequest();
-      var od = api.AsyncAnnotateFileRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AsyncAnnotateFileRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAsyncAnnotateFileRequest(od as api.AsyncAnnotateFileRequest);
     });
   });
@@ -11961,7 +11973,9 @@
   unittest.group('obj-schema-AsyncAnnotateFileResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsyncAnnotateFileResponse();
-      var od = api.AsyncAnnotateFileResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AsyncAnnotateFileResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAsyncAnnotateFileResponse(od as api.AsyncAnnotateFileResponse);
     });
   });
@@ -11969,7 +11983,9 @@
   unittest.group('obj-schema-AsyncBatchAnnotateFilesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsyncBatchAnnotateFilesRequest();
-      var od = api.AsyncBatchAnnotateFilesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AsyncBatchAnnotateFilesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAsyncBatchAnnotateFilesRequest(
           od as api.AsyncBatchAnnotateFilesRequest);
     });
@@ -11978,7 +11994,9 @@
   unittest.group('obj-schema-AsyncBatchAnnotateFilesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsyncBatchAnnotateFilesResponse();
-      var od = api.AsyncBatchAnnotateFilesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AsyncBatchAnnotateFilesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAsyncBatchAnnotateFilesResponse(
           od as api.AsyncBatchAnnotateFilesResponse);
     });
@@ -11987,7 +12005,9 @@
   unittest.group('obj-schema-AsyncBatchAnnotateImagesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsyncBatchAnnotateImagesRequest();
-      var od = api.AsyncBatchAnnotateImagesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AsyncBatchAnnotateImagesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAsyncBatchAnnotateImagesRequest(
           od as api.AsyncBatchAnnotateImagesRequest);
     });
@@ -11996,7 +12016,9 @@
   unittest.group('obj-schema-AsyncBatchAnnotateImagesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAsyncBatchAnnotateImagesResponse();
-      var od = api.AsyncBatchAnnotateImagesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AsyncBatchAnnotateImagesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAsyncBatchAnnotateImagesResponse(
           od as api.AsyncBatchAnnotateImagesResponse);
     });
@@ -12005,7 +12027,9 @@
   unittest.group('obj-schema-BatchAnnotateFilesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchAnnotateFilesRequest();
-      var od = api.BatchAnnotateFilesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchAnnotateFilesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchAnnotateFilesRequest(od as api.BatchAnnotateFilesRequest);
     });
   });
@@ -12013,7 +12037,9 @@
   unittest.group('obj-schema-BatchAnnotateFilesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchAnnotateFilesResponse();
-      var od = api.BatchAnnotateFilesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchAnnotateFilesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchAnnotateFilesResponse(od as api.BatchAnnotateFilesResponse);
     });
   });
@@ -12021,7 +12047,9 @@
   unittest.group('obj-schema-BatchAnnotateImagesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchAnnotateImagesRequest();
-      var od = api.BatchAnnotateImagesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchAnnotateImagesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchAnnotateImagesRequest(od as api.BatchAnnotateImagesRequest);
     });
   });
@@ -12029,7 +12057,9 @@
   unittest.group('obj-schema-BatchAnnotateImagesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchAnnotateImagesResponse();
-      var od = api.BatchAnnotateImagesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchAnnotateImagesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchAnnotateImagesResponse(od as api.BatchAnnotateImagesResponse);
     });
   });
@@ -12037,7 +12067,9 @@
   unittest.group('obj-schema-BatchOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchOperationMetadata();
-      var od = api.BatchOperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchOperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchOperationMetadata(od as api.BatchOperationMetadata);
     });
   });
@@ -12045,7 +12077,8 @@
   unittest.group('obj-schema-Block', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlock();
-      var od = api.Block.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Block.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBlock(od as api.Block);
     });
   });
@@ -12053,7 +12086,9 @@
   unittest.group('obj-schema-BoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBoundingPoly();
-      var od = api.BoundingPoly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BoundingPoly.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBoundingPoly(od as api.BoundingPoly);
     });
   });
@@ -12061,7 +12096,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -12069,7 +12106,8 @@
   unittest.group('obj-schema-Color', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColor();
-      var od = api.Color.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Color.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColor(od as api.Color);
     });
   });
@@ -12077,7 +12115,9 @@
   unittest.group('obj-schema-ColorInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColorInfo();
-      var od = api.ColorInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ColorInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColorInfo(od as api.ColorInfo);
     });
   });
@@ -12085,7 +12125,9 @@
   unittest.group('obj-schema-CropHint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCropHint();
-      var od = api.CropHint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CropHint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCropHint(od as api.CropHint);
     });
   });
@@ -12093,7 +12135,9 @@
   unittest.group('obj-schema-CropHintsAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCropHintsAnnotation();
-      var od = api.CropHintsAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CropHintsAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCropHintsAnnotation(od as api.CropHintsAnnotation);
     });
   });
@@ -12101,7 +12145,9 @@
   unittest.group('obj-schema-CropHintsParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCropHintsParams();
-      var od = api.CropHintsParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CropHintsParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCropHintsParams(od as api.CropHintsParams);
     });
   });
@@ -12109,7 +12155,9 @@
   unittest.group('obj-schema-DetectedBreak', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDetectedBreak();
-      var od = api.DetectedBreak.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DetectedBreak.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDetectedBreak(od as api.DetectedBreak);
     });
   });
@@ -12117,7 +12165,9 @@
   unittest.group('obj-schema-DetectedLanguage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDetectedLanguage();
-      var od = api.DetectedLanguage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DetectedLanguage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDetectedLanguage(od as api.DetectedLanguage);
     });
   });
@@ -12125,7 +12175,9 @@
   unittest.group('obj-schema-DominantColorsAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDominantColorsAnnotation();
-      var od = api.DominantColorsAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DominantColorsAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDominantColorsAnnotation(od as api.DominantColorsAnnotation);
     });
   });
@@ -12133,7 +12185,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -12141,7 +12194,9 @@
   unittest.group('obj-schema-EntityAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntityAnnotation();
-      var od = api.EntityAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EntityAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEntityAnnotation(od as api.EntityAnnotation);
     });
   });
@@ -12149,7 +12204,9 @@
   unittest.group('obj-schema-FaceAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFaceAnnotation();
-      var od = api.FaceAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FaceAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFaceAnnotation(od as api.FaceAnnotation);
     });
   });
@@ -12157,7 +12214,9 @@
   unittest.group('obj-schema-Feature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFeature();
-      var od = api.Feature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Feature.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFeature(od as api.Feature);
     });
   });
@@ -12165,7 +12224,9 @@
   unittest.group('obj-schema-GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcsDestination();
-      var od = api.GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGcsDestination(od as api.GcsDestination);
     });
   });
@@ -12173,7 +12234,9 @@
   unittest.group('obj-schema-GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGcsSource();
-      var od = api.GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GcsSource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGcsSource(od as api.GcsSource);
     });
   });
@@ -12182,8 +12245,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1AnnotateFileResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1AnnotateFileResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1AnnotateFileResponse(
           od as api.GoogleCloudVisionV1p1beta1AnnotateFileResponse);
     });
@@ -12193,8 +12257,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1AnnotateImageResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1AnnotateImageResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1AnnotateImageResponse(
           od as api.GoogleCloudVisionV1p1beta1AnnotateImageResponse);
     });
@@ -12204,8 +12269,9 @@
       'obj-schema-GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse(
           od as api.GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse);
     });
@@ -12216,8 +12282,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1AsyncBatchAnnotateFilesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1AsyncBatchAnnotateFilesResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1AsyncBatchAnnotateFilesResponse(
           od as api.GoogleCloudVisionV1p1beta1AsyncBatchAnnotateFilesResponse);
     });
@@ -12226,7 +12293,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1Block', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1Block();
-      var od = api.GoogleCloudVisionV1p1beta1Block.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1Block.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1Block(
           od as api.GoogleCloudVisionV1p1beta1Block);
     });
@@ -12235,7 +12304,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1BoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1BoundingPoly();
-      var od = api.GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1BoundingPoly(
           od as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     });
@@ -12244,7 +12315,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1ColorInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1ColorInfo();
-      var od = api.GoogleCloudVisionV1p1beta1ColorInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1ColorInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1ColorInfo(
           od as api.GoogleCloudVisionV1p1beta1ColorInfo);
     });
@@ -12253,7 +12326,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1CropHint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1CropHint();
-      var od = api.GoogleCloudVisionV1p1beta1CropHint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1CropHint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1CropHint(
           od as api.GoogleCloudVisionV1p1beta1CropHint);
     });
@@ -12263,8 +12338,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1CropHintsAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1CropHintsAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1CropHintsAnnotation(
           od as api.GoogleCloudVisionV1p1beta1CropHintsAnnotation);
     });
@@ -12274,8 +12350,9 @@
       'obj-schema-GoogleCloudVisionV1p1beta1DominantColorsAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1DominantColorsAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1DominantColorsAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1DominantColorsAnnotation(
           od as api.GoogleCloudVisionV1p1beta1DominantColorsAnnotation);
     });
@@ -12284,8 +12361,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1EntityAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1EntityAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1EntityAnnotation(
           od as api.GoogleCloudVisionV1p1beta1EntityAnnotation);
     });
@@ -12294,8 +12372,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1FaceAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1FaceAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p1beta1FaceAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1FaceAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1FaceAnnotation(
           od as api.GoogleCloudVisionV1p1beta1FaceAnnotation);
     });
@@ -12305,8 +12384,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1FaceAnnotationLandmark();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1FaceAnnotationLandmark.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1FaceAnnotationLandmark(
           od as api.GoogleCloudVisionV1p1beta1FaceAnnotationLandmark);
     });
@@ -12315,8 +12395,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1GcsDestination();
-      var od =
-          api.GoogleCloudVisionV1p1beta1GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1GcsDestination(
           od as api.GoogleCloudVisionV1p1beta1GcsDestination);
     });
@@ -12325,7 +12406,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1GcsSource();
-      var od = api.GoogleCloudVisionV1p1beta1GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1GcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1GcsSource(
           od as api.GoogleCloudVisionV1p1beta1GcsSource);
     });
@@ -12335,8 +12418,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1ImageAnnotationContext();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1ImageAnnotationContext.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1ImageAnnotationContext(
           od as api.GoogleCloudVisionV1p1beta1ImageAnnotationContext);
     });
@@ -12345,8 +12429,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1ImageProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1ImageProperties();
-      var od =
-          api.GoogleCloudVisionV1p1beta1ImageProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1ImageProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1ImageProperties(
           od as api.GoogleCloudVisionV1p1beta1ImageProperties);
     });
@@ -12355,7 +12440,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1InputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1InputConfig();
-      var od = api.GoogleCloudVisionV1p1beta1InputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1InputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1InputConfig(
           od as api.GoogleCloudVisionV1p1beta1InputConfig);
     });
@@ -12365,8 +12452,9 @@
       'obj-schema-GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation(
           od as api.GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation);
     });
@@ -12375,7 +12463,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1LocationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1LocationInfo();
-      var od = api.GoogleCloudVisionV1p1beta1LocationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1LocationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1LocationInfo(
           od as api.GoogleCloudVisionV1p1beta1LocationInfo);
     });
@@ -12384,8 +12474,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1NormalizedVertex();
-      var od =
-          api.GoogleCloudVisionV1p1beta1NormalizedVertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1NormalizedVertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1NormalizedVertex(
           od as api.GoogleCloudVisionV1p1beta1NormalizedVertex);
     });
@@ -12394,8 +12485,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1OperationMetadata();
-      var od =
-          api.GoogleCloudVisionV1p1beta1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1OperationMetadata(
           od as api.GoogleCloudVisionV1p1beta1OperationMetadata);
     });
@@ -12404,7 +12496,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1OutputConfig();
-      var od = api.GoogleCloudVisionV1p1beta1OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1OutputConfig(
           od as api.GoogleCloudVisionV1p1beta1OutputConfig);
     });
@@ -12413,7 +12507,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1Page();
-      var od = api.GoogleCloudVisionV1p1beta1Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1Page.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1Page(
           od as api.GoogleCloudVisionV1p1beta1Page);
     });
@@ -12422,7 +12518,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1Paragraph', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1Paragraph();
-      var od = api.GoogleCloudVisionV1p1beta1Paragraph.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1Paragraph.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1Paragraph(
           od as api.GoogleCloudVisionV1p1beta1Paragraph);
     });
@@ -12431,7 +12529,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1Position', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1Position();
-      var od = api.GoogleCloudVisionV1p1beta1Position.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1Position.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1Position(
           od as api.GoogleCloudVisionV1p1beta1Position);
     });
@@ -12440,7 +12540,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1Product();
-      var od = api.GoogleCloudVisionV1p1beta1Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1Product.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1Product(
           od as api.GoogleCloudVisionV1p1beta1Product);
     });
@@ -12449,8 +12551,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1ProductKeyValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1ProductKeyValue();
-      var od =
-          api.GoogleCloudVisionV1p1beta1ProductKeyValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1ProductKeyValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1ProductKeyValue(
           od as api.GoogleCloudVisionV1p1beta1ProductKeyValue);
     });
@@ -12460,8 +12563,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1ProductSearchResults();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1ProductSearchResults.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1ProductSearchResults(
           od as api.GoogleCloudVisionV1p1beta1ProductSearchResults);
     });
@@ -12473,8 +12577,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult(od
           as api.GoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult);
     });
@@ -12486,9 +12591,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation(od
           as api
               .GoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation);
@@ -12499,9 +12605,10 @@
       'obj-schema-GoogleCloudVisionV1p1beta1ProductSearchResultsResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1ProductSearchResultsResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(
           od as api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult);
     });
@@ -12510,7 +12617,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1Property', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1Property();
-      var od = api.GoogleCloudVisionV1p1beta1Property.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1Property.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1Property(
           od as api.GoogleCloudVisionV1p1beta1Property);
     });
@@ -12520,8 +12629,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1SafeSearchAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1SafeSearchAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1SafeSearchAnnotation(
           od as api.GoogleCloudVisionV1p1beta1SafeSearchAnnotation);
     });
@@ -12530,7 +12640,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1Symbol', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1Symbol();
-      var od = api.GoogleCloudVisionV1p1beta1Symbol.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1Symbol.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1Symbol(
           od as api.GoogleCloudVisionV1p1beta1Symbol);
     });
@@ -12539,8 +12651,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1TextAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1TextAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p1beta1TextAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1TextAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1TextAnnotation(
           od as api.GoogleCloudVisionV1p1beta1TextAnnotation);
     });
@@ -12550,9 +12663,10 @@
       'obj-schema-GoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak(
           od as api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak);
     });
@@ -12563,9 +12677,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage(
           od as api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage);
     });
@@ -12575,9 +12690,10 @@
       'obj-schema-GoogleCloudVisionV1p1beta1TextAnnotationTextProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1TextAnnotationTextProperty();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p1beta1TextAnnotationTextProperty.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(
           od as api.GoogleCloudVisionV1p1beta1TextAnnotationTextProperty);
     });
@@ -12586,7 +12702,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1Vertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1Vertex();
-      var od = api.GoogleCloudVisionV1p1beta1Vertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1Vertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1Vertex(
           od as api.GoogleCloudVisionV1p1beta1Vertex);
     });
@@ -12595,7 +12713,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1WebDetection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1WebDetection();
-      var od = api.GoogleCloudVisionV1p1beta1WebDetection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1WebDetection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1WebDetection(
           od as api.GoogleCloudVisionV1p1beta1WebDetection);
     });
@@ -12605,8 +12725,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1WebDetectionWebEntity();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1WebDetectionWebEntity.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1WebDetectionWebEntity(
           od as api.GoogleCloudVisionV1p1beta1WebDetectionWebEntity);
     });
@@ -12616,8 +12737,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1WebDetectionWebImage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
           od as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
     });
@@ -12627,8 +12749,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1WebDetectionWebLabel();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1WebDetectionWebLabel.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1WebDetectionWebLabel(
           od as api.GoogleCloudVisionV1p1beta1WebDetectionWebLabel);
     });
@@ -12638,8 +12761,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1WebDetectionWebPage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p1beta1WebDetectionWebPage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1WebDetectionWebPage(
           od as api.GoogleCloudVisionV1p1beta1WebDetectionWebPage);
     });
@@ -12648,7 +12772,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p1beta1Word', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p1beta1Word();
-      var od = api.GoogleCloudVisionV1p1beta1Word.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p1beta1Word.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p1beta1Word(
           od as api.GoogleCloudVisionV1p1beta1Word);
     });
@@ -12658,8 +12784,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1AnnotateFileResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1AnnotateFileResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1AnnotateFileResponse(
           od as api.GoogleCloudVisionV1p2beta1AnnotateFileResponse);
     });
@@ -12669,8 +12796,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1AnnotateImageResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1AnnotateImageResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1AnnotateImageResponse(
           od as api.GoogleCloudVisionV1p2beta1AnnotateImageResponse);
     });
@@ -12680,8 +12808,9 @@
       'obj-schema-GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse(
           od as api.GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse);
     });
@@ -12692,8 +12821,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1AsyncBatchAnnotateFilesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1AsyncBatchAnnotateFilesResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1AsyncBatchAnnotateFilesResponse(
           od as api.GoogleCloudVisionV1p2beta1AsyncBatchAnnotateFilesResponse);
     });
@@ -12702,7 +12832,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1Block', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1Block();
-      var od = api.GoogleCloudVisionV1p2beta1Block.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1Block.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1Block(
           od as api.GoogleCloudVisionV1p2beta1Block);
     });
@@ -12711,7 +12843,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1BoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1BoundingPoly();
-      var od = api.GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1BoundingPoly(
           od as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     });
@@ -12720,7 +12854,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1ColorInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1ColorInfo();
-      var od = api.GoogleCloudVisionV1p2beta1ColorInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1ColorInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1ColorInfo(
           od as api.GoogleCloudVisionV1p2beta1ColorInfo);
     });
@@ -12729,7 +12865,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1CropHint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1CropHint();
-      var od = api.GoogleCloudVisionV1p2beta1CropHint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1CropHint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1CropHint(
           od as api.GoogleCloudVisionV1p2beta1CropHint);
     });
@@ -12739,8 +12877,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1CropHintsAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1CropHintsAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1CropHintsAnnotation(
           od as api.GoogleCloudVisionV1p2beta1CropHintsAnnotation);
     });
@@ -12750,8 +12889,9 @@
       'obj-schema-GoogleCloudVisionV1p2beta1DominantColorsAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1DominantColorsAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1DominantColorsAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1DominantColorsAnnotation(
           od as api.GoogleCloudVisionV1p2beta1DominantColorsAnnotation);
     });
@@ -12760,8 +12900,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1EntityAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1EntityAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1EntityAnnotation(
           od as api.GoogleCloudVisionV1p2beta1EntityAnnotation);
     });
@@ -12770,8 +12911,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1FaceAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1FaceAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p2beta1FaceAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1FaceAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1FaceAnnotation(
           od as api.GoogleCloudVisionV1p2beta1FaceAnnotation);
     });
@@ -12781,8 +12923,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1FaceAnnotationLandmark();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1FaceAnnotationLandmark.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1FaceAnnotationLandmark(
           od as api.GoogleCloudVisionV1p2beta1FaceAnnotationLandmark);
     });
@@ -12791,8 +12934,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1GcsDestination();
-      var od =
-          api.GoogleCloudVisionV1p2beta1GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1GcsDestination(
           od as api.GoogleCloudVisionV1p2beta1GcsDestination);
     });
@@ -12801,7 +12945,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1GcsSource();
-      var od = api.GoogleCloudVisionV1p2beta1GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1GcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1GcsSource(
           od as api.GoogleCloudVisionV1p2beta1GcsSource);
     });
@@ -12811,8 +12957,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1ImageAnnotationContext();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1ImageAnnotationContext.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1ImageAnnotationContext(
           od as api.GoogleCloudVisionV1p2beta1ImageAnnotationContext);
     });
@@ -12821,8 +12968,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1ImageProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1ImageProperties();
-      var od =
-          api.GoogleCloudVisionV1p2beta1ImageProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1ImageProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1ImageProperties(
           od as api.GoogleCloudVisionV1p2beta1ImageProperties);
     });
@@ -12831,7 +12979,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1InputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1InputConfig();
-      var od = api.GoogleCloudVisionV1p2beta1InputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1InputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1InputConfig(
           od as api.GoogleCloudVisionV1p2beta1InputConfig);
     });
@@ -12841,8 +12991,9 @@
       'obj-schema-GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation(
           od as api.GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation);
     });
@@ -12851,7 +13002,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1LocationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1LocationInfo();
-      var od = api.GoogleCloudVisionV1p2beta1LocationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1LocationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1LocationInfo(
           od as api.GoogleCloudVisionV1p2beta1LocationInfo);
     });
@@ -12860,8 +13013,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1NormalizedVertex();
-      var od =
-          api.GoogleCloudVisionV1p2beta1NormalizedVertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1NormalizedVertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1NormalizedVertex(
           od as api.GoogleCloudVisionV1p2beta1NormalizedVertex);
     });
@@ -12870,8 +13024,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1OperationMetadata();
-      var od =
-          api.GoogleCloudVisionV1p2beta1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1OperationMetadata(
           od as api.GoogleCloudVisionV1p2beta1OperationMetadata);
     });
@@ -12880,7 +13035,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1OutputConfig();
-      var od = api.GoogleCloudVisionV1p2beta1OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1OutputConfig(
           od as api.GoogleCloudVisionV1p2beta1OutputConfig);
     });
@@ -12889,7 +13046,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1Page();
-      var od = api.GoogleCloudVisionV1p2beta1Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1Page.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1Page(
           od as api.GoogleCloudVisionV1p2beta1Page);
     });
@@ -12898,7 +13057,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1Paragraph', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1Paragraph();
-      var od = api.GoogleCloudVisionV1p2beta1Paragraph.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1Paragraph.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1Paragraph(
           od as api.GoogleCloudVisionV1p2beta1Paragraph);
     });
@@ -12907,7 +13068,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1Position', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1Position();
-      var od = api.GoogleCloudVisionV1p2beta1Position.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1Position.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1Position(
           od as api.GoogleCloudVisionV1p2beta1Position);
     });
@@ -12916,7 +13079,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1Product();
-      var od = api.GoogleCloudVisionV1p2beta1Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1Product.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1Product(
           od as api.GoogleCloudVisionV1p2beta1Product);
     });
@@ -12925,8 +13090,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1ProductKeyValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1ProductKeyValue();
-      var od =
-          api.GoogleCloudVisionV1p2beta1ProductKeyValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1ProductKeyValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1ProductKeyValue(
           od as api.GoogleCloudVisionV1p2beta1ProductKeyValue);
     });
@@ -12936,8 +13102,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1ProductSearchResults();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1ProductSearchResults.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1ProductSearchResults(
           od as api.GoogleCloudVisionV1p2beta1ProductSearchResults);
     });
@@ -12949,8 +13116,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult(od
           as api.GoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult);
     });
@@ -12962,9 +13130,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation(od
           as api
               .GoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation);
@@ -12975,9 +13144,10 @@
       'obj-schema-GoogleCloudVisionV1p2beta1ProductSearchResultsResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1ProductSearchResultsResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(
           od as api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult);
     });
@@ -12986,7 +13156,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1Property', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1Property();
-      var od = api.GoogleCloudVisionV1p2beta1Property.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1Property.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1Property(
           od as api.GoogleCloudVisionV1p2beta1Property);
     });
@@ -12996,8 +13168,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1SafeSearchAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1SafeSearchAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1SafeSearchAnnotation(
           od as api.GoogleCloudVisionV1p2beta1SafeSearchAnnotation);
     });
@@ -13006,7 +13179,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1Symbol', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1Symbol();
-      var od = api.GoogleCloudVisionV1p2beta1Symbol.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1Symbol.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1Symbol(
           od as api.GoogleCloudVisionV1p2beta1Symbol);
     });
@@ -13015,8 +13190,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1TextAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1TextAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p2beta1TextAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1TextAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1TextAnnotation(
           od as api.GoogleCloudVisionV1p2beta1TextAnnotation);
     });
@@ -13026,9 +13202,10 @@
       'obj-schema-GoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak(
           od as api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak);
     });
@@ -13039,9 +13216,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage(
           od as api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage);
     });
@@ -13051,9 +13229,10 @@
       'obj-schema-GoogleCloudVisionV1p2beta1TextAnnotationTextProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1TextAnnotationTextProperty();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p2beta1TextAnnotationTextProperty.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(
           od as api.GoogleCloudVisionV1p2beta1TextAnnotationTextProperty);
     });
@@ -13062,7 +13241,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1Vertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1Vertex();
-      var od = api.GoogleCloudVisionV1p2beta1Vertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1Vertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1Vertex(
           od as api.GoogleCloudVisionV1p2beta1Vertex);
     });
@@ -13071,7 +13252,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1WebDetection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1WebDetection();
-      var od = api.GoogleCloudVisionV1p2beta1WebDetection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1WebDetection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1WebDetection(
           od as api.GoogleCloudVisionV1p2beta1WebDetection);
     });
@@ -13081,8 +13264,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1WebDetectionWebEntity();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1WebDetectionWebEntity.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1WebDetectionWebEntity(
           od as api.GoogleCloudVisionV1p2beta1WebDetectionWebEntity);
     });
@@ -13092,8 +13276,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1WebDetectionWebImage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
           od as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
     });
@@ -13103,8 +13288,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1WebDetectionWebLabel();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1WebDetectionWebLabel.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1WebDetectionWebLabel(
           od as api.GoogleCloudVisionV1p2beta1WebDetectionWebLabel);
     });
@@ -13114,8 +13300,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1WebDetectionWebPage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p2beta1WebDetectionWebPage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1WebDetectionWebPage(
           od as api.GoogleCloudVisionV1p2beta1WebDetectionWebPage);
     });
@@ -13124,7 +13311,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p2beta1Word', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p2beta1Word();
-      var od = api.GoogleCloudVisionV1p2beta1Word.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p2beta1Word.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p2beta1Word(
           od as api.GoogleCloudVisionV1p2beta1Word);
     });
@@ -13134,8 +13323,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1AnnotateFileResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1AnnotateFileResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1AnnotateFileResponse(
           od as api.GoogleCloudVisionV1p3beta1AnnotateFileResponse);
     });
@@ -13145,8 +13335,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1AnnotateImageResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1AnnotateImageResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1AnnotateImageResponse(
           od as api.GoogleCloudVisionV1p3beta1AnnotateImageResponse);
     });
@@ -13156,8 +13347,9 @@
       'obj-schema-GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse(
           od as api.GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse);
     });
@@ -13168,8 +13360,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1AsyncBatchAnnotateFilesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1AsyncBatchAnnotateFilesResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1AsyncBatchAnnotateFilesResponse(
           od as api.GoogleCloudVisionV1p3beta1AsyncBatchAnnotateFilesResponse);
     });
@@ -13179,8 +13372,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1BatchOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1BatchOperationMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1BatchOperationMetadata(
           od as api.GoogleCloudVisionV1p3beta1BatchOperationMetadata);
     });
@@ -13189,7 +13383,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1Block', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1Block();
-      var od = api.GoogleCloudVisionV1p3beta1Block.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1Block.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1Block(
           od as api.GoogleCloudVisionV1p3beta1Block);
     });
@@ -13198,7 +13394,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1BoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1BoundingPoly();
-      var od = api.GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1BoundingPoly(
           od as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     });
@@ -13207,7 +13405,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1ColorInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1ColorInfo();
-      var od = api.GoogleCloudVisionV1p3beta1ColorInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1ColorInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1ColorInfo(
           od as api.GoogleCloudVisionV1p3beta1ColorInfo);
     });
@@ -13216,7 +13416,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1CropHint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1CropHint();
-      var od = api.GoogleCloudVisionV1p3beta1CropHint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1CropHint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1CropHint(
           od as api.GoogleCloudVisionV1p3beta1CropHint);
     });
@@ -13226,8 +13428,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1CropHintsAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1CropHintsAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1CropHintsAnnotation(
           od as api.GoogleCloudVisionV1p3beta1CropHintsAnnotation);
     });
@@ -13237,8 +13440,9 @@
       'obj-schema-GoogleCloudVisionV1p3beta1DominantColorsAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1DominantColorsAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1DominantColorsAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1DominantColorsAnnotation(
           od as api.GoogleCloudVisionV1p3beta1DominantColorsAnnotation);
     });
@@ -13247,8 +13451,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1EntityAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1EntityAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1EntityAnnotation(
           od as api.GoogleCloudVisionV1p3beta1EntityAnnotation);
     });
@@ -13257,8 +13462,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1FaceAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1FaceAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p3beta1FaceAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1FaceAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1FaceAnnotation(
           od as api.GoogleCloudVisionV1p3beta1FaceAnnotation);
     });
@@ -13268,8 +13474,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1FaceAnnotationLandmark();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1FaceAnnotationLandmark.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1FaceAnnotationLandmark(
           od as api.GoogleCloudVisionV1p3beta1FaceAnnotationLandmark);
     });
@@ -13278,8 +13485,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1GcsDestination();
-      var od =
-          api.GoogleCloudVisionV1p3beta1GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1GcsDestination(
           od as api.GoogleCloudVisionV1p3beta1GcsDestination);
     });
@@ -13288,7 +13496,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1GcsSource();
-      var od = api.GoogleCloudVisionV1p3beta1GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1GcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1GcsSource(
           od as api.GoogleCloudVisionV1p3beta1GcsSource);
     });
@@ -13298,8 +13508,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1ImageAnnotationContext();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1ImageAnnotationContext.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1ImageAnnotationContext(
           od as api.GoogleCloudVisionV1p3beta1ImageAnnotationContext);
     });
@@ -13308,8 +13519,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1ImageProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1ImageProperties();
-      var od =
-          api.GoogleCloudVisionV1p3beta1ImageProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1ImageProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1ImageProperties(
           od as api.GoogleCloudVisionV1p3beta1ImageProperties);
     });
@@ -13319,8 +13531,9 @@
       'obj-schema-GoogleCloudVisionV1p3beta1ImportProductSetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1ImportProductSetsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1ImportProductSetsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1ImportProductSetsResponse(
           od as api.GoogleCloudVisionV1p3beta1ImportProductSetsResponse);
     });
@@ -13329,7 +13542,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1InputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1InputConfig();
-      var od = api.GoogleCloudVisionV1p3beta1InputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1InputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1InputConfig(
           od as api.GoogleCloudVisionV1p3beta1InputConfig);
     });
@@ -13339,8 +13554,9 @@
       'obj-schema-GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation(
           od as api.GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation);
     });
@@ -13349,7 +13565,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1LocationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1LocationInfo();
-      var od = api.GoogleCloudVisionV1p3beta1LocationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1LocationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1LocationInfo(
           od as api.GoogleCloudVisionV1p3beta1LocationInfo);
     });
@@ -13358,8 +13576,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1NormalizedVertex();
-      var od =
-          api.GoogleCloudVisionV1p3beta1NormalizedVertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1NormalizedVertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1NormalizedVertex(
           od as api.GoogleCloudVisionV1p3beta1NormalizedVertex);
     });
@@ -13368,8 +13587,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1OperationMetadata();
-      var od =
-          api.GoogleCloudVisionV1p3beta1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1OperationMetadata(
           od as api.GoogleCloudVisionV1p3beta1OperationMetadata);
     });
@@ -13378,7 +13598,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1OutputConfig();
-      var od = api.GoogleCloudVisionV1p3beta1OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1OutputConfig(
           od as api.GoogleCloudVisionV1p3beta1OutputConfig);
     });
@@ -13387,7 +13609,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1Page();
-      var od = api.GoogleCloudVisionV1p3beta1Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1Page.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1Page(
           od as api.GoogleCloudVisionV1p3beta1Page);
     });
@@ -13396,7 +13620,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1Paragraph', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1Paragraph();
-      var od = api.GoogleCloudVisionV1p3beta1Paragraph.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1Paragraph.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1Paragraph(
           od as api.GoogleCloudVisionV1p3beta1Paragraph);
     });
@@ -13405,7 +13631,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1Position', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1Position();
-      var od = api.GoogleCloudVisionV1p3beta1Position.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1Position.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1Position(
           od as api.GoogleCloudVisionV1p3beta1Position);
     });
@@ -13414,7 +13642,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1Product();
-      var od = api.GoogleCloudVisionV1p3beta1Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1Product.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1Product(
           od as api.GoogleCloudVisionV1p3beta1Product);
     });
@@ -13423,8 +13653,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1ProductKeyValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1ProductKeyValue();
-      var od =
-          api.GoogleCloudVisionV1p3beta1ProductKeyValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1ProductKeyValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1ProductKeyValue(
           od as api.GoogleCloudVisionV1p3beta1ProductKeyValue);
     });
@@ -13434,8 +13665,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1ProductSearchResults();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1ProductSearchResults.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1ProductSearchResults(
           od as api.GoogleCloudVisionV1p3beta1ProductSearchResults);
     });
@@ -13447,8 +13679,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult(od
           as api.GoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult);
     });
@@ -13460,9 +13693,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation(od
           as api
               .GoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation);
@@ -13473,9 +13707,10 @@
       'obj-schema-GoogleCloudVisionV1p3beta1ProductSearchResultsResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1ProductSearchResultsResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(
           od as api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult);
     });
@@ -13484,7 +13719,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1Property', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1Property();
-      var od = api.GoogleCloudVisionV1p3beta1Property.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1Property.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1Property(
           od as api.GoogleCloudVisionV1p3beta1Property);
     });
@@ -13493,8 +13730,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1ReferenceImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1ReferenceImage();
-      var od =
-          api.GoogleCloudVisionV1p3beta1ReferenceImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1ReferenceImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1ReferenceImage(
           od as api.GoogleCloudVisionV1p3beta1ReferenceImage);
     });
@@ -13504,8 +13742,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1SafeSearchAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1SafeSearchAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1SafeSearchAnnotation(
           od as api.GoogleCloudVisionV1p3beta1SafeSearchAnnotation);
     });
@@ -13514,7 +13753,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1Symbol', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1Symbol();
-      var od = api.GoogleCloudVisionV1p3beta1Symbol.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1Symbol.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1Symbol(
           od as api.GoogleCloudVisionV1p3beta1Symbol);
     });
@@ -13523,8 +13764,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1TextAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1TextAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p3beta1TextAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1TextAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1TextAnnotation(
           od as api.GoogleCloudVisionV1p3beta1TextAnnotation);
     });
@@ -13534,9 +13776,10 @@
       'obj-schema-GoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak(
           od as api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak);
     });
@@ -13547,9 +13790,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage(
           od as api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage);
     });
@@ -13559,9 +13803,10 @@
       'obj-schema-GoogleCloudVisionV1p3beta1TextAnnotationTextProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1TextAnnotationTextProperty();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p3beta1TextAnnotationTextProperty.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(
           od as api.GoogleCloudVisionV1p3beta1TextAnnotationTextProperty);
     });
@@ -13570,7 +13815,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1Vertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1Vertex();
-      var od = api.GoogleCloudVisionV1p3beta1Vertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1Vertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1Vertex(
           od as api.GoogleCloudVisionV1p3beta1Vertex);
     });
@@ -13579,7 +13826,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1WebDetection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1WebDetection();
-      var od = api.GoogleCloudVisionV1p3beta1WebDetection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1WebDetection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1WebDetection(
           od as api.GoogleCloudVisionV1p3beta1WebDetection);
     });
@@ -13589,8 +13838,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1WebDetectionWebEntity();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1WebDetectionWebEntity.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1WebDetectionWebEntity(
           od as api.GoogleCloudVisionV1p3beta1WebDetectionWebEntity);
     });
@@ -13600,8 +13850,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1WebDetectionWebImage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
           od as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
     });
@@ -13611,8 +13862,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1WebDetectionWebLabel();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1WebDetectionWebLabel.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1WebDetectionWebLabel(
           od as api.GoogleCloudVisionV1p3beta1WebDetectionWebLabel);
     });
@@ -13622,8 +13874,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1WebDetectionWebPage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p3beta1WebDetectionWebPage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1WebDetectionWebPage(
           od as api.GoogleCloudVisionV1p3beta1WebDetectionWebPage);
     });
@@ -13632,7 +13885,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p3beta1Word', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p3beta1Word();
-      var od = api.GoogleCloudVisionV1p3beta1Word.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p3beta1Word.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p3beta1Word(
           od as api.GoogleCloudVisionV1p3beta1Word);
     });
@@ -13642,8 +13897,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1AnnotateFileResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1AnnotateFileResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1AnnotateFileResponse(
           od as api.GoogleCloudVisionV1p4beta1AnnotateFileResponse);
     });
@@ -13653,8 +13909,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1AnnotateImageResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1AnnotateImageResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1AnnotateImageResponse(
           od as api.GoogleCloudVisionV1p4beta1AnnotateImageResponse);
     });
@@ -13664,8 +13921,9 @@
       'obj-schema-GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse(
           od as api.GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse);
     });
@@ -13676,8 +13934,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1AsyncBatchAnnotateFilesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1AsyncBatchAnnotateFilesResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1AsyncBatchAnnotateFilesResponse(
           od as api.GoogleCloudVisionV1p4beta1AsyncBatchAnnotateFilesResponse);
     });
@@ -13688,8 +13947,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse(
           od as api.GoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse);
     });
@@ -13699,9 +13959,10 @@
       'obj-schema-GoogleCloudVisionV1p4beta1BatchAnnotateFilesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1BatchAnnotateFilesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p4beta1BatchAnnotateFilesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1BatchAnnotateFilesResponse(
           od as api.GoogleCloudVisionV1p4beta1BatchAnnotateFilesResponse);
     });
@@ -13711,8 +13972,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1BatchOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1BatchOperationMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1BatchOperationMetadata(
           od as api.GoogleCloudVisionV1p4beta1BatchOperationMetadata);
     });
@@ -13721,7 +13983,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1Block', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1Block();
-      var od = api.GoogleCloudVisionV1p4beta1Block.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1Block.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1Block(
           od as api.GoogleCloudVisionV1p4beta1Block);
     });
@@ -13730,7 +13994,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1BoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1BoundingPoly();
-      var od = api.GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1BoundingPoly(
           od as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     });
@@ -13739,7 +14005,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1Celebrity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1Celebrity();
-      var od = api.GoogleCloudVisionV1p4beta1Celebrity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1Celebrity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1Celebrity(
           od as api.GoogleCloudVisionV1p4beta1Celebrity);
     });
@@ -13748,7 +14016,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1ColorInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1ColorInfo();
-      var od = api.GoogleCloudVisionV1p4beta1ColorInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1ColorInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1ColorInfo(
           od as api.GoogleCloudVisionV1p4beta1ColorInfo);
     });
@@ -13757,7 +14027,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1CropHint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1CropHint();
-      var od = api.GoogleCloudVisionV1p4beta1CropHint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1CropHint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1CropHint(
           od as api.GoogleCloudVisionV1p4beta1CropHint);
     });
@@ -13767,8 +14039,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1CropHintsAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1CropHintsAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1CropHintsAnnotation(
           od as api.GoogleCloudVisionV1p4beta1CropHintsAnnotation);
     });
@@ -13778,8 +14051,9 @@
       'obj-schema-GoogleCloudVisionV1p4beta1DominantColorsAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1DominantColorsAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1DominantColorsAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1DominantColorsAnnotation(
           od as api.GoogleCloudVisionV1p4beta1DominantColorsAnnotation);
     });
@@ -13788,8 +14062,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1EntityAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1EntityAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1EntityAnnotation(
           od as api.GoogleCloudVisionV1p4beta1EntityAnnotation);
     });
@@ -13798,8 +14073,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1FaceAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1FaceAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p4beta1FaceAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1FaceAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1FaceAnnotation(
           od as api.GoogleCloudVisionV1p4beta1FaceAnnotation);
     });
@@ -13809,8 +14085,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1FaceAnnotationLandmark();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1FaceAnnotationLandmark.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1FaceAnnotationLandmark(
           od as api.GoogleCloudVisionV1p4beta1FaceAnnotationLandmark);
     });
@@ -13820,8 +14097,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1FaceRecognitionResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1FaceRecognitionResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1FaceRecognitionResult(
           od as api.GoogleCloudVisionV1p4beta1FaceRecognitionResult);
     });
@@ -13830,8 +14108,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1GcsDestination();
-      var od =
-          api.GoogleCloudVisionV1p4beta1GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1GcsDestination(
           od as api.GoogleCloudVisionV1p4beta1GcsDestination);
     });
@@ -13840,7 +14119,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1GcsSource();
-      var od = api.GoogleCloudVisionV1p4beta1GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1GcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1GcsSource(
           od as api.GoogleCloudVisionV1p4beta1GcsSource);
     });
@@ -13850,8 +14131,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1ImageAnnotationContext();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1ImageAnnotationContext.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1ImageAnnotationContext(
           od as api.GoogleCloudVisionV1p4beta1ImageAnnotationContext);
     });
@@ -13860,8 +14142,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1ImageProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1ImageProperties();
-      var od =
-          api.GoogleCloudVisionV1p4beta1ImageProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1ImageProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1ImageProperties(
           od as api.GoogleCloudVisionV1p4beta1ImageProperties);
     });
@@ -13871,8 +14154,9 @@
       'obj-schema-GoogleCloudVisionV1p4beta1ImportProductSetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1ImportProductSetsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1ImportProductSetsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1ImportProductSetsResponse(
           od as api.GoogleCloudVisionV1p4beta1ImportProductSetsResponse);
     });
@@ -13881,7 +14165,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1InputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1InputConfig();
-      var od = api.GoogleCloudVisionV1p4beta1InputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1InputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1InputConfig(
           od as api.GoogleCloudVisionV1p4beta1InputConfig);
     });
@@ -13891,8 +14177,9 @@
       'obj-schema-GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation(
           od as api.GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation);
     });
@@ -13901,7 +14188,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1LocationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1LocationInfo();
-      var od = api.GoogleCloudVisionV1p4beta1LocationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1LocationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1LocationInfo(
           od as api.GoogleCloudVisionV1p4beta1LocationInfo);
     });
@@ -13910,8 +14199,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1NormalizedVertex();
-      var od =
-          api.GoogleCloudVisionV1p4beta1NormalizedVertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1NormalizedVertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1NormalizedVertex(
           od as api.GoogleCloudVisionV1p4beta1NormalizedVertex);
     });
@@ -13920,8 +14210,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1OperationMetadata();
-      var od =
-          api.GoogleCloudVisionV1p4beta1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1OperationMetadata(
           od as api.GoogleCloudVisionV1p4beta1OperationMetadata);
     });
@@ -13930,7 +14221,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1OutputConfig();
-      var od = api.GoogleCloudVisionV1p4beta1OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1OutputConfig(
           od as api.GoogleCloudVisionV1p4beta1OutputConfig);
     });
@@ -13939,7 +14232,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1Page();
-      var od = api.GoogleCloudVisionV1p4beta1Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1Page.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1Page(
           od as api.GoogleCloudVisionV1p4beta1Page);
     });
@@ -13948,7 +14243,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1Paragraph', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1Paragraph();
-      var od = api.GoogleCloudVisionV1p4beta1Paragraph.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1Paragraph.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1Paragraph(
           od as api.GoogleCloudVisionV1p4beta1Paragraph);
     });
@@ -13957,7 +14254,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1Position', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1Position();
-      var od = api.GoogleCloudVisionV1p4beta1Position.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1Position.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1Position(
           od as api.GoogleCloudVisionV1p4beta1Position);
     });
@@ -13966,7 +14265,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1Product();
-      var od = api.GoogleCloudVisionV1p4beta1Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1Product.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1Product(
           od as api.GoogleCloudVisionV1p4beta1Product);
     });
@@ -13975,8 +14276,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1ProductKeyValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1ProductKeyValue();
-      var od =
-          api.GoogleCloudVisionV1p4beta1ProductKeyValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1ProductKeyValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1ProductKeyValue(
           od as api.GoogleCloudVisionV1p4beta1ProductKeyValue);
     });
@@ -13986,8 +14288,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1ProductSearchResults();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1ProductSearchResults.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1ProductSearchResults(
           od as api.GoogleCloudVisionV1p4beta1ProductSearchResults);
     });
@@ -13999,8 +14302,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult(od
           as api.GoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult);
     });
@@ -14012,9 +14316,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation(od
           as api
               .GoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation);
@@ -14025,9 +14330,10 @@
       'obj-schema-GoogleCloudVisionV1p4beta1ProductSearchResultsResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1ProductSearchResultsResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(
           od as api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult);
     });
@@ -14036,7 +14342,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1Property', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1Property();
-      var od = api.GoogleCloudVisionV1p4beta1Property.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1Property.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1Property(
           od as api.GoogleCloudVisionV1p4beta1Property);
     });
@@ -14045,8 +14353,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1ReferenceImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1ReferenceImage();
-      var od =
-          api.GoogleCloudVisionV1p4beta1ReferenceImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1ReferenceImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1ReferenceImage(
           od as api.GoogleCloudVisionV1p4beta1ReferenceImage);
     });
@@ -14056,8 +14365,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1SafeSearchAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1SafeSearchAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1SafeSearchAnnotation(
           od as api.GoogleCloudVisionV1p4beta1SafeSearchAnnotation);
     });
@@ -14066,7 +14376,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1Symbol', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1Symbol();
-      var od = api.GoogleCloudVisionV1p4beta1Symbol.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1Symbol.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1Symbol(
           od as api.GoogleCloudVisionV1p4beta1Symbol);
     });
@@ -14075,8 +14387,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1TextAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1TextAnnotation();
-      var od =
-          api.GoogleCloudVisionV1p4beta1TextAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1TextAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1TextAnnotation(
           od as api.GoogleCloudVisionV1p4beta1TextAnnotation);
     });
@@ -14086,9 +14399,10 @@
       'obj-schema-GoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak(
           od as api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak);
     });
@@ -14099,9 +14413,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage(
           od as api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage);
     });
@@ -14111,9 +14426,10 @@
       'obj-schema-GoogleCloudVisionV1p4beta1TextAnnotationTextProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1TextAnnotationTextProperty();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudVisionV1p4beta1TextAnnotationTextProperty.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(
           od as api.GoogleCloudVisionV1p4beta1TextAnnotationTextProperty);
     });
@@ -14122,7 +14438,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1Vertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1Vertex();
-      var od = api.GoogleCloudVisionV1p4beta1Vertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1Vertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1Vertex(
           od as api.GoogleCloudVisionV1p4beta1Vertex);
     });
@@ -14131,7 +14449,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1WebDetection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1WebDetection();
-      var od = api.GoogleCloudVisionV1p4beta1WebDetection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1WebDetection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1WebDetection(
           od as api.GoogleCloudVisionV1p4beta1WebDetection);
     });
@@ -14141,8 +14461,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1WebDetectionWebEntity();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1WebDetectionWebEntity.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1WebDetectionWebEntity(
           od as api.GoogleCloudVisionV1p4beta1WebDetectionWebEntity);
     });
@@ -14152,8 +14473,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1WebDetectionWebImage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
           od as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
     });
@@ -14163,8 +14485,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1WebDetectionWebLabel();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1WebDetectionWebLabel.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1WebDetectionWebLabel(
           od as api.GoogleCloudVisionV1p4beta1WebDetectionWebLabel);
     });
@@ -14174,8 +14497,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1WebDetectionWebPage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudVisionV1p4beta1WebDetectionWebPage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1WebDetectionWebPage(
           od as api.GoogleCloudVisionV1p4beta1WebDetectionWebPage);
     });
@@ -14184,7 +14508,9 @@
   unittest.group('obj-schema-GoogleCloudVisionV1p4beta1Word', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudVisionV1p4beta1Word();
-      var od = api.GoogleCloudVisionV1p4beta1Word.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudVisionV1p4beta1Word.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudVisionV1p4beta1Word(
           od as api.GoogleCloudVisionV1p4beta1Word);
     });
@@ -14193,7 +14519,9 @@
   unittest.group('obj-schema-GroupedResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupedResult();
-      var od = api.GroupedResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupedResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupedResult(od as api.GroupedResult);
     });
   });
@@ -14201,7 +14529,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -14209,7 +14538,9 @@
   unittest.group('obj-schema-ImageAnnotationContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageAnnotationContext();
-      var od = api.ImageAnnotationContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageAnnotationContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageAnnotationContext(od as api.ImageAnnotationContext);
     });
   });
@@ -14217,7 +14548,9 @@
   unittest.group('obj-schema-ImageContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageContext();
-      var od = api.ImageContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageContext(od as api.ImageContext);
     });
   });
@@ -14225,7 +14558,9 @@
   unittest.group('obj-schema-ImageProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageProperties();
-      var od = api.ImageProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageProperties(od as api.ImageProperties);
     });
   });
@@ -14233,7 +14568,9 @@
   unittest.group('obj-schema-ImageSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageSource();
-      var od = api.ImageSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageSource(od as api.ImageSource);
     });
   });
@@ -14241,7 +14578,9 @@
   unittest.group('obj-schema-ImportProductSetsGcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportProductSetsGcsSource();
-      var od = api.ImportProductSetsGcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportProductSetsGcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportProductSetsGcsSource(od as api.ImportProductSetsGcsSource);
     });
   });
@@ -14249,7 +14588,9 @@
   unittest.group('obj-schema-ImportProductSetsInputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportProductSetsInputConfig();
-      var od = api.ImportProductSetsInputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportProductSetsInputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportProductSetsInputConfig(od as api.ImportProductSetsInputConfig);
     });
   });
@@ -14257,7 +14598,9 @@
   unittest.group('obj-schema-ImportProductSetsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportProductSetsRequest();
-      var od = api.ImportProductSetsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportProductSetsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportProductSetsRequest(od as api.ImportProductSetsRequest);
     });
   });
@@ -14265,7 +14608,9 @@
   unittest.group('obj-schema-ImportProductSetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportProductSetsResponse();
-      var od = api.ImportProductSetsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportProductSetsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportProductSetsResponse(od as api.ImportProductSetsResponse);
     });
   });
@@ -14273,7 +14618,9 @@
   unittest.group('obj-schema-InputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInputConfig();
-      var od = api.InputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInputConfig(od as api.InputConfig);
     });
   });
@@ -14281,7 +14628,9 @@
   unittest.group('obj-schema-KeyValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyValue();
-      var od = api.KeyValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.KeyValue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKeyValue(od as api.KeyValue);
     });
   });
@@ -14289,7 +14638,9 @@
   unittest.group('obj-schema-Landmark', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLandmark();
-      var od = api.Landmark.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Landmark.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLandmark(od as api.Landmark);
     });
   });
@@ -14297,7 +14648,9 @@
   unittest.group('obj-schema-LatLng', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLatLng();
-      var od = api.LatLng.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LatLng.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLatLng(od as api.LatLng);
     });
   });
@@ -14305,7 +14658,9 @@
   unittest.group('obj-schema-LatLongRect', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLatLongRect();
-      var od = api.LatLongRect.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LatLongRect.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLatLongRect(od as api.LatLongRect);
     });
   });
@@ -14313,7 +14668,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -14321,7 +14678,9 @@
   unittest.group('obj-schema-ListProductSetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListProductSetsResponse();
-      var od = api.ListProductSetsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListProductSetsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListProductSetsResponse(od as api.ListProductSetsResponse);
     });
   });
@@ -14329,7 +14688,9 @@
   unittest.group('obj-schema-ListProductsInProductSetResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListProductsInProductSetResponse();
-      var od = api.ListProductsInProductSetResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListProductsInProductSetResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListProductsInProductSetResponse(
           od as api.ListProductsInProductSetResponse);
     });
@@ -14338,7 +14699,9 @@
   unittest.group('obj-schema-ListProductsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListProductsResponse();
-      var od = api.ListProductsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListProductsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListProductsResponse(od as api.ListProductsResponse);
     });
   });
@@ -14346,7 +14709,9 @@
   unittest.group('obj-schema-ListReferenceImagesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListReferenceImagesResponse();
-      var od = api.ListReferenceImagesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListReferenceImagesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListReferenceImagesResponse(od as api.ListReferenceImagesResponse);
     });
   });
@@ -14354,7 +14719,9 @@
   unittest.group('obj-schema-LocalizedObjectAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalizedObjectAnnotation();
-      var od = api.LocalizedObjectAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalizedObjectAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalizedObjectAnnotation(od as api.LocalizedObjectAnnotation);
     });
   });
@@ -14362,7 +14729,9 @@
   unittest.group('obj-schema-LocationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationInfo();
-      var od = api.LocationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationInfo(od as api.LocationInfo);
     });
   });
@@ -14370,7 +14739,9 @@
   unittest.group('obj-schema-NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNormalizedVertex();
-      var od = api.NormalizedVertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NormalizedVertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNormalizedVertex(od as api.NormalizedVertex);
     });
   });
@@ -14378,7 +14749,9 @@
   unittest.group('obj-schema-ObjectAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectAnnotation();
-      var od = api.ObjectAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ObjectAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkObjectAnnotation(od as api.ObjectAnnotation);
     });
   });
@@ -14386,7 +14759,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -14394,7 +14769,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -14402,7 +14779,9 @@
   unittest.group('obj-schema-OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOutputConfig();
-      var od = api.OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOutputConfig(od as api.OutputConfig);
     });
   });
@@ -14410,7 +14789,8 @@
   unittest.group('obj-schema-Page', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPage();
-      var od = api.Page.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Page.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPage(od as api.Page);
     });
   });
@@ -14418,7 +14798,9 @@
   unittest.group('obj-schema-Paragraph', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParagraph();
-      var od = api.Paragraph.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Paragraph.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkParagraph(od as api.Paragraph);
     });
   });
@@ -14426,7 +14808,9 @@
   unittest.group('obj-schema-Position', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosition();
-      var od = api.Position.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Position.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPosition(od as api.Position);
     });
   });
@@ -14434,7 +14818,9 @@
   unittest.group('obj-schema-Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProduct();
-      var od = api.Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Product.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProduct(od as api.Product);
     });
   });
@@ -14442,7 +14828,9 @@
   unittest.group('obj-schema-ProductSearchParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductSearchParams();
-      var od = api.ProductSearchParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductSearchParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductSearchParams(od as api.ProductSearchParams);
     });
   });
@@ -14450,7 +14838,9 @@
   unittest.group('obj-schema-ProductSearchResults', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductSearchResults();
-      var od = api.ProductSearchResults.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductSearchResults.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductSearchResults(od as api.ProductSearchResults);
     });
   });
@@ -14458,7 +14848,9 @@
   unittest.group('obj-schema-ProductSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductSet();
-      var od = api.ProductSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ProductSet.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProductSet(od as api.ProductSet);
     });
   });
@@ -14466,7 +14858,9 @@
   unittest.group('obj-schema-ProductSetPurgeConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProductSetPurgeConfig();
-      var od = api.ProductSetPurgeConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProductSetPurgeConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProductSetPurgeConfig(od as api.ProductSetPurgeConfig);
     });
   });
@@ -14474,7 +14868,9 @@
   unittest.group('obj-schema-Property', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProperty();
-      var od = api.Property.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Property.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProperty(od as api.Property);
     });
   });
@@ -14482,7 +14878,9 @@
   unittest.group('obj-schema-PurgeProductsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPurgeProductsRequest();
-      var od = api.PurgeProductsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PurgeProductsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPurgeProductsRequest(od as api.PurgeProductsRequest);
     });
   });
@@ -14490,7 +14888,9 @@
   unittest.group('obj-schema-ReferenceImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReferenceImage();
-      var od = api.ReferenceImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReferenceImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReferenceImage(od as api.ReferenceImage);
     });
   });
@@ -14498,7 +14898,9 @@
   unittest.group('obj-schema-RemoveProductFromProductSetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveProductFromProductSetRequest();
-      var od = api.RemoveProductFromProductSetRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveProductFromProductSetRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveProductFromProductSetRequest(
           od as api.RemoveProductFromProductSetRequest);
     });
@@ -14507,7 +14909,9 @@
   unittest.group('obj-schema-Result', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResult();
-      var od = api.Result.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Result.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResult(od as api.Result);
     });
   });
@@ -14515,7 +14919,9 @@
   unittest.group('obj-schema-SafeSearchAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSafeSearchAnnotation();
-      var od = api.SafeSearchAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SafeSearchAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSafeSearchAnnotation(od as api.SafeSearchAnnotation);
     });
   });
@@ -14523,7 +14929,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -14531,7 +14939,9 @@
   unittest.group('obj-schema-Symbol', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSymbol();
-      var od = api.Symbol.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Symbol.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSymbol(od as api.Symbol);
     });
   });
@@ -14539,7 +14949,9 @@
   unittest.group('obj-schema-TextAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextAnnotation();
-      var od = api.TextAnnotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextAnnotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextAnnotation(od as api.TextAnnotation);
     });
   });
@@ -14547,7 +14959,9 @@
   unittest.group('obj-schema-TextDetectionParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextDetectionParams();
-      var od = api.TextDetectionParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextDetectionParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextDetectionParams(od as api.TextDetectionParams);
     });
   });
@@ -14555,7 +14969,9 @@
   unittest.group('obj-schema-TextProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextProperty();
-      var od = api.TextProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TextProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTextProperty(od as api.TextProperty);
     });
   });
@@ -14563,7 +14979,9 @@
   unittest.group('obj-schema-Vertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVertex();
-      var od = api.Vertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Vertex.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVertex(od as api.Vertex);
     });
   });
@@ -14571,7 +14989,9 @@
   unittest.group('obj-schema-WebDetection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebDetection();
-      var od = api.WebDetection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebDetection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebDetection(od as api.WebDetection);
     });
   });
@@ -14579,7 +14999,9 @@
   unittest.group('obj-schema-WebDetectionParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebDetectionParams();
-      var od = api.WebDetectionParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebDetectionParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebDetectionParams(od as api.WebDetectionParams);
     });
   });
@@ -14587,7 +15009,9 @@
   unittest.group('obj-schema-WebEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebEntity();
-      var od = api.WebEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebEntity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebEntity(od as api.WebEntity);
     });
   });
@@ -14595,7 +15019,9 @@
   unittest.group('obj-schema-WebImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebImage();
-      var od = api.WebImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebImage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebImage(od as api.WebImage);
     });
   });
@@ -14603,7 +15029,9 @@
   unittest.group('obj-schema-WebLabel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebLabel();
-      var od = api.WebLabel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebLabel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebLabel(od as api.WebLabel);
     });
   });
@@ -14611,7 +15039,9 @@
   unittest.group('obj-schema-WebPage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebPage();
-      var od = api.WebPage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebPage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebPage(od as api.WebPage);
     });
   });
@@ -14619,7 +15049,8 @@
   unittest.group('obj-schema-Word', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWord();
-      var od = api.Word.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Word.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWord(od as api.Word);
     });
   });
diff --git a/generated/googleapis/test/webfonts/v1_test.dart b/generated/googleapis/test/webfonts/v1_test.dart
index 805abd0..384217a 100644
--- a/generated/googleapis/test/webfonts/v1_test.dart
+++ b/generated/googleapis/test/webfonts/v1_test.dart
@@ -173,7 +173,9 @@
   unittest.group('obj-schema-Webfont', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebfont();
-      var od = api.Webfont.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Webfont.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebfont(od as api.Webfont);
     });
   });
@@ -181,7 +183,9 @@
   unittest.group('obj-schema-WebfontList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebfontList();
-      var od = api.WebfontList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebfontList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebfontList(od as api.WebfontList);
     });
   });
diff --git a/generated/googleapis/test/webmasters/v3_test.dart b/generated/googleapis/test/webmasters/v3_test.dart
index 35fff21..5743689 100644
--- a/generated/googleapis/test/webmasters/v3_test.dart
+++ b/generated/googleapis/test/webmasters/v3_test.dart
@@ -472,7 +472,9 @@
   unittest.group('obj-schema-ApiDataRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiDataRow();
-      var od = api.ApiDataRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ApiDataRow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApiDataRow(od as api.ApiDataRow);
     });
   });
@@ -480,7 +482,9 @@
   unittest.group('obj-schema-ApiDimensionFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiDimensionFilter();
-      var od = api.ApiDimensionFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApiDimensionFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApiDimensionFilter(od as api.ApiDimensionFilter);
     });
   });
@@ -488,7 +492,9 @@
   unittest.group('obj-schema-ApiDimensionFilterGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiDimensionFilterGroup();
-      var od = api.ApiDimensionFilterGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApiDimensionFilterGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApiDimensionFilterGroup(od as api.ApiDimensionFilterGroup);
     });
   });
@@ -496,7 +502,9 @@
   unittest.group('obj-schema-SearchAnalyticsQueryRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchAnalyticsQueryRequest();
-      var od = api.SearchAnalyticsQueryRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchAnalyticsQueryRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchAnalyticsQueryRequest(od as api.SearchAnalyticsQueryRequest);
     });
   });
@@ -504,7 +512,9 @@
   unittest.group('obj-schema-SearchAnalyticsQueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchAnalyticsQueryResponse();
-      var od = api.SearchAnalyticsQueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchAnalyticsQueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchAnalyticsQueryResponse(od as api.SearchAnalyticsQueryResponse);
     });
   });
@@ -512,7 +522,9 @@
   unittest.group('obj-schema-SitemapsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSitemapsListResponse();
-      var od = api.SitemapsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SitemapsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSitemapsListResponse(od as api.SitemapsListResponse);
     });
   });
@@ -520,7 +532,9 @@
   unittest.group('obj-schema-SitesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSitesListResponse();
-      var od = api.SitesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SitesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSitesListResponse(od as api.SitesListResponse);
     });
   });
@@ -528,7 +542,9 @@
   unittest.group('obj-schema-WmxSite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWmxSite();
-      var od = api.WmxSite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WmxSite.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWmxSite(od as api.WmxSite);
     });
   });
@@ -536,7 +552,9 @@
   unittest.group('obj-schema-WmxSitemap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWmxSitemap();
-      var od = api.WmxSitemap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WmxSitemap.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWmxSitemap(od as api.WmxSitemap);
     });
   });
@@ -544,7 +562,9 @@
   unittest.group('obj-schema-WmxSitemapContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWmxSitemapContent();
-      var od = api.WmxSitemapContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WmxSitemapContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWmxSitemapContent(od as api.WmxSitemapContent);
     });
   });
diff --git a/generated/googleapis/test/webrisk/v1_test.dart b/generated/googleapis/test/webrisk/v1_test.dart
index a303b01..e1ee5d2 100644
--- a/generated/googleapis/test/webrisk/v1_test.dart
+++ b/generated/googleapis/test/webrisk/v1_test.dart
@@ -835,8 +835,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1ComputeThreatListDiffResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudWebriskV1ComputeThreatListDiffResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1ComputeThreatListDiffResponse(
           od as api.GoogleCloudWebriskV1ComputeThreatListDiffResponse);
     });
@@ -847,8 +848,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1ComputeThreatListDiffResponseChecksum();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudWebriskV1ComputeThreatListDiffResponseChecksum
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1ComputeThreatListDiffResponseChecksum(
           od as api.GoogleCloudWebriskV1ComputeThreatListDiffResponseChecksum);
     });
@@ -857,7 +859,9 @@
   unittest.group('obj-schema-GoogleCloudWebriskV1RawHashes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1RawHashes();
-      var od = api.GoogleCloudWebriskV1RawHashes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudWebriskV1RawHashes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1RawHashes(
           od as api.GoogleCloudWebriskV1RawHashes);
     });
@@ -866,7 +870,9 @@
   unittest.group('obj-schema-GoogleCloudWebriskV1RawIndices', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1RawIndices();
-      var od = api.GoogleCloudWebriskV1RawIndices.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudWebriskV1RawIndices.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1RawIndices(
           od as api.GoogleCloudWebriskV1RawIndices);
     });
@@ -875,7 +881,9 @@
   unittest.group('obj-schema-GoogleCloudWebriskV1RiceDeltaEncoding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1RiceDeltaEncoding();
-      var od = api.GoogleCloudWebriskV1RiceDeltaEncoding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudWebriskV1RiceDeltaEncoding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1RiceDeltaEncoding(
           od as api.GoogleCloudWebriskV1RiceDeltaEncoding);
     });
@@ -884,8 +892,9 @@
   unittest.group('obj-schema-GoogleCloudWebriskV1SearchHashesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1SearchHashesResponse();
-      var od =
-          api.GoogleCloudWebriskV1SearchHashesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudWebriskV1SearchHashesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1SearchHashesResponse(
           od as api.GoogleCloudWebriskV1SearchHashesResponse);
     });
@@ -895,8 +904,9 @@
       'obj-schema-GoogleCloudWebriskV1SearchHashesResponseThreatHash', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1SearchHashesResponseThreatHash();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudWebriskV1SearchHashesResponseThreatHash.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1SearchHashesResponseThreatHash(
           od as api.GoogleCloudWebriskV1SearchHashesResponseThreatHash);
     });
@@ -905,7 +915,9 @@
   unittest.group('obj-schema-GoogleCloudWebriskV1SearchUrisResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1SearchUrisResponse();
-      var od = api.GoogleCloudWebriskV1SearchUrisResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudWebriskV1SearchUrisResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1SearchUrisResponse(
           od as api.GoogleCloudWebriskV1SearchUrisResponse);
     });
@@ -915,8 +927,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1SearchUrisResponseThreatUri();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudWebriskV1SearchUrisResponseThreatUri.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1SearchUrisResponseThreatUri(
           od as api.GoogleCloudWebriskV1SearchUrisResponseThreatUri);
     });
@@ -925,7 +938,9 @@
   unittest.group('obj-schema-GoogleCloudWebriskV1Submission', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1Submission();
-      var od = api.GoogleCloudWebriskV1Submission.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudWebriskV1Submission.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1Submission(
           od as api.GoogleCloudWebriskV1Submission);
     });
@@ -934,7 +949,9 @@
   unittest.group('obj-schema-GoogleCloudWebriskV1SubmitUriRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1SubmitUriRequest();
-      var od = api.GoogleCloudWebriskV1SubmitUriRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudWebriskV1SubmitUriRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1SubmitUriRequest(
           od as api.GoogleCloudWebriskV1SubmitUriRequest);
     });
@@ -943,8 +960,9 @@
   unittest.group('obj-schema-GoogleCloudWebriskV1ThreatEntryAdditions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1ThreatEntryAdditions();
-      var od =
-          api.GoogleCloudWebriskV1ThreatEntryAdditions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudWebriskV1ThreatEntryAdditions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1ThreatEntryAdditions(
           od as api.GoogleCloudWebriskV1ThreatEntryAdditions);
     });
@@ -953,7 +971,9 @@
   unittest.group('obj-schema-GoogleCloudWebriskV1ThreatEntryRemovals', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudWebriskV1ThreatEntryRemovals();
-      var od = api.GoogleCloudWebriskV1ThreatEntryRemovals.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudWebriskV1ThreatEntryRemovals.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudWebriskV1ThreatEntryRemovals(
           od as api.GoogleCloudWebriskV1ThreatEntryRemovals);
     });
@@ -962,7 +982,9 @@
   unittest.group('obj-schema-GoogleLongrunningCancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningCancelOperationRequest();
-      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningCancelOperationRequest(
           od as api.GoogleLongrunningCancelOperationRequest);
     });
@@ -971,7 +993,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -980,7 +1004,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -988,7 +1014,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -996,7 +1024,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
diff --git a/generated/googleapis/test/websecurityscanner/v1_test.dart b/generated/googleapis/test/websecurityscanner/v1_test.dart
index 434fb78..7fbd969 100644
--- a/generated/googleapis/test/websecurityscanner/v1_test.dart
+++ b/generated/googleapis/test/websecurityscanner/v1_test.dart
@@ -1085,7 +1085,9 @@
   unittest.group('obj-schema-Authentication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthentication();
-      var od = api.Authentication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Authentication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthentication(od as api.Authentication);
     });
   });
@@ -1093,7 +1095,9 @@
   unittest.group('obj-schema-CrawledUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCrawledUrl();
-      var od = api.CrawledUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CrawledUrl.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCrawledUrl(od as api.CrawledUrl);
     });
   });
@@ -1101,7 +1105,9 @@
   unittest.group('obj-schema-CustomAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomAccount();
-      var od = api.CustomAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomAccount(od as api.CustomAccount);
     });
   });
@@ -1109,7 +1115,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1117,7 +1124,9 @@
   unittest.group('obj-schema-Finding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFinding();
-      var od = api.Finding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Finding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFinding(od as api.Finding);
     });
   });
@@ -1125,7 +1134,9 @@
   unittest.group('obj-schema-FindingTypeStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFindingTypeStats();
-      var od = api.FindingTypeStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FindingTypeStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFindingTypeStats(od as api.FindingTypeStats);
     });
   });
@@ -1133,7 +1144,8 @@
   unittest.group('obj-schema-Form', () {
     unittest.test('to-json--from-json', () async {
       var o = buildForm();
-      var od = api.Form.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Form.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkForm(od as api.Form);
     });
   });
@@ -1141,7 +1153,9 @@
   unittest.group('obj-schema-GoogleAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAccount();
-      var od = api.GoogleAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAccount(od as api.GoogleAccount);
     });
   });
@@ -1149,7 +1163,9 @@
   unittest.group('obj-schema-Header', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHeader();
-      var od = api.Header.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Header.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHeader(od as api.Header);
     });
   });
@@ -1157,7 +1173,9 @@
   unittest.group('obj-schema-IapCredential', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIapCredential();
-      var od = api.IapCredential.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IapCredential.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIapCredential(od as api.IapCredential);
     });
   });
@@ -1165,7 +1183,9 @@
   unittest.group('obj-schema-IapTestServiceAccountInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIapTestServiceAccountInfo();
-      var od = api.IapTestServiceAccountInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IapTestServiceAccountInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIapTestServiceAccountInfo(od as api.IapTestServiceAccountInfo);
     });
   });
@@ -1173,7 +1193,9 @@
   unittest.group('obj-schema-ListCrawledUrlsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCrawledUrlsResponse();
-      var od = api.ListCrawledUrlsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCrawledUrlsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCrawledUrlsResponse(od as api.ListCrawledUrlsResponse);
     });
   });
@@ -1181,7 +1203,9 @@
   unittest.group('obj-schema-ListFindingTypeStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFindingTypeStatsResponse();
-      var od = api.ListFindingTypeStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFindingTypeStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFindingTypeStatsResponse(od as api.ListFindingTypeStatsResponse);
     });
   });
@@ -1189,7 +1213,9 @@
   unittest.group('obj-schema-ListFindingsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFindingsResponse();
-      var od = api.ListFindingsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFindingsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFindingsResponse(od as api.ListFindingsResponse);
     });
   });
@@ -1197,7 +1223,9 @@
   unittest.group('obj-schema-ListScanConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListScanConfigsResponse();
-      var od = api.ListScanConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListScanConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListScanConfigsResponse(od as api.ListScanConfigsResponse);
     });
   });
@@ -1205,7 +1233,9 @@
   unittest.group('obj-schema-ListScanRunsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListScanRunsResponse();
-      var od = api.ListScanRunsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListScanRunsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListScanRunsResponse(od as api.ListScanRunsResponse);
     });
   });
@@ -1213,7 +1243,9 @@
   unittest.group('obj-schema-OutdatedLibrary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOutdatedLibrary();
-      var od = api.OutdatedLibrary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OutdatedLibrary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOutdatedLibrary(od as api.OutdatedLibrary);
     });
   });
@@ -1221,7 +1253,9 @@
   unittest.group('obj-schema-ScanConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScanConfig();
-      var od = api.ScanConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ScanConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkScanConfig(od as api.ScanConfig);
     });
   });
@@ -1229,7 +1263,9 @@
   unittest.group('obj-schema-ScanConfigError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScanConfigError();
-      var od = api.ScanConfigError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScanConfigError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScanConfigError(od as api.ScanConfigError);
     });
   });
@@ -1237,7 +1273,9 @@
   unittest.group('obj-schema-ScanRun', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScanRun();
-      var od = api.ScanRun.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ScanRun.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkScanRun(od as api.ScanRun);
     });
   });
@@ -1245,7 +1283,9 @@
   unittest.group('obj-schema-ScanRunErrorTrace', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScanRunErrorTrace();
-      var od = api.ScanRunErrorTrace.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScanRunErrorTrace.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScanRunErrorTrace(od as api.ScanRunErrorTrace);
     });
   });
@@ -1253,7 +1293,9 @@
   unittest.group('obj-schema-ScanRunWarningTrace', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScanRunWarningTrace();
-      var od = api.ScanRunWarningTrace.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScanRunWarningTrace.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScanRunWarningTrace(od as api.ScanRunWarningTrace);
     });
   });
@@ -1261,7 +1303,9 @@
   unittest.group('obj-schema-Schedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSchedule();
-      var od = api.Schedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Schedule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSchedule(od as api.Schedule);
     });
   });
@@ -1269,7 +1313,9 @@
   unittest.group('obj-schema-StartScanRunRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartScanRunRequest();
-      var od = api.StartScanRunRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartScanRunRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartScanRunRequest(od as api.StartScanRunRequest);
     });
   });
@@ -1277,7 +1323,9 @@
   unittest.group('obj-schema-StopScanRunRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStopScanRunRequest();
-      var od = api.StopScanRunRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StopScanRunRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStopScanRunRequest(od as api.StopScanRunRequest);
     });
   });
@@ -1285,7 +1333,9 @@
   unittest.group('obj-schema-ViolatingResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildViolatingResource();
-      var od = api.ViolatingResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ViolatingResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkViolatingResource(od as api.ViolatingResource);
     });
   });
@@ -1293,7 +1343,9 @@
   unittest.group('obj-schema-VulnerableHeaders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVulnerableHeaders();
-      var od = api.VulnerableHeaders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VulnerableHeaders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVulnerableHeaders(od as api.VulnerableHeaders);
     });
   });
@@ -1301,7 +1353,9 @@
   unittest.group('obj-schema-VulnerableParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVulnerableParameters();
-      var od = api.VulnerableParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VulnerableParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVulnerableParameters(od as api.VulnerableParameters);
     });
   });
@@ -1309,7 +1363,8 @@
   unittest.group('obj-schema-Xss', () {
     unittest.test('to-json--from-json', () async {
       var o = buildXss();
-      var od = api.Xss.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Xss.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkXss(od as api.Xss);
     });
   });
diff --git a/generated/googleapis/test/workflowexecutions/v1_test.dart b/generated/googleapis/test/workflowexecutions/v1_test.dart
index aaa045f..6df7e6b 100644
--- a/generated/googleapis/test/workflowexecutions/v1_test.dart
+++ b/generated/googleapis/test/workflowexecutions/v1_test.dart
@@ -164,7 +164,9 @@
   unittest.group('obj-schema-CancelExecutionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelExecutionRequest();
-      var od = api.CancelExecutionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelExecutionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelExecutionRequest(od as api.CancelExecutionRequest);
     });
   });
@@ -172,7 +174,8 @@
   unittest.group('obj-schema-Error', () {
     unittest.test('to-json--from-json', () async {
       var o = buildError();
-      var od = api.Error.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Error.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkError(od as api.Error);
     });
   });
@@ -180,7 +183,9 @@
   unittest.group('obj-schema-Execution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecution();
-      var od = api.Execution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Execution.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExecution(od as api.Execution);
     });
   });
@@ -188,7 +193,9 @@
   unittest.group('obj-schema-ListExecutionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListExecutionsResponse();
-      var od = api.ListExecutionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListExecutionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListExecutionsResponse(od as api.ListExecutionsResponse);
     });
   });
diff --git a/generated/googleapis/test/workflows/v1_test.dart b/generated/googleapis/test/workflows/v1_test.dart
index 2bbc501..648e36f 100644
--- a/generated/googleapis/test/workflows/v1_test.dart
+++ b/generated/googleapis/test/workflows/v1_test.dart
@@ -618,7 +618,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -626,7 +627,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -634,7 +637,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -642,7 +647,9 @@
   unittest.group('obj-schema-ListWorkflowsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListWorkflowsResponse();
-      var od = api.ListWorkflowsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListWorkflowsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListWorkflowsResponse(od as api.ListWorkflowsResponse);
     });
   });
@@ -650,7 +657,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -658,7 +667,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -666,7 +677,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -674,7 +687,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -682,7 +697,9 @@
   unittest.group('obj-schema-Workflow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkflow();
-      var od = api.Workflow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Workflow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWorkflow(od as api.Workflow);
     });
   });
diff --git a/generated/googleapis/test/youtube/v3_test.dart b/generated/googleapis/test/youtube/v3_test.dart
index 1f37f77..6343036 100644
--- a/generated/googleapis/test/youtube/v3_test.dart
+++ b/generated/googleapis/test/youtube/v3_test.dart
@@ -9298,7 +9298,9 @@
   unittest.group('obj-schema-AbuseReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAbuseReport();
-      var od = api.AbuseReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AbuseReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAbuseReport(od as api.AbuseReport);
     });
   });
@@ -9306,7 +9308,9 @@
   unittest.group('obj-schema-AbuseType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAbuseType();
-      var od = api.AbuseType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AbuseType.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAbuseType(od as api.AbuseType);
     });
   });
@@ -9314,7 +9318,9 @@
   unittest.group('obj-schema-AccessPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessPolicy();
-      var od = api.AccessPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccessPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccessPolicy(od as api.AccessPolicy);
     });
   });
@@ -9322,7 +9328,9 @@
   unittest.group('obj-schema-Activity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivity();
-      var od = api.Activity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Activity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkActivity(od as api.Activity);
     });
   });
@@ -9330,7 +9338,9 @@
   unittest.group('obj-schema-ActivityContentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetails();
-      var od = api.ActivityContentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetails(od as api.ActivityContentDetails);
     });
   });
@@ -9338,7 +9348,9 @@
   unittest.group('obj-schema-ActivityContentDetailsBulletin', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsBulletin();
-      var od = api.ActivityContentDetailsBulletin.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsBulletin.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsBulletin(
           od as api.ActivityContentDetailsBulletin);
     });
@@ -9347,7 +9359,9 @@
   unittest.group('obj-schema-ActivityContentDetailsChannelItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsChannelItem();
-      var od = api.ActivityContentDetailsChannelItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsChannelItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsChannelItem(
           od as api.ActivityContentDetailsChannelItem);
     });
@@ -9356,7 +9370,9 @@
   unittest.group('obj-schema-ActivityContentDetailsComment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsComment();
-      var od = api.ActivityContentDetailsComment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsComment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsComment(
           od as api.ActivityContentDetailsComment);
     });
@@ -9365,7 +9381,9 @@
   unittest.group('obj-schema-ActivityContentDetailsFavorite', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsFavorite();
-      var od = api.ActivityContentDetailsFavorite.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsFavorite.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsFavorite(
           od as api.ActivityContentDetailsFavorite);
     });
@@ -9374,7 +9392,9 @@
   unittest.group('obj-schema-ActivityContentDetailsLike', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsLike();
-      var od = api.ActivityContentDetailsLike.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsLike.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsLike(od as api.ActivityContentDetailsLike);
     });
   });
@@ -9382,7 +9402,9 @@
   unittest.group('obj-schema-ActivityContentDetailsPlaylistItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsPlaylistItem();
-      var od = api.ActivityContentDetailsPlaylistItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsPlaylistItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsPlaylistItem(
           od as api.ActivityContentDetailsPlaylistItem);
     });
@@ -9391,7 +9413,9 @@
   unittest.group('obj-schema-ActivityContentDetailsPromotedItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsPromotedItem();
-      var od = api.ActivityContentDetailsPromotedItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsPromotedItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsPromotedItem(
           od as api.ActivityContentDetailsPromotedItem);
     });
@@ -9400,7 +9424,9 @@
   unittest.group('obj-schema-ActivityContentDetailsRecommendation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsRecommendation();
-      var od = api.ActivityContentDetailsRecommendation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsRecommendation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsRecommendation(
           od as api.ActivityContentDetailsRecommendation);
     });
@@ -9409,7 +9435,9 @@
   unittest.group('obj-schema-ActivityContentDetailsSocial', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsSocial();
-      var od = api.ActivityContentDetailsSocial.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsSocial.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsSocial(od as api.ActivityContentDetailsSocial);
     });
   });
@@ -9417,7 +9445,9 @@
   unittest.group('obj-schema-ActivityContentDetailsSubscription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsSubscription();
-      var od = api.ActivityContentDetailsSubscription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsSubscription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsSubscription(
           od as api.ActivityContentDetailsSubscription);
     });
@@ -9426,7 +9456,9 @@
   unittest.group('obj-schema-ActivityContentDetailsUpload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityContentDetailsUpload();
-      var od = api.ActivityContentDetailsUpload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityContentDetailsUpload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityContentDetailsUpload(od as api.ActivityContentDetailsUpload);
     });
   });
@@ -9434,7 +9466,9 @@
   unittest.group('obj-schema-ActivityListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityListResponse();
-      var od = api.ActivityListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityListResponse(od as api.ActivityListResponse);
     });
   });
@@ -9442,7 +9476,9 @@
   unittest.group('obj-schema-ActivitySnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivitySnippet();
-      var od = api.ActivitySnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivitySnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivitySnippet(od as api.ActivitySnippet);
     });
   });
@@ -9450,7 +9486,9 @@
   unittest.group('obj-schema-Caption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCaption();
-      var od = api.Caption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Caption.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCaption(od as api.Caption);
     });
   });
@@ -9458,7 +9496,9 @@
   unittest.group('obj-schema-CaptionListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCaptionListResponse();
-      var od = api.CaptionListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CaptionListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCaptionListResponse(od as api.CaptionListResponse);
     });
   });
@@ -9466,7 +9506,9 @@
   unittest.group('obj-schema-CaptionSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCaptionSnippet();
-      var od = api.CaptionSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CaptionSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCaptionSnippet(od as api.CaptionSnippet);
     });
   });
@@ -9474,7 +9516,9 @@
   unittest.group('obj-schema-CdnSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCdnSettings();
-      var od = api.CdnSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CdnSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCdnSettings(od as api.CdnSettings);
     });
   });
@@ -9482,7 +9526,9 @@
   unittest.group('obj-schema-Channel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannel();
-      var od = api.Channel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Channel.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkChannel(od as api.Channel);
     });
   });
@@ -9490,7 +9536,9 @@
   unittest.group('obj-schema-ChannelAuditDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelAuditDetails();
-      var od = api.ChannelAuditDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelAuditDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelAuditDetails(od as api.ChannelAuditDetails);
     });
   });
@@ -9498,7 +9546,9 @@
   unittest.group('obj-schema-ChannelBannerResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelBannerResource();
-      var od = api.ChannelBannerResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelBannerResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelBannerResource(od as api.ChannelBannerResource);
     });
   });
@@ -9506,7 +9556,9 @@
   unittest.group('obj-schema-ChannelBrandingSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelBrandingSettings();
-      var od = api.ChannelBrandingSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelBrandingSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelBrandingSettings(od as api.ChannelBrandingSettings);
     });
   });
@@ -9514,7 +9566,9 @@
   unittest.group('obj-schema-ChannelContentDetailsRelatedPlaylists', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelContentDetailsRelatedPlaylists();
-      var od = api.ChannelContentDetailsRelatedPlaylists.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelContentDetailsRelatedPlaylists.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelContentDetailsRelatedPlaylists(
           od as api.ChannelContentDetailsRelatedPlaylists);
     });
@@ -9523,7 +9577,9 @@
   unittest.group('obj-schema-ChannelContentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelContentDetails();
-      var od = api.ChannelContentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelContentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelContentDetails(od as api.ChannelContentDetails);
     });
   });
@@ -9531,7 +9587,9 @@
   unittest.group('obj-schema-ChannelContentOwnerDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelContentOwnerDetails();
-      var od = api.ChannelContentOwnerDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelContentOwnerDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelContentOwnerDetails(od as api.ChannelContentOwnerDetails);
     });
   });
@@ -9539,7 +9597,9 @@
   unittest.group('obj-schema-ChannelConversionPing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelConversionPing();
-      var od = api.ChannelConversionPing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelConversionPing.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelConversionPing(od as api.ChannelConversionPing);
     });
   });
@@ -9547,7 +9607,9 @@
   unittest.group('obj-schema-ChannelConversionPings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelConversionPings();
-      var od = api.ChannelConversionPings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelConversionPings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelConversionPings(od as api.ChannelConversionPings);
     });
   });
@@ -9555,7 +9617,9 @@
   unittest.group('obj-schema-ChannelListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelListResponse();
-      var od = api.ChannelListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelListResponse(od as api.ChannelListResponse);
     });
   });
@@ -9563,7 +9627,9 @@
   unittest.group('obj-schema-ChannelLocalization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelLocalization();
-      var od = api.ChannelLocalization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelLocalization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelLocalization(od as api.ChannelLocalization);
     });
   });
@@ -9571,7 +9637,9 @@
   unittest.group('obj-schema-ChannelProfileDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelProfileDetails();
-      var od = api.ChannelProfileDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelProfileDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelProfileDetails(od as api.ChannelProfileDetails);
     });
   });
@@ -9579,7 +9647,9 @@
   unittest.group('obj-schema-ChannelSection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelSection();
-      var od = api.ChannelSection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelSection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelSection(od as api.ChannelSection);
     });
   });
@@ -9587,7 +9657,9 @@
   unittest.group('obj-schema-ChannelSectionContentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelSectionContentDetails();
-      var od = api.ChannelSectionContentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelSectionContentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelSectionContentDetails(od as api.ChannelSectionContentDetails);
     });
   });
@@ -9595,7 +9667,9 @@
   unittest.group('obj-schema-ChannelSectionListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelSectionListResponse();
-      var od = api.ChannelSectionListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelSectionListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelSectionListResponse(od as api.ChannelSectionListResponse);
     });
   });
@@ -9603,7 +9677,9 @@
   unittest.group('obj-schema-ChannelSectionLocalization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelSectionLocalization();
-      var od = api.ChannelSectionLocalization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelSectionLocalization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelSectionLocalization(od as api.ChannelSectionLocalization);
     });
   });
@@ -9611,7 +9687,9 @@
   unittest.group('obj-schema-ChannelSectionSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelSectionSnippet();
-      var od = api.ChannelSectionSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelSectionSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelSectionSnippet(od as api.ChannelSectionSnippet);
     });
   });
@@ -9619,7 +9697,9 @@
   unittest.group('obj-schema-ChannelSectionTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelSectionTargeting();
-      var od = api.ChannelSectionTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelSectionTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelSectionTargeting(od as api.ChannelSectionTargeting);
     });
   });
@@ -9627,7 +9707,9 @@
   unittest.group('obj-schema-ChannelSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelSettings();
-      var od = api.ChannelSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelSettings(od as api.ChannelSettings);
     });
   });
@@ -9635,7 +9717,9 @@
   unittest.group('obj-schema-ChannelSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelSnippet();
-      var od = api.ChannelSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelSnippet(od as api.ChannelSnippet);
     });
   });
@@ -9643,7 +9727,9 @@
   unittest.group('obj-schema-ChannelStatistics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelStatistics();
-      var od = api.ChannelStatistics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelStatistics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelStatistics(od as api.ChannelStatistics);
     });
   });
@@ -9651,7 +9737,9 @@
   unittest.group('obj-schema-ChannelStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelStatus();
-      var od = api.ChannelStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelStatus(od as api.ChannelStatus);
     });
   });
@@ -9659,7 +9747,9 @@
   unittest.group('obj-schema-ChannelToStoreLinkDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelToStoreLinkDetails();
-      var od = api.ChannelToStoreLinkDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelToStoreLinkDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelToStoreLinkDetails(od as api.ChannelToStoreLinkDetails);
     });
   });
@@ -9667,7 +9757,9 @@
   unittest.group('obj-schema-ChannelTopicDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildChannelTopicDetails();
-      var od = api.ChannelTopicDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ChannelTopicDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkChannelTopicDetails(od as api.ChannelTopicDetails);
     });
   });
@@ -9675,7 +9767,9 @@
   unittest.group('obj-schema-Comment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComment();
-      var od = api.Comment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Comment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkComment(od as api.Comment);
     });
   });
@@ -9683,7 +9777,9 @@
   unittest.group('obj-schema-CommentListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentListResponse();
-      var od = api.CommentListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentListResponse(od as api.CommentListResponse);
     });
   });
@@ -9691,7 +9787,9 @@
   unittest.group('obj-schema-CommentSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentSnippet();
-      var od = api.CommentSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentSnippet(od as api.CommentSnippet);
     });
   });
@@ -9699,7 +9797,9 @@
   unittest.group('obj-schema-CommentSnippetAuthorChannelId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentSnippetAuthorChannelId();
-      var od = api.CommentSnippetAuthorChannelId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentSnippetAuthorChannelId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentSnippetAuthorChannelId(
           od as api.CommentSnippetAuthorChannelId);
     });
@@ -9708,7 +9808,9 @@
   unittest.group('obj-schema-CommentThread', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentThread();
-      var od = api.CommentThread.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentThread.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentThread(od as api.CommentThread);
     });
   });
@@ -9716,7 +9818,9 @@
   unittest.group('obj-schema-CommentThreadListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentThreadListResponse();
-      var od = api.CommentThreadListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentThreadListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentThreadListResponse(od as api.CommentThreadListResponse);
     });
   });
@@ -9724,7 +9828,9 @@
   unittest.group('obj-schema-CommentThreadReplies', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentThreadReplies();
-      var od = api.CommentThreadReplies.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentThreadReplies.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentThreadReplies(od as api.CommentThreadReplies);
     });
   });
@@ -9732,7 +9838,9 @@
   unittest.group('obj-schema-CommentThreadSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommentThreadSnippet();
-      var od = api.CommentThreadSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommentThreadSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommentThreadSnippet(od as api.CommentThreadSnippet);
     });
   });
@@ -9740,7 +9848,9 @@
   unittest.group('obj-schema-ContentRating', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContentRating();
-      var od = api.ContentRating.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContentRating.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContentRating(od as api.ContentRating);
     });
   });
@@ -9748,7 +9858,9 @@
   unittest.group('obj-schema-Entity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntity();
-      var od = api.Entity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Entity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEntity(od as api.Entity);
     });
   });
@@ -9756,7 +9868,9 @@
   unittest.group('obj-schema-GeoPoint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGeoPoint();
-      var od = api.GeoPoint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GeoPoint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGeoPoint(od as api.GeoPoint);
     });
   });
@@ -9764,7 +9878,9 @@
   unittest.group('obj-schema-I18nLanguage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildI18nLanguage();
-      var od = api.I18nLanguage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.I18nLanguage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkI18nLanguage(od as api.I18nLanguage);
     });
   });
@@ -9772,7 +9888,9 @@
   unittest.group('obj-schema-I18nLanguageListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildI18nLanguageListResponse();
-      var od = api.I18nLanguageListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.I18nLanguageListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkI18nLanguageListResponse(od as api.I18nLanguageListResponse);
     });
   });
@@ -9780,7 +9898,9 @@
   unittest.group('obj-schema-I18nLanguageSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildI18nLanguageSnippet();
-      var od = api.I18nLanguageSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.I18nLanguageSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkI18nLanguageSnippet(od as api.I18nLanguageSnippet);
     });
   });
@@ -9788,7 +9908,9 @@
   unittest.group('obj-schema-I18nRegion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildI18nRegion();
-      var od = api.I18nRegion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.I18nRegion.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkI18nRegion(od as api.I18nRegion);
     });
   });
@@ -9796,7 +9918,9 @@
   unittest.group('obj-schema-I18nRegionListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildI18nRegionListResponse();
-      var od = api.I18nRegionListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.I18nRegionListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkI18nRegionListResponse(od as api.I18nRegionListResponse);
     });
   });
@@ -9804,7 +9928,9 @@
   unittest.group('obj-schema-I18nRegionSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildI18nRegionSnippet();
-      var od = api.I18nRegionSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.I18nRegionSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkI18nRegionSnippet(od as api.I18nRegionSnippet);
     });
   });
@@ -9812,7 +9938,9 @@
   unittest.group('obj-schema-ImageSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageSettings();
-      var od = api.ImageSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageSettings(od as api.ImageSettings);
     });
   });
@@ -9820,7 +9948,9 @@
   unittest.group('obj-schema-IngestionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIngestionInfo();
-      var od = api.IngestionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IngestionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIngestionInfo(od as api.IngestionInfo);
     });
   });
@@ -9828,7 +9958,9 @@
   unittest.group('obj-schema-InvideoBranding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInvideoBranding();
-      var od = api.InvideoBranding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InvideoBranding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInvideoBranding(od as api.InvideoBranding);
     });
   });
@@ -9836,7 +9968,9 @@
   unittest.group('obj-schema-InvideoPosition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInvideoPosition();
-      var od = api.InvideoPosition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InvideoPosition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInvideoPosition(od as api.InvideoPosition);
     });
   });
@@ -9844,7 +9978,9 @@
   unittest.group('obj-schema-InvideoTiming', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInvideoTiming();
-      var od = api.InvideoTiming.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InvideoTiming.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInvideoTiming(od as api.InvideoTiming);
     });
   });
@@ -9852,7 +9988,9 @@
   unittest.group('obj-schema-LanguageTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLanguageTag();
-      var od = api.LanguageTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LanguageTag.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLanguageTag(od as api.LanguageTag);
     });
   });
@@ -9860,7 +9998,9 @@
   unittest.group('obj-schema-LevelDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLevelDetails();
-      var od = api.LevelDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LevelDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLevelDetails(od as api.LevelDetails);
     });
   });
@@ -9868,7 +10008,9 @@
   unittest.group('obj-schema-LiveBroadcast', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveBroadcast();
-      var od = api.LiveBroadcast.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveBroadcast.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveBroadcast(od as api.LiveBroadcast);
     });
   });
@@ -9876,7 +10018,9 @@
   unittest.group('obj-schema-LiveBroadcastContentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveBroadcastContentDetails();
-      var od = api.LiveBroadcastContentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveBroadcastContentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveBroadcastContentDetails(od as api.LiveBroadcastContentDetails);
     });
   });
@@ -9884,7 +10028,9 @@
   unittest.group('obj-schema-LiveBroadcastListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveBroadcastListResponse();
-      var od = api.LiveBroadcastListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveBroadcastListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveBroadcastListResponse(od as api.LiveBroadcastListResponse);
     });
   });
@@ -9892,7 +10038,9 @@
   unittest.group('obj-schema-LiveBroadcastSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveBroadcastSnippet();
-      var od = api.LiveBroadcastSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveBroadcastSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveBroadcastSnippet(od as api.LiveBroadcastSnippet);
     });
   });
@@ -9900,7 +10048,9 @@
   unittest.group('obj-schema-LiveBroadcastStatistics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveBroadcastStatistics();
-      var od = api.LiveBroadcastStatistics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveBroadcastStatistics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveBroadcastStatistics(od as api.LiveBroadcastStatistics);
     });
   });
@@ -9908,7 +10058,9 @@
   unittest.group('obj-schema-LiveBroadcastStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveBroadcastStatus();
-      var od = api.LiveBroadcastStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveBroadcastStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveBroadcastStatus(od as api.LiveBroadcastStatus);
     });
   });
@@ -9916,7 +10068,9 @@
   unittest.group('obj-schema-LiveChatBan', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatBan();
-      var od = api.LiveChatBan.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatBan.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatBan(od as api.LiveChatBan);
     });
   });
@@ -9924,7 +10078,9 @@
   unittest.group('obj-schema-LiveChatBanSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatBanSnippet();
-      var od = api.LiveChatBanSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatBanSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatBanSnippet(od as api.LiveChatBanSnippet);
     });
   });
@@ -9932,7 +10088,9 @@
   unittest.group('obj-schema-LiveChatFanFundingEventDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatFanFundingEventDetails();
-      var od = api.LiveChatFanFundingEventDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatFanFundingEventDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatFanFundingEventDetails(
           od as api.LiveChatFanFundingEventDetails);
     });
@@ -9941,7 +10099,9 @@
   unittest.group('obj-schema-LiveChatMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatMessage();
-      var od = api.LiveChatMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatMessage(od as api.LiveChatMessage);
     });
   });
@@ -9949,7 +10109,9 @@
   unittest.group('obj-schema-LiveChatMessageAuthorDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatMessageAuthorDetails();
-      var od = api.LiveChatMessageAuthorDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatMessageAuthorDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatMessageAuthorDetails(od as api.LiveChatMessageAuthorDetails);
     });
   });
@@ -9957,7 +10119,9 @@
   unittest.group('obj-schema-LiveChatMessageDeletedDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatMessageDeletedDetails();
-      var od = api.LiveChatMessageDeletedDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatMessageDeletedDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatMessageDeletedDetails(
           od as api.LiveChatMessageDeletedDetails);
     });
@@ -9966,7 +10130,9 @@
   unittest.group('obj-schema-LiveChatMessageListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatMessageListResponse();
-      var od = api.LiveChatMessageListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatMessageListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatMessageListResponse(od as api.LiveChatMessageListResponse);
     });
   });
@@ -9974,7 +10140,9 @@
   unittest.group('obj-schema-LiveChatMessageRetractedDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatMessageRetractedDetails();
-      var od = api.LiveChatMessageRetractedDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatMessageRetractedDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatMessageRetractedDetails(
           od as api.LiveChatMessageRetractedDetails);
     });
@@ -9983,7 +10151,9 @@
   unittest.group('obj-schema-LiveChatMessageSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatMessageSnippet();
-      var od = api.LiveChatMessageSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatMessageSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatMessageSnippet(od as api.LiveChatMessageSnippet);
     });
   });
@@ -9991,7 +10161,9 @@
   unittest.group('obj-schema-LiveChatModerator', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatModerator();
-      var od = api.LiveChatModerator.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatModerator.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatModerator(od as api.LiveChatModerator);
     });
   });
@@ -9999,7 +10171,9 @@
   unittest.group('obj-schema-LiveChatModeratorListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatModeratorListResponse();
-      var od = api.LiveChatModeratorListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatModeratorListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatModeratorListResponse(
           od as api.LiveChatModeratorListResponse);
     });
@@ -10008,7 +10182,9 @@
   unittest.group('obj-schema-LiveChatModeratorSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatModeratorSnippet();
-      var od = api.LiveChatModeratorSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatModeratorSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatModeratorSnippet(od as api.LiveChatModeratorSnippet);
     });
   });
@@ -10016,7 +10192,9 @@
   unittest.group('obj-schema-LiveChatSuperChatDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatSuperChatDetails();
-      var od = api.LiveChatSuperChatDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatSuperChatDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatSuperChatDetails(od as api.LiveChatSuperChatDetails);
     });
   });
@@ -10024,7 +10202,9 @@
   unittest.group('obj-schema-LiveChatSuperStickerDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatSuperStickerDetails();
-      var od = api.LiveChatSuperStickerDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatSuperStickerDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatSuperStickerDetails(od as api.LiveChatSuperStickerDetails);
     });
   });
@@ -10032,7 +10212,9 @@
   unittest.group('obj-schema-LiveChatTextMessageDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatTextMessageDetails();
-      var od = api.LiveChatTextMessageDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatTextMessageDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatTextMessageDetails(od as api.LiveChatTextMessageDetails);
     });
   });
@@ -10040,7 +10222,9 @@
   unittest.group('obj-schema-LiveChatUserBannedMessageDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveChatUserBannedMessageDetails();
-      var od = api.LiveChatUserBannedMessageDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveChatUserBannedMessageDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveChatUserBannedMessageDetails(
           od as api.LiveChatUserBannedMessageDetails);
     });
@@ -10049,7 +10233,9 @@
   unittest.group('obj-schema-LiveStream', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveStream();
-      var od = api.LiveStream.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LiveStream.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLiveStream(od as api.LiveStream);
     });
   });
@@ -10057,7 +10243,9 @@
   unittest.group('obj-schema-LiveStreamConfigurationIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveStreamConfigurationIssue();
-      var od = api.LiveStreamConfigurationIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveStreamConfigurationIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveStreamConfigurationIssue(od as api.LiveStreamConfigurationIssue);
     });
   });
@@ -10065,7 +10253,9 @@
   unittest.group('obj-schema-LiveStreamContentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveStreamContentDetails();
-      var od = api.LiveStreamContentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveStreamContentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveStreamContentDetails(od as api.LiveStreamContentDetails);
     });
   });
@@ -10073,7 +10263,9 @@
   unittest.group('obj-schema-LiveStreamHealthStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveStreamHealthStatus();
-      var od = api.LiveStreamHealthStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveStreamHealthStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveStreamHealthStatus(od as api.LiveStreamHealthStatus);
     });
   });
@@ -10081,7 +10273,9 @@
   unittest.group('obj-schema-LiveStreamListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveStreamListResponse();
-      var od = api.LiveStreamListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveStreamListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveStreamListResponse(od as api.LiveStreamListResponse);
     });
   });
@@ -10089,7 +10283,9 @@
   unittest.group('obj-schema-LiveStreamSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveStreamSnippet();
-      var od = api.LiveStreamSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveStreamSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveStreamSnippet(od as api.LiveStreamSnippet);
     });
   });
@@ -10097,7 +10293,9 @@
   unittest.group('obj-schema-LiveStreamStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLiveStreamStatus();
-      var od = api.LiveStreamStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LiveStreamStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLiveStreamStatus(od as api.LiveStreamStatus);
     });
   });
@@ -10105,7 +10303,9 @@
   unittest.group('obj-schema-LocalizedProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalizedProperty();
-      var od = api.LocalizedProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalizedProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalizedProperty(od as api.LocalizedProperty);
     });
   });
@@ -10113,7 +10313,9 @@
   unittest.group('obj-schema-LocalizedString', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocalizedString();
-      var od = api.LocalizedString.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocalizedString.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocalizedString(od as api.LocalizedString);
     });
   });
@@ -10121,7 +10323,9 @@
   unittest.group('obj-schema-Member', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMember();
-      var od = api.Member.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Member.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMember(od as api.Member);
     });
   });
@@ -10129,7 +10333,9 @@
   unittest.group('obj-schema-MemberListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMemberListResponse();
-      var od = api.MemberListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MemberListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMemberListResponse(od as api.MemberListResponse);
     });
   });
@@ -10137,7 +10343,9 @@
   unittest.group('obj-schema-MemberSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMemberSnippet();
-      var od = api.MemberSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MemberSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMemberSnippet(od as api.MemberSnippet);
     });
   });
@@ -10145,7 +10353,9 @@
   unittest.group('obj-schema-MembershipsDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembershipsDetails();
-      var od = api.MembershipsDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MembershipsDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMembershipsDetails(od as api.MembershipsDetails);
     });
   });
@@ -10153,7 +10363,9 @@
   unittest.group('obj-schema-MembershipsDuration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembershipsDuration();
-      var od = api.MembershipsDuration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MembershipsDuration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMembershipsDuration(od as api.MembershipsDuration);
     });
   });
@@ -10161,7 +10373,9 @@
   unittest.group('obj-schema-MembershipsDurationAtLevel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembershipsDurationAtLevel();
-      var od = api.MembershipsDurationAtLevel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MembershipsDurationAtLevel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMembershipsDurationAtLevel(od as api.MembershipsDurationAtLevel);
     });
   });
@@ -10169,7 +10383,9 @@
   unittest.group('obj-schema-MembershipsLevel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembershipsLevel();
-      var od = api.MembershipsLevel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MembershipsLevel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMembershipsLevel(od as api.MembershipsLevel);
     });
   });
@@ -10177,7 +10393,9 @@
   unittest.group('obj-schema-MembershipsLevelListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembershipsLevelListResponse();
-      var od = api.MembershipsLevelListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MembershipsLevelListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMembershipsLevelListResponse(od as api.MembershipsLevelListResponse);
     });
   });
@@ -10185,7 +10403,9 @@
   unittest.group('obj-schema-MembershipsLevelSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMembershipsLevelSnippet();
-      var od = api.MembershipsLevelSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MembershipsLevelSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMembershipsLevelSnippet(od as api.MembershipsLevelSnippet);
     });
   });
@@ -10193,7 +10413,9 @@
   unittest.group('obj-schema-MonitorStreamInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMonitorStreamInfo();
-      var od = api.MonitorStreamInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MonitorStreamInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMonitorStreamInfo(od as api.MonitorStreamInfo);
     });
   });
@@ -10201,7 +10423,9 @@
   unittest.group('obj-schema-PageInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPageInfo();
-      var od = api.PageInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PageInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPageInfo(od as api.PageInfo);
     });
   });
@@ -10209,7 +10433,9 @@
   unittest.group('obj-schema-Playlist', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylist();
-      var od = api.Playlist.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Playlist.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPlaylist(od as api.Playlist);
     });
   });
@@ -10217,7 +10443,9 @@
   unittest.group('obj-schema-PlaylistContentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistContentDetails();
-      var od = api.PlaylistContentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistContentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistContentDetails(od as api.PlaylistContentDetails);
     });
   });
@@ -10225,7 +10453,9 @@
   unittest.group('obj-schema-PlaylistItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistItem();
-      var od = api.PlaylistItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistItem(od as api.PlaylistItem);
     });
   });
@@ -10233,7 +10463,9 @@
   unittest.group('obj-schema-PlaylistItemContentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistItemContentDetails();
-      var od = api.PlaylistItemContentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistItemContentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistItemContentDetails(od as api.PlaylistItemContentDetails);
     });
   });
@@ -10241,7 +10473,9 @@
   unittest.group('obj-schema-PlaylistItemListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistItemListResponse();
-      var od = api.PlaylistItemListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistItemListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistItemListResponse(od as api.PlaylistItemListResponse);
     });
   });
@@ -10249,7 +10483,9 @@
   unittest.group('obj-schema-PlaylistItemSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistItemSnippet();
-      var od = api.PlaylistItemSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistItemSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistItemSnippet(od as api.PlaylistItemSnippet);
     });
   });
@@ -10257,7 +10493,9 @@
   unittest.group('obj-schema-PlaylistItemStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistItemStatus();
-      var od = api.PlaylistItemStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistItemStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistItemStatus(od as api.PlaylistItemStatus);
     });
   });
@@ -10265,7 +10503,9 @@
   unittest.group('obj-schema-PlaylistListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistListResponse();
-      var od = api.PlaylistListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistListResponse(od as api.PlaylistListResponse);
     });
   });
@@ -10273,7 +10513,9 @@
   unittest.group('obj-schema-PlaylistLocalization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistLocalization();
-      var od = api.PlaylistLocalization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistLocalization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistLocalization(od as api.PlaylistLocalization);
     });
   });
@@ -10281,7 +10523,9 @@
   unittest.group('obj-schema-PlaylistPlayer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistPlayer();
-      var od = api.PlaylistPlayer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistPlayer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistPlayer(od as api.PlaylistPlayer);
     });
   });
@@ -10289,7 +10533,9 @@
   unittest.group('obj-schema-PlaylistSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistSnippet();
-      var od = api.PlaylistSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistSnippet(od as api.PlaylistSnippet);
     });
   });
@@ -10297,7 +10543,9 @@
   unittest.group('obj-schema-PlaylistStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlaylistStatus();
-      var od = api.PlaylistStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlaylistStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlaylistStatus(od as api.PlaylistStatus);
     });
   });
@@ -10305,7 +10553,9 @@
   unittest.group('obj-schema-PropertyValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPropertyValue();
-      var od = api.PropertyValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PropertyValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPropertyValue(od as api.PropertyValue);
     });
   });
@@ -10313,7 +10563,9 @@
   unittest.group('obj-schema-RelatedEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelatedEntity();
-      var od = api.RelatedEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RelatedEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRelatedEntity(od as api.RelatedEntity);
     });
   });
@@ -10321,7 +10573,9 @@
   unittest.group('obj-schema-ResourceId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceId();
-      var od = api.ResourceId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ResourceId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResourceId(od as api.ResourceId);
     });
   });
@@ -10329,7 +10583,9 @@
   unittest.group('obj-schema-SearchListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchListResponse();
-      var od = api.SearchListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchListResponse(od as api.SearchListResponse);
     });
   });
@@ -10337,7 +10593,9 @@
   unittest.group('obj-schema-SearchResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchResult();
-      var od = api.SearchResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchResult(od as api.SearchResult);
     });
   });
@@ -10345,7 +10603,9 @@
   unittest.group('obj-schema-SearchResultSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchResultSnippet();
-      var od = api.SearchResultSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchResultSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchResultSnippet(od as api.SearchResultSnippet);
     });
   });
@@ -10353,7 +10613,9 @@
   unittest.group('obj-schema-Subscription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscription();
-      var od = api.Subscription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Subscription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscription(od as api.Subscription);
     });
   });
@@ -10361,7 +10623,9 @@
   unittest.group('obj-schema-SubscriptionContentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionContentDetails();
-      var od = api.SubscriptionContentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionContentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionContentDetails(od as api.SubscriptionContentDetails);
     });
   });
@@ -10369,7 +10633,9 @@
   unittest.group('obj-schema-SubscriptionListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionListResponse();
-      var od = api.SubscriptionListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionListResponse(od as api.SubscriptionListResponse);
     });
   });
@@ -10377,7 +10643,9 @@
   unittest.group('obj-schema-SubscriptionSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionSnippet();
-      var od = api.SubscriptionSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionSnippet(od as api.SubscriptionSnippet);
     });
   });
@@ -10385,7 +10653,9 @@
   unittest.group('obj-schema-SubscriptionSubscriberSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubscriptionSubscriberSnippet();
-      var od = api.SubscriptionSubscriberSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubscriptionSubscriberSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubscriptionSubscriberSnippet(
           od as api.SubscriptionSubscriberSnippet);
     });
@@ -10394,7 +10664,9 @@
   unittest.group('obj-schema-SuperChatEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuperChatEvent();
-      var od = api.SuperChatEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuperChatEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuperChatEvent(od as api.SuperChatEvent);
     });
   });
@@ -10402,7 +10674,9 @@
   unittest.group('obj-schema-SuperChatEventListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuperChatEventListResponse();
-      var od = api.SuperChatEventListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuperChatEventListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuperChatEventListResponse(od as api.SuperChatEventListResponse);
     });
   });
@@ -10410,7 +10684,9 @@
   unittest.group('obj-schema-SuperChatEventSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuperChatEventSnippet();
-      var od = api.SuperChatEventSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuperChatEventSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuperChatEventSnippet(od as api.SuperChatEventSnippet);
     });
   });
@@ -10418,7 +10694,9 @@
   unittest.group('obj-schema-SuperStickerMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuperStickerMetadata();
-      var od = api.SuperStickerMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuperStickerMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuperStickerMetadata(od as api.SuperStickerMetadata);
     });
   });
@@ -10426,7 +10704,9 @@
   unittest.group('obj-schema-TestItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestItem();
-      var od = api.TestItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestItem.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestItem(od as api.TestItem);
     });
   });
@@ -10434,7 +10714,9 @@
   unittest.group('obj-schema-TestItemTestItemSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestItemTestItemSnippet();
-      var od = api.TestItemTestItemSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestItemTestItemSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestItemTestItemSnippet(od as api.TestItemTestItemSnippet);
     });
   });
@@ -10442,7 +10724,9 @@
   unittest.group('obj-schema-ThirdPartyLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThirdPartyLink();
-      var od = api.ThirdPartyLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThirdPartyLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThirdPartyLink(od as api.ThirdPartyLink);
     });
   });
@@ -10450,7 +10734,9 @@
   unittest.group('obj-schema-ThirdPartyLinkSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThirdPartyLinkSnippet();
-      var od = api.ThirdPartyLinkSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThirdPartyLinkSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThirdPartyLinkSnippet(od as api.ThirdPartyLinkSnippet);
     });
   });
@@ -10458,7 +10744,9 @@
   unittest.group('obj-schema-ThirdPartyLinkStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThirdPartyLinkStatus();
-      var od = api.ThirdPartyLinkStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThirdPartyLinkStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThirdPartyLinkStatus(od as api.ThirdPartyLinkStatus);
     });
   });
@@ -10466,7 +10754,9 @@
   unittest.group('obj-schema-Thumbnail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThumbnail();
-      var od = api.Thumbnail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Thumbnail.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkThumbnail(od as api.Thumbnail);
     });
   });
@@ -10474,7 +10764,9 @@
   unittest.group('obj-schema-ThumbnailDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThumbnailDetails();
-      var od = api.ThumbnailDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThumbnailDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThumbnailDetails(od as api.ThumbnailDetails);
     });
   });
@@ -10482,7 +10774,9 @@
   unittest.group('obj-schema-ThumbnailSetResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThumbnailSetResponse();
-      var od = api.ThumbnailSetResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ThumbnailSetResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkThumbnailSetResponse(od as api.ThumbnailSetResponse);
     });
   });
@@ -10490,7 +10784,9 @@
   unittest.group('obj-schema-TokenPagination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTokenPagination();
-      var od = api.TokenPagination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TokenPagination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTokenPagination(od as api.TokenPagination);
     });
   });
@@ -10498,7 +10794,8 @@
   unittest.group('obj-schema-Video', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideo();
-      var od = api.Video.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Video.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVideo(od as api.Video);
     });
   });
@@ -10506,7 +10803,9 @@
   unittest.group('obj-schema-VideoAbuseReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoAbuseReport();
-      var od = api.VideoAbuseReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoAbuseReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoAbuseReport(od as api.VideoAbuseReport);
     });
   });
@@ -10514,7 +10813,9 @@
   unittest.group('obj-schema-VideoAbuseReportReason', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoAbuseReportReason();
-      var od = api.VideoAbuseReportReason.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoAbuseReportReason.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoAbuseReportReason(od as api.VideoAbuseReportReason);
     });
   });
@@ -10522,7 +10823,9 @@
   unittest.group('obj-schema-VideoAbuseReportReasonListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoAbuseReportReasonListResponse();
-      var od = api.VideoAbuseReportReasonListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoAbuseReportReasonListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoAbuseReportReasonListResponse(
           od as api.VideoAbuseReportReasonListResponse);
     });
@@ -10531,7 +10834,9 @@
   unittest.group('obj-schema-VideoAbuseReportReasonSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoAbuseReportReasonSnippet();
-      var od = api.VideoAbuseReportReasonSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoAbuseReportReasonSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoAbuseReportReasonSnippet(
           od as api.VideoAbuseReportReasonSnippet);
     });
@@ -10540,7 +10845,9 @@
   unittest.group('obj-schema-VideoAbuseReportSecondaryReason', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoAbuseReportSecondaryReason();
-      var od = api.VideoAbuseReportSecondaryReason.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoAbuseReportSecondaryReason.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoAbuseReportSecondaryReason(
           od as api.VideoAbuseReportSecondaryReason);
     });
@@ -10549,7 +10856,9 @@
   unittest.group('obj-schema-VideoAgeGating', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoAgeGating();
-      var od = api.VideoAgeGating.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoAgeGating.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoAgeGating(od as api.VideoAgeGating);
     });
   });
@@ -10557,7 +10866,9 @@
   unittest.group('obj-schema-VideoCategory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoCategory();
-      var od = api.VideoCategory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoCategory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoCategory(od as api.VideoCategory);
     });
   });
@@ -10565,7 +10876,9 @@
   unittest.group('obj-schema-VideoCategoryListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoCategoryListResponse();
-      var od = api.VideoCategoryListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoCategoryListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoCategoryListResponse(od as api.VideoCategoryListResponse);
     });
   });
@@ -10573,7 +10886,9 @@
   unittest.group('obj-schema-VideoCategorySnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoCategorySnippet();
-      var od = api.VideoCategorySnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoCategorySnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoCategorySnippet(od as api.VideoCategorySnippet);
     });
   });
@@ -10581,7 +10896,9 @@
   unittest.group('obj-schema-VideoContentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoContentDetails();
-      var od = api.VideoContentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoContentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoContentDetails(od as api.VideoContentDetails);
     });
   });
@@ -10589,7 +10906,9 @@
   unittest.group('obj-schema-VideoContentDetailsRegionRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoContentDetailsRegionRestriction();
-      var od = api.VideoContentDetailsRegionRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoContentDetailsRegionRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoContentDetailsRegionRestriction(
           od as api.VideoContentDetailsRegionRestriction);
     });
@@ -10598,7 +10917,9 @@
   unittest.group('obj-schema-VideoFileDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoFileDetails();
-      var od = api.VideoFileDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoFileDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoFileDetails(od as api.VideoFileDetails);
     });
   });
@@ -10606,7 +10927,9 @@
   unittest.group('obj-schema-VideoFileDetailsAudioStream', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoFileDetailsAudioStream();
-      var od = api.VideoFileDetailsAudioStream.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoFileDetailsAudioStream.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoFileDetailsAudioStream(od as api.VideoFileDetailsAudioStream);
     });
   });
@@ -10614,7 +10937,9 @@
   unittest.group('obj-schema-VideoFileDetailsVideoStream', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoFileDetailsVideoStream();
-      var od = api.VideoFileDetailsVideoStream.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoFileDetailsVideoStream.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoFileDetailsVideoStream(od as api.VideoFileDetailsVideoStream);
     });
   });
@@ -10622,7 +10947,9 @@
   unittest.group('obj-schema-VideoListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoListResponse();
-      var od = api.VideoListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoListResponse(od as api.VideoListResponse);
     });
   });
@@ -10630,7 +10957,9 @@
   unittest.group('obj-schema-VideoLiveStreamingDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoLiveStreamingDetails();
-      var od = api.VideoLiveStreamingDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoLiveStreamingDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoLiveStreamingDetails(od as api.VideoLiveStreamingDetails);
     });
   });
@@ -10638,7 +10967,9 @@
   unittest.group('obj-schema-VideoLocalization', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoLocalization();
-      var od = api.VideoLocalization.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoLocalization.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoLocalization(od as api.VideoLocalization);
     });
   });
@@ -10646,7 +10977,9 @@
   unittest.group('obj-schema-VideoMonetizationDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoMonetizationDetails();
-      var od = api.VideoMonetizationDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoMonetizationDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoMonetizationDetails(od as api.VideoMonetizationDetails);
     });
   });
@@ -10654,7 +10987,9 @@
   unittest.group('obj-schema-VideoPlayer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoPlayer();
-      var od = api.VideoPlayer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoPlayer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoPlayer(od as api.VideoPlayer);
     });
   });
@@ -10662,7 +10997,9 @@
   unittest.group('obj-schema-VideoProcessingDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoProcessingDetails();
-      var od = api.VideoProcessingDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoProcessingDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoProcessingDetails(od as api.VideoProcessingDetails);
     });
   });
@@ -10670,8 +11007,9 @@
   unittest.group('obj-schema-VideoProcessingDetailsProcessingProgress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoProcessingDetailsProcessingProgress();
-      var od =
-          api.VideoProcessingDetailsProcessingProgress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoProcessingDetailsProcessingProgress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoProcessingDetailsProcessingProgress(
           od as api.VideoProcessingDetailsProcessingProgress);
     });
@@ -10680,7 +11018,9 @@
   unittest.group('obj-schema-VideoProjectDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoProjectDetails();
-      var od = api.VideoProjectDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoProjectDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoProjectDetails(od as api.VideoProjectDetails);
     });
   });
@@ -10688,7 +11028,9 @@
   unittest.group('obj-schema-VideoRating', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoRating();
-      var od = api.VideoRating.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoRating.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoRating(od as api.VideoRating);
     });
   });
@@ -10696,7 +11038,9 @@
   unittest.group('obj-schema-VideoRatingListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoRatingListResponse();
-      var od = api.VideoRatingListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoRatingListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoRatingListResponse(od as api.VideoRatingListResponse);
     });
   });
@@ -10704,7 +11048,9 @@
   unittest.group('obj-schema-VideoRecordingDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoRecordingDetails();
-      var od = api.VideoRecordingDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoRecordingDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoRecordingDetails(od as api.VideoRecordingDetails);
     });
   });
@@ -10712,7 +11058,9 @@
   unittest.group('obj-schema-VideoSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoSnippet();
-      var od = api.VideoSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoSnippet(od as api.VideoSnippet);
     });
   });
@@ -10720,7 +11068,9 @@
   unittest.group('obj-schema-VideoStatistics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoStatistics();
-      var od = api.VideoStatistics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoStatistics.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoStatistics(od as api.VideoStatistics);
     });
   });
@@ -10728,7 +11078,9 @@
   unittest.group('obj-schema-VideoStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoStatus();
-      var od = api.VideoStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoStatus(od as api.VideoStatus);
     });
   });
@@ -10736,7 +11088,9 @@
   unittest.group('obj-schema-VideoSuggestions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoSuggestions();
-      var od = api.VideoSuggestions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoSuggestions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoSuggestions(od as api.VideoSuggestions);
     });
   });
@@ -10744,7 +11098,9 @@
   unittest.group('obj-schema-VideoSuggestionsTagSuggestion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoSuggestionsTagSuggestion();
-      var od = api.VideoSuggestionsTagSuggestion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoSuggestionsTagSuggestion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoSuggestionsTagSuggestion(
           od as api.VideoSuggestionsTagSuggestion);
     });
@@ -10753,7 +11109,9 @@
   unittest.group('obj-schema-VideoTopicDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoTopicDetails();
-      var od = api.VideoTopicDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoTopicDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoTopicDetails(od as api.VideoTopicDetails);
     });
   });
@@ -10761,7 +11119,9 @@
   unittest.group('obj-schema-WatchSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWatchSettings();
-      var od = api.WatchSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WatchSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWatchSettings(od as api.WatchSettings);
     });
   });
diff --git a/generated/googleapis/test/youtubeanalytics/v2_test.dart b/generated/googleapis/test/youtubeanalytics/v2_test.dart
index aab00c1..1b490df 100644
--- a/generated/googleapis/test/youtubeanalytics/v2_test.dart
+++ b/generated/googleapis/test/youtubeanalytics/v2_test.dart
@@ -546,7 +546,9 @@
   unittest.group('obj-schema-EmptyResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmptyResponse();
-      var od = api.EmptyResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EmptyResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEmptyResponse(od as api.EmptyResponse);
     });
   });
@@ -554,7 +556,9 @@
   unittest.group('obj-schema-ErrorProto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorProto();
-      var od = api.ErrorProto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ErrorProto.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkErrorProto(od as api.ErrorProto);
     });
   });
@@ -562,7 +566,9 @@
   unittest.group('obj-schema-Errors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrors();
-      var od = api.Errors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Errors.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkErrors(od as api.Errors);
     });
   });
@@ -570,7 +576,8 @@
   unittest.group('obj-schema-Group', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroup();
-      var od = api.Group.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Group.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGroup(od as api.Group);
     });
   });
@@ -578,7 +585,9 @@
   unittest.group('obj-schema-GroupContentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupContentDetails();
-      var od = api.GroupContentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupContentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupContentDetails(od as api.GroupContentDetails);
     });
   });
@@ -586,7 +595,9 @@
   unittest.group('obj-schema-GroupItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupItem();
-      var od = api.GroupItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GroupItem.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGroupItem(od as api.GroupItem);
     });
   });
@@ -594,7 +605,9 @@
   unittest.group('obj-schema-GroupItemResource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupItemResource();
-      var od = api.GroupItemResource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupItemResource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupItemResource(od as api.GroupItemResource);
     });
   });
@@ -602,7 +615,9 @@
   unittest.group('obj-schema-GroupSnippet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGroupSnippet();
-      var od = api.GroupSnippet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GroupSnippet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGroupSnippet(od as api.GroupSnippet);
     });
   });
@@ -610,7 +625,9 @@
   unittest.group('obj-schema-ListGroupItemsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGroupItemsResponse();
-      var od = api.ListGroupItemsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGroupItemsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGroupItemsResponse(od as api.ListGroupItemsResponse);
     });
   });
@@ -618,7 +635,9 @@
   unittest.group('obj-schema-ListGroupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGroupsResponse();
-      var od = api.ListGroupsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGroupsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGroupsResponse(od as api.ListGroupsResponse);
     });
   });
@@ -626,7 +645,9 @@
   unittest.group('obj-schema-QueryResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryResponse();
-      var od = api.QueryResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QueryResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQueryResponse(od as api.QueryResponse);
     });
   });
@@ -634,7 +655,9 @@
   unittest.group('obj-schema-ResultTableColumnHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultTableColumnHeader();
-      var od = api.ResultTableColumnHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultTableColumnHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultTableColumnHeader(od as api.ResultTableColumnHeader);
     });
   });
diff --git a/generated/googleapis/test/youtubereporting/v1_test.dart b/generated/googleapis/test/youtubereporting/v1_test.dart
index e53b40e..5cfb2b0 100644
--- a/generated/googleapis/test/youtubereporting/v1_test.dart
+++ b/generated/googleapis/test/youtubereporting/v1_test.dart
@@ -772,7 +772,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -780,7 +781,9 @@
   unittest.group('obj-schema-GdataBlobstore2Info', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataBlobstore2Info();
-      var od = api.GdataBlobstore2Info.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GdataBlobstore2Info.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGdataBlobstore2Info(od as api.GdataBlobstore2Info);
     });
   });
@@ -788,7 +791,9 @@
   unittest.group('obj-schema-GdataCompositeMedia', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataCompositeMedia();
-      var od = api.GdataCompositeMedia.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GdataCompositeMedia.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGdataCompositeMedia(od as api.GdataCompositeMedia);
     });
   });
@@ -796,7 +801,9 @@
   unittest.group('obj-schema-GdataContentTypeInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataContentTypeInfo();
-      var od = api.GdataContentTypeInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GdataContentTypeInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGdataContentTypeInfo(od as api.GdataContentTypeInfo);
     });
   });
@@ -804,7 +811,9 @@
   unittest.group('obj-schema-GdataDiffChecksumsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataDiffChecksumsResponse();
-      var od = api.GdataDiffChecksumsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GdataDiffChecksumsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGdataDiffChecksumsResponse(od as api.GdataDiffChecksumsResponse);
     });
   });
@@ -812,7 +821,9 @@
   unittest.group('obj-schema-GdataDiffDownloadResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataDiffDownloadResponse();
-      var od = api.GdataDiffDownloadResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GdataDiffDownloadResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGdataDiffDownloadResponse(od as api.GdataDiffDownloadResponse);
     });
   });
@@ -820,7 +831,9 @@
   unittest.group('obj-schema-GdataDiffUploadRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataDiffUploadRequest();
-      var od = api.GdataDiffUploadRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GdataDiffUploadRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGdataDiffUploadRequest(od as api.GdataDiffUploadRequest);
     });
   });
@@ -828,7 +841,9 @@
   unittest.group('obj-schema-GdataDiffUploadResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataDiffUploadResponse();
-      var od = api.GdataDiffUploadResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GdataDiffUploadResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGdataDiffUploadResponse(od as api.GdataDiffUploadResponse);
     });
   });
@@ -836,7 +851,9 @@
   unittest.group('obj-schema-GdataDiffVersionResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataDiffVersionResponse();
-      var od = api.GdataDiffVersionResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GdataDiffVersionResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGdataDiffVersionResponse(od as api.GdataDiffVersionResponse);
     });
   });
@@ -844,7 +861,9 @@
   unittest.group('obj-schema-GdataDownloadParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataDownloadParameters();
-      var od = api.GdataDownloadParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GdataDownloadParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGdataDownloadParameters(od as api.GdataDownloadParameters);
     });
   });
@@ -852,7 +871,9 @@
   unittest.group('obj-schema-GdataMedia', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataMedia();
-      var od = api.GdataMedia.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GdataMedia.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGdataMedia(od as api.GdataMedia);
     });
   });
@@ -860,7 +881,9 @@
   unittest.group('obj-schema-GdataObjectId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGdataObjectId();
-      var od = api.GdataObjectId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GdataObjectId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGdataObjectId(od as api.GdataObjectId);
     });
   });
@@ -868,7 +891,8 @@
   unittest.group('obj-schema-Job', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJob();
-      var od = api.Job.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Job.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJob(od as api.Job);
     });
   });
@@ -876,7 +900,9 @@
   unittest.group('obj-schema-ListJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListJobsResponse();
-      var od = api.ListJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
@@ -884,7 +910,9 @@
   unittest.group('obj-schema-ListReportTypesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListReportTypesResponse();
-      var od = api.ListReportTypesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListReportTypesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListReportTypesResponse(od as api.ListReportTypesResponse);
     });
   });
@@ -892,7 +920,9 @@
   unittest.group('obj-schema-ListReportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListReportsResponse();
-      var od = api.ListReportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListReportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListReportsResponse(od as api.ListReportsResponse);
     });
   });
@@ -900,7 +930,9 @@
   unittest.group('obj-schema-Report', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReport();
-      var od = api.Report.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Report.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReport(od as api.Report);
     });
   });
@@ -908,7 +940,9 @@
   unittest.group('obj-schema-ReportType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportType();
-      var od = api.ReportType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ReportType.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReportType(od as api.ReportType);
     });
   });
diff --git a/generated/googleapis_beta/lib/adexchangebuyer2/v2beta1.dart b/generated/googleapis_beta/lib/adexchangebuyer2/v2beta1.dart
index 3638213..9def9f8 100644
--- a/generated/googleapis_beta/lib/adexchangebuyer2/v2beta1.dart
+++ b/generated/googleapis_beta/lib/adexchangebuyer2/v2beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3743,7 +3742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!.toJson(),
         if (startDate != null) 'startDate': startDate!.toJson(),
       };
@@ -3762,7 +3761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (proposalRevision != null) 'proposalRevision': proposalRevision!,
       };
 }
@@ -3803,7 +3802,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (sizeType != null) 'sizeType': sizeType!,
         if (width != null) 'width': width!,
@@ -3849,7 +3848,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedProviderIds != null)
           'detectedProviderIds': detectedProviderIds!,
         if (hasUnidentifiedProvider != null)
@@ -3871,7 +3870,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (association != null) 'association': association!.toJson(),
       };
 }
@@ -3890,7 +3889,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (note != null) 'note': note!.toJson(),
       };
 }
@@ -3912,7 +3911,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appTypes != null) 'appTypes': appTypes!,
       };
 }
@@ -3934,7 +3933,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auctionTypes != null) 'auctionTypes': auctionTypes!,
       };
 }
@@ -4008,7 +4007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bids != null) 'bids': bids!.toJson(),
         if (bidsInAuction != null) 'bidsInAuction': bidsInAuction!.toJson(),
         if (billedImpressions != null)
@@ -4067,7 +4066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (impressionCount != null)
           'impressionCount': impressionCount!.toJson(),
         if (rowDimensions != null) 'rowDimensions': rowDimensions!.toJson(),
@@ -4090,7 +4089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
       };
 }
@@ -4128,7 +4127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calloutStatusId != null) 'calloutStatusId': calloutStatusId!,
         if (impressionCount != null)
           'impressionCount': impressionCount!.toJson(),
@@ -4144,7 +4143,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A client resource represents a client buyer—an agency, a brand, or an
@@ -4274,7 +4273,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientAccountId != null) 'clientAccountId': clientAccountId!,
         if (clientName != null) 'clientName': clientName!,
         if (entityId != null) 'entityId': entityId!,
@@ -4338,7 +4337,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientAccountId != null) 'clientAccountId': clientAccountId!,
         if (email != null) 'email': email!,
         if (status != null) 'status': status!,
@@ -4382,7 +4381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientAccountId != null) 'clientAccountId': clientAccountId!,
         if (email != null) 'email': email!,
         if (invitationId != null) 'invitationId': invitationId!,
@@ -4397,7 +4396,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Contains information on how a buyer or seller can be reached.
@@ -4419,7 +4418,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (name != null) 'name': name!,
       };
@@ -4482,7 +4481,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contexts != null)
           'contexts': contexts!.map((value) => value.toJson()).toList(),
         if (details != null) 'details': details!,
@@ -4771,7 +4770,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (adChoicesDestinationUrl != null)
           'adChoicesDestinationUrl': adChoicesDestinationUrl!,
@@ -4837,7 +4836,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (creativeId != null) 'creativeId': creativeId!,
         if (dealsId != null) 'dealsId': dealsId!,
@@ -4889,7 +4888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeFormat != null) 'creativeFormat': creativeFormat!,
         if (creativeSpecifications != null)
           'creativeSpecifications':
@@ -4986,7 +4985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedFormats != null) 'allowedFormats': allowedFormats!,
         if (companionSizes != null)
           'companionSizes':
@@ -5022,7 +5021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeCompanionSizes != null)
           'creativeCompanionSizes':
               creativeCompanionSizes!.map((value) => value.toJson()).toList(),
@@ -5062,7 +5061,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidCount != null) 'bidCount': bidCount!.toJson(),
         if (creativeStatusId != null) 'creativeStatusId': creativeStatusId!,
         if (rowDimensions != null) 'rowDimensions': rowDimensions!.toJson(),
@@ -5093,7 +5092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedCriteriaIds != null)
           'excludedCriteriaIds': excludedCriteriaIds!,
         if (targetedCriteriaIds != null)
@@ -5141,7 +5140,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -5194,7 +5193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dayOfWeek != null) 'dayOfWeek': dayOfWeek!,
         if (endTime != null) 'endTime': endTime!.toJson(),
         if (startTime != null) 'startTime': startTime!.toJson(),
@@ -5228,7 +5227,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dayParts != null)
           'dayParts': dayParts!.map((value) => value.toJson()).toList(),
         if (timeZoneType != null) 'timeZoneType': timeZoneType!,
@@ -5497,7 +5496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableEndTime != null) 'availableEndTime': availableEndTime!,
         if (availableStartTime != null)
           'availableStartTime': availableStartTime!,
@@ -5585,7 +5584,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buyerPauseReason != null) 'buyerPauseReason': buyerPauseReason!,
         if (firstPausedBy != null) 'firstPausedBy': firstPausedBy!,
         if (hasBuyerPaused != null) 'hasBuyerPaused': hasBuyerPaused!,
@@ -5610,7 +5609,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dealPauseStatus != null)
           'dealPauseStatus': dealPauseStatus!.toJson(),
       };
@@ -5699,7 +5698,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (brandingType != null) 'brandingType': brandingType!,
         if (description != null) 'description': description!,
         if (estimatedGrossSpend != null)
@@ -5763,7 +5762,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeBlockingLevel != null)
           'creativeBlockingLevel': creativeBlockingLevel!,
         if (deliveryRateType != null) 'deliveryRateType': deliveryRateType!,
@@ -5950,7 +5949,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (details != null) 'details': details!,
         if (reason != null) 'reason': reason!,
       };
@@ -5970,7 +5969,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A set of filters that is applied to a request for data.
@@ -6144,7 +6143,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (absoluteDateRange != null)
           'absoluteDateRange': absoluteDateRange!.toJson(),
         if (breakdownDimensions != null)
@@ -6196,7 +6195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidCount != null) 'bidCount': bidCount!.toJson(),
         if (creativeId != null) 'creativeId': creativeId!,
         if (rowDimensions != null) 'rowDimensions': rowDimensions!.toJson(),
@@ -6247,7 +6246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidCount != null) 'bidCount': bidCount!.toJson(),
         if (detail != null) 'detail': detail!,
         if (detailId != null) 'detailId': detailId!,
@@ -6284,7 +6283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedAppIds != null) 'excludedAppIds': excludedAppIds!,
         if (targetedAppIds != null) 'targetedAppIds': targetedAppIds!,
       };
@@ -6332,7 +6331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (maxImpressions != null) 'maxImpressions': maxImpressions!,
         if (numTimeUnits != null) 'numTimeUnits': numTimeUnits!,
         if (timeUnitType != null) 'timeUnitType': timeUnitType!,
@@ -6378,7 +6377,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixedPrices != null)
           'fixedPrices': fixedPrices!.map((value) => value.toJson()).toList(),
         if (guaranteedImpressions != null)
@@ -6413,7 +6412,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (snippet != null) 'snippet': snippet!,
         if (width != null) 'width': width!,
@@ -6448,7 +6447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (url != null) 'url': url!,
         if (width != null) 'width': width!,
@@ -6511,7 +6510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableImpressions != null)
           'availableImpressions': availableImpressions!.toJson(),
         if (bidRequests != null) 'bidRequests': bidRequests!.toJson(),
@@ -6554,7 +6553,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedInventorySizes != null)
           'excludedInventorySizes':
               excludedInventorySizes!.map((value) => value.toJson()).toList(),
@@ -6591,7 +6590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidMetricsRows != null)
           'bidMetricsRows':
               bidMetricsRows!.map((value) => value.toJson()).toList(),
@@ -6626,7 +6625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calloutStatusRows != null)
           'calloutStatusRows':
               calloutStatusRows!.map((value) => value.toJson()).toList(),
@@ -6664,7 +6663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidResponseWithoutBidsStatusRows != null)
           'bidResponseWithoutBidsStatusRows': bidResponseWithoutBidsStatusRows!
               .map((value) => value.toJson())
@@ -6698,7 +6697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (invitations != null)
           'invitations': invitations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6730,7 +6729,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (users != null)
           'users': users!.map((value) => value.toJson()).toList(),
@@ -6762,7 +6761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clients != null)
           'clients': clients!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6799,7 +6798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filteredBidCreativeRows != null)
           'filteredBidCreativeRows':
               filteredBidCreativeRows!.map((value) => value.toJson()).toList(),
@@ -6872,7 +6871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detailType != null) 'detailType': detailType!,
         if (filteredBidDetailRows != null)
           'filteredBidDetailRows':
@@ -6907,7 +6906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creatives != null)
           'creatives': creatives!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6941,7 +6940,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (associations != null)
           'associations': associations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -6974,7 +6973,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filterSets != null)
           'filterSets': filterSets!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -7009,7 +7008,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (calloutStatusRows != null)
           'calloutStatusRows':
               calloutStatusRows!.map((value) => value.toJson()).toList(),
@@ -7045,7 +7044,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeStatusRows != null)
           'creativeStatusRows':
               creativeStatusRows!.map((value) => value.toJson()).toList(),
@@ -7080,7 +7079,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (impressionMetricsRows != null)
           'impressionMetricsRows':
               impressionMetricsRows!.map((value) => value.toJson()).toList(),
@@ -7115,7 +7114,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeStatusRows != null)
           'creativeStatusRows':
               creativeStatusRows!.map((value) => value.toJson()).toList(),
@@ -7152,7 +7151,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (nonBillableWinningBidStatusRows != null)
           'nonBillableWinningBidStatusRows': nonBillableWinningBidStatusRows!
@@ -7183,7 +7182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (products != null)
           'products': products!.map((value) => value.toJson()).toList(),
@@ -7212,7 +7211,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (proposals != null)
           'proposals': proposals!.map((value) => value.toJson()).toList(),
@@ -7241,7 +7240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (publisherProfiles != null)
           'publisherProfiles':
@@ -7270,7 +7269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (geoCriteriaIds != null) 'geoCriteriaIds': geoCriteriaIds!,
       };
 }
@@ -7323,7 +7322,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (geoTargeting != null) 'geoTargeting': geoTargeting!.toJson(),
         if (inventorySizeTargeting != null)
           'inventorySizeTargeting': inventorySizeTargeting!.toJson(),
@@ -7361,7 +7360,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (value != null) 'value': value!,
         if (variance != null) 'variance': variance!,
       };
@@ -7382,7 +7381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firstPartyTargeting != null)
           'firstPartyTargeting': firstPartyTargeting!.toJson(),
       };
@@ -7421,7 +7420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -7518,7 +7517,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserName != null) 'advertiserName': advertiserName!,
         if (appIcon != null) 'appIcon': appIcon!.toJson(),
         if (body != null) 'body': body!,
@@ -7574,7 +7573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bidCount != null) 'bidCount': bidCount!.toJson(),
         if (rowDimensions != null) 'rowDimensions': rowDimensions!.toJson(),
         if (status != null) 'status': status!,
@@ -7608,7 +7607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoOptimizePrivateAuction != null)
           'autoOptimizePrivateAuction': autoOptimizePrivateAuction!,
         if (reservePricesPerBuyer != null)
@@ -7636,7 +7635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixedPrices != null)
           'fixedPrices': fixedPrices!.map((value) => value.toJson()).toList(),
       };
@@ -7696,7 +7695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (creatorRole != null) 'creatorRole': creatorRole!,
         if (note != null) 'note': note!,
@@ -7728,7 +7727,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatingSystemCriteria != null)
           'operatingSystemCriteria': operatingSystemCriteria!.toJson(),
         if (operatingSystemVersionCriteria != null)
@@ -7753,7 +7752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reason != null) 'reason': reason!,
       };
 }
@@ -7785,7 +7784,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mobileApplicationTargeting != null)
           'mobileApplicationTargeting': mobileApplicationTargeting!.toJson(),
         if (urlTargeting != null) 'urlTargeting': urlTargeting!.toJson(),
@@ -7809,7 +7808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (platforms != null) 'platforms': platforms!,
       };
 }
@@ -7842,7 +7841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (amount != null) 'amount': amount!.toJson(),
         if (pricingType != null) 'pricingType': pricingType!,
       };
@@ -7888,7 +7887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (advertiserIds != null) 'advertiserIds': advertiserIds!,
         if (buyer != null) 'buyer': buyer!.toJson(),
         if (price != null) 'price': price!.toJson(),
@@ -7912,7 +7911,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (referenceId != null) 'referenceId': referenceId!,
       };
 }
@@ -8050,7 +8049,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableEndTime != null) 'availableEndTime': availableEndTime!,
         if (availableStartTime != null)
           'availableStartTime': availableStartTime!,
@@ -8287,7 +8286,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (billedBuyer != null) 'billedBuyer': billedBuyer!.toJson(),
         if (buyer != null) 'buyer': buyer!.toJson(),
         if (buyerContacts != null)
@@ -8470,7 +8469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audienceDescription != null)
           'audienceDescription': audienceDescription!,
         if (buyerPitchStatement != null)
@@ -8536,7 +8535,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appStore != null) 'appStore': appStore!,
         if (externalAppId != null) 'externalAppId': externalAppId!,
         if (name != null) 'name': name!,
@@ -8559,7 +8558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (startTimestamp != null) 'startTimestamp': startTimestamp!,
       };
 }
@@ -8591,7 +8590,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (durationDays != null) 'durationDays': durationDays!,
         if (offsetDays != null) 'offsetDays': offsetDays!,
       };
@@ -8611,7 +8610,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (association != null) 'association': association!.toJson(),
       };
 }
@@ -8625,7 +8624,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A response may include multiple rows, breaking down along various
@@ -8653,7 +8652,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publisherIdentifier != null)
           'publisherIdentifier': publisherIdentifier!,
         if (timeInterval != null) 'timeInterval': timeInterval!.toJson(),
@@ -8677,7 +8676,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (securities != null) 'securities': securities!,
       };
 }
@@ -8706,7 +8705,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountId != null) 'accountId': accountId!,
         if (subAccountId != null) 'subAccountId': subAccountId!,
       };
@@ -8763,7 +8762,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (all != null) 'all': all!,
         if (appType != null) 'appType': appType!.toJson(),
         if (auctionType != null) 'auctionType': auctionType!.toJson(),
@@ -8829,7 +8828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contexts != null)
           'contexts': contexts!.map((value) => value.toJson()).toList(),
         if (disapproval != null) 'disapproval': disapproval!.toJson(),
@@ -8861,7 +8860,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (width != null) 'width': width!,
       };
@@ -8875,7 +8874,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Advertisers can target different attributes of an ad slot.
@@ -8921,7 +8920,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exclusions != null)
           'exclusions': exclusions!.map((value) => value.toJson()).toList(),
         if (inclusions != null)
@@ -8969,7 +8968,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creativeSizeValue != null)
           'creativeSizeValue': creativeSizeValue!.toJson(),
         if (dayPartTargetingValue != null)
@@ -9010,7 +9009,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceCapabilityTargeting != null)
           'deviceCapabilityTargeting': deviceCapabilityTargeting!.toJson(),
         if (deviceCategoryTargeting != null)
@@ -9041,7 +9040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
       };
@@ -9092,7 +9091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
         if (nanos != null) 'nanos': nanos!,
@@ -9127,7 +9126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedUrls != null) 'excludedUrls': excludedUrls!,
         if (targetedUrls != null) 'targetedUrls': targetedUrls!,
       };
@@ -9154,7 +9153,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (videoUrl != null) 'videoUrl': videoUrl!,
         if (videoVastXml != null) 'videoVastXml': videoVastXml!,
       };
@@ -9188,7 +9187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (excludedPositionTypes != null)
           'excludedPositionTypes': excludedPositionTypes!,
         if (targetedPositionTypes != null)
@@ -9214,7 +9213,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topic != null) 'topic': topic!,
       };
 }
diff --git a/generated/googleapis_beta/lib/alertcenter/v1beta1.dart b/generated/googleapis_beta/lib/alertcenter/v1beta1.dart
index 794af4f..edfda13 100644
--- a/generated/googleapis_beta/lib/alertcenter/v1beta1.dart
+++ b/generated/googleapis_beta/lib/alertcenter/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -612,7 +611,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (loginDetails != null) 'loginDetails': loginDetails!.toJson(),
       };
@@ -712,7 +711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionNames != null) 'actionNames': actionNames!,
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
@@ -834,12 +833,12 @@
       customerId = _json['customerId'] as core.String;
     }
     if (_json.containsKey('data')) {
-      data = (_json['data'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      data = (_json['data'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('deleted')) {
       deleted = _json['deleted'] as core.bool;
@@ -872,7 +871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alertId != null) 'alertId': alertId!,
         if (createTime != null) 'createTime': createTime!,
         if (customerId != null) 'customerId': customerId!,
@@ -950,7 +949,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alertId != null) 'alertId': alertId!,
         if (createTime != null) 'createTime': createTime!,
         if (customerId != null) 'customerId': customerId!,
@@ -1034,7 +1033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alertId != null) 'alertId': alertId!,
         if (assignee != null) 'assignee': assignee!,
         if (customerId != null) 'customerId': customerId!,
@@ -1061,7 +1060,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestInfo != null)
           'requestInfo': requestInfo!.map((value) => value.toJson()).toList(),
       };
@@ -1080,7 +1079,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (csv != null) 'csv': csv!.toJson(),
       };
 }
@@ -1122,7 +1121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domainId != null) 'domainId': domainId!.toJson(),
         if (maliciousEntity != null)
           'maliciousEntity': maliciousEntity!.toJson(),
@@ -1158,7 +1157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alertId != null) 'alertId': alertId!,
         if (customerId != null) 'customerId': customerId!,
       };
@@ -1176,14 +1175,14 @@
 
   BatchDeleteAlertsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('failedAlertStatus')) {
-      failedAlertStatus = (_json['failedAlertStatus'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Status.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      failedAlertStatus =
+          (_json['failedAlertStatus'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          Status.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('successAlertIds')) {
       successAlertIds = (_json['successAlertIds'] as core.List)
@@ -1192,7 +1191,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failedAlertStatus != null)
           'failedAlertStatus': failedAlertStatus!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -1226,7 +1225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alertId != null) 'alertId': alertId!,
         if (customerId != null) 'customerId': customerId!,
       };
@@ -1244,14 +1243,14 @@
 
   BatchUndeleteAlertsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('failedAlertStatus')) {
-      failedAlertStatus = (_json['failedAlertStatus'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Status.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      failedAlertStatus =
+          (_json['failedAlertStatus'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          Status.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('successAlertIds')) {
       successAlertIds = (_json['successAlertIds'] as core.List)
@@ -1260,7 +1259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failedAlertStatus != null)
           'failedAlertStatus': failedAlertStatus!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -1300,7 +1299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (payloadFormat != null) 'payloadFormat': payloadFormat!,
         if (topicName != null) 'topicName': topicName!,
       };
@@ -1332,7 +1331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataRows != null)
           'dataRows': dataRows!.map((value) => value.toJson()).toList(),
         if (headers != null) 'headers': headers!,
@@ -1355,7 +1354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null) 'entries': entries!,
       };
 }
@@ -1387,7 +1386,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (events != null)
           'events': events!.map((value) => value.toJson()).toList(),
@@ -1447,7 +1446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceCompromisedState != null)
           'deviceCompromisedState': deviceCompromisedState!,
         if (deviceId != null) 'deviceId': deviceId!,
@@ -1478,7 +1477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ruleViolationInfo != null)
           'ruleViolationInfo': ruleViolationInfo!.toJson(),
       };
@@ -1497,7 +1496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerPrimaryDomain != null)
           'customerPrimaryDomain': customerPrimaryDomain!,
       };
@@ -1524,7 +1523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (takeoutRequestId != null) 'takeoutRequestId': takeoutRequestId!,
       };
@@ -1544,7 +1543,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Details of a message in phishing spike alert.
@@ -1604,7 +1603,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachmentsSha256Hash != null)
           'attachmentsSha256Hash': attachmentsSha256Hash!,
         if (date != null) 'date': date!,
@@ -1667,7 +1666,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (affectedUserEmails != null)
           'affectedUserEmails': affectedUserEmails!,
         if (attachmentData != null) 'attachmentData': attachmentData!.toJson(),
@@ -1695,7 +1694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feedback != null)
           'feedback': feedback!.map((value) => value.toJson()).toList(),
       };
@@ -1727,7 +1726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alerts != null)
           'alerts': alerts!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1760,7 +1759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (loginTime != null) 'loginTime': loginTime!,
       };
@@ -1817,7 +1816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domainId != null) 'domainId': domainId!.toJson(),
         if (isInternal != null) 'isInternal': isInternal!,
         if (maliciousEntity != null)
@@ -1854,7 +1853,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (entity != null) 'entity': entity!.toJson(),
         if (fromHeader != null) 'fromHeader': fromHeader!,
@@ -1882,7 +1881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (predefinedDetector != null)
           'predefinedDetector': predefinedDetector!.toJson(),
         if (userDefinedDetector != null)
@@ -1907,7 +1906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudPubsubTopic != null)
           'cloudPubsubTopic': cloudPubsubTopic!.toJson(),
       };
@@ -1953,7 +1952,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domainId != null) 'domainId': domainId!.toJson(),
         if (isInternal != null) 'isInternal': isInternal!,
         if (maliciousEntity != null)
@@ -1976,7 +1975,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectorName != null) 'detectorName': detectorName!,
       };
 }
@@ -2013,7 +2012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appDeveloperEmail != null) 'appDeveloperEmail': appDeveloperEmail!,
         if (appKey != null) 'appKey': appKey!,
         if (numberOfRequests != null) 'numberOfRequests': numberOfRequests!,
@@ -2039,7 +2038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentId != null) 'documentId': documentId!,
         if (resourceTitle != null) 'resourceTitle': resourceTitle!,
       };
@@ -2064,7 +2063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (resourceName != null) 'resourceName': resourceName!,
       };
@@ -2158,7 +2157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSource != null) 'dataSource': dataSource!,
         if (matchInfo != null)
           'matchInfo': matchInfo!.map((value) => value.toJson()).toList(),
@@ -2191,7 +2190,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notifications != null)
           'notifications':
               notifications!.map((value) => value.toJson()).toList(),
@@ -2213,7 +2212,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
       };
 }
@@ -2251,8 +2250,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2265,7 +2264,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2299,7 +2298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (events != null)
           'events': events!.map((value) => value.toJson()).toList(),
@@ -2369,7 +2368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deviceId != null) 'deviceId': deviceId!,
         if (deviceModel != null) 'deviceModel': deviceModel!,
         if (deviceProperty != null) 'deviceProperty': deviceProperty!,
@@ -2400,7 +2399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customerId != null) 'customerId': customerId!,
       };
 }
@@ -2424,7 +2423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (emailAddress != null) 'emailAddress': emailAddress!,
       };
@@ -2449,7 +2448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (resourceName != null) 'resourceName': resourceName!,
       };
diff --git a/generated/googleapis_beta/lib/analyticsadmin/v1alpha.dart b/generated/googleapis_beta/lib/analyticsadmin/v1alpha.dart
index 7784bbc..3327368 100644
--- a/generated/googleapis_beta/lib/analyticsadmin/v1alpha.dart
+++ b/generated/googleapis_beta/lib/analyticsadmin/v1alpha.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2880,7 +2879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (deleted != null) 'deleted': deleted!,
         if (displayName != null) 'displayName': displayName!,
@@ -2929,7 +2928,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -3001,7 +3000,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (displayName != null) 'displayName': displayName!,
         if (firebaseAppId != null) 'firebaseAppId': firebaseAppId!,
@@ -3052,7 +3051,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directRoles != null) 'directRoles': directRoles!,
         if (effectiveRoles != null) 'effectiveRoles': effectiveRoles!,
         if (emailAddress != null) 'emailAddress': emailAddress!,
@@ -3087,7 +3086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
       };
@@ -3120,7 +3119,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (userLinks != null)
           'userLinks': userLinks!.map((value) => value.toJson()).toList(),
@@ -3161,7 +3160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notifyNewUsers != null) 'notifyNewUsers': notifyNewUsers!,
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
@@ -3186,7 +3185,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userLinks != null)
           'userLinks': userLinks!.map((value) => value.toJson()).toList(),
       };
@@ -3214,7 +3213,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
       };
@@ -3238,7 +3237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userLinks != null)
           'userLinks': userLinks!.map((value) => value.toJson()).toList(),
       };
@@ -3266,7 +3265,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
       };
@@ -3290,7 +3289,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userLinks != null)
           'userLinks': userLinks!.map((value) => value.toJson()).toList(),
       };
@@ -3336,7 +3335,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notifyNewUser != null) 'notifyNewUser': notifyNewUser!,
         if (parent != null) 'parent': parent!,
         if (userLink != null) 'userLink': userLink!.toJson(),
@@ -3402,7 +3401,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (sharingWithGoogleAnySalesEnabled != null)
           'sharingWithGoogleAnySalesEnabled': sharingWithGoogleAnySalesEnabled!,
@@ -3433,7 +3432,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -3547,7 +3546,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileDownloadsEnabled != null)
           'fileDownloadsEnabled': fileDownloadsEnabled!,
         if (name != null) 'name': name!,
@@ -3621,7 +3620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (maximumUserAccess != null) 'maximumUserAccess': maximumUserAccess!,
         if (name != null) 'name': name!,
@@ -3656,7 +3655,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (snippet != null) 'snippet': snippet!,
       };
@@ -3731,7 +3730,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adsPersonalizationEnabled != null)
           'adsPersonalizationEnabled': adsPersonalizationEnabled!,
         if (canManageClients != null) 'canManageClients': canManageClients!,
@@ -3803,7 +3802,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bundleId != null) 'bundleId': bundleId!,
         if (createTime != null) 'createTime': createTime!,
         if (displayName != null) 'displayName': displayName!,
@@ -3839,7 +3838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountSummaries != null)
           'accountSummaries':
               accountSummaries!.map((value) => value.toJson()).toList(),
@@ -3872,7 +3871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accounts != null)
           'accounts': accounts!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3907,7 +3906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidAppDataStreams != null)
           'androidAppDataStreams':
               androidAppDataStreams!.map((value) => value.toJson()).toList(),
@@ -3945,7 +3944,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firebaseLinks != null)
           'firebaseLinks':
               firebaseLinks!.map((value) => value.toJson()).toList(),
@@ -3979,7 +3978,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (googleAdsLinks != null)
           'googleAdsLinks':
               googleAdsLinks!.map((value) => value.toJson()).toList(),
@@ -4014,7 +4013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iosAppDataStreams != null)
           'iosAppDataStreams':
               iosAppDataStreams!.map((value) => value.toJson()).toList(),
@@ -4048,7 +4047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (properties != null)
           'properties': properties!.map((value) => value.toJson()).toList(),
@@ -4082,7 +4081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (userLinks != null)
           'userLinks': userLinks!.map((value) => value.toJson()).toList(),
@@ -4116,7 +4115,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (webDataStreams != null)
           'webDataStreams':
@@ -4244,7 +4243,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (deleted != null) 'deleted': deleted!,
@@ -4277,7 +4276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (property != null) 'property': property!,
       };
@@ -4306,7 +4305,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (account != null) 'account': account!.toJson(),
         if (redirectUri != null) 'redirectUri': redirectUri!,
       };
@@ -4326,7 +4325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accountTicketId != null) 'accountTicketId': accountTicketId!,
       };
 }
@@ -4347,7 +4346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userLink != null) 'userLink': userLink!.toJson(),
       };
 }
@@ -4386,7 +4385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directRoles != null) 'directRoles': directRoles!,
         if (emailAddress != null) 'emailAddress': emailAddress!,
         if (name != null) 'name': name!,
@@ -4467,7 +4466,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (defaultUri != null) 'defaultUri': defaultUri!,
         if (displayName != null) 'displayName': displayName!,
@@ -4492,5 +4491,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis_beta/lib/analyticsdata/v1alpha.dart b/generated/googleapis_beta/lib/analyticsdata/v1alpha.dart
index db71f28..cc7d9e8 100644
--- a/generated/googleapis_beta/lib/analyticsdata/v1alpha.dart
+++ b/generated/googleapis_beta/lib/analyticsdata/v1alpha.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -364,7 +363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!.toJson(),
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
@@ -390,7 +389,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pivotReports != null)
           'pivotReports': pivotReports!.map((value) => value.toJson()).toList(),
       };
@@ -425,7 +424,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entity != null) 'entity': entity!.toJson(),
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
@@ -450,7 +449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reports != null)
           'reports': reports!.map((value) => value.toJson()).toList(),
       };
@@ -477,7 +476,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fromValue != null) 'fromValue': fromValue!.toJson(),
         if (toValue != null) 'toValue': toValue!.toJson(),
       };
@@ -498,7 +497,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionName != null) 'dimensionName': dimensionName!,
       };
 }
@@ -553,7 +552,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dateRange != null) 'dateRange': dateRange!.toJson(),
         if (dimension != null) 'dimension': dimension!,
         if (name != null) 'name': name!,
@@ -575,7 +574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accumulate != null) 'accumulate': accumulate!,
       };
 }
@@ -628,7 +627,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cohortReportSettings != null)
           'cohortReportSettings': cohortReportSettings!.toJson(),
         if (cohorts != null)
@@ -699,7 +698,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endOffset != null) 'endOffset': endOffset!,
         if (granularity != null) 'granularity': granularity!,
         if (startOffset != null) 'startOffset': startOffset!,
@@ -735,7 +734,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (delimiter != null) 'delimiter': delimiter!,
         if (dimensionNames != null) 'dimensionNames': dimensionNames!,
       };
@@ -781,7 +780,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!,
         if (name != null) 'name': name!,
         if (startDate != null) 'startDate': startDate!,
@@ -823,7 +822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionExpression != null)
           'dimensionExpression': dimensionExpression!.toJson(),
         if (name != null) 'name': name!,
@@ -864,7 +863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (concatenate != null) 'concatenate': concatenate!.toJson(),
         if (lowerCase != null) 'lowerCase': lowerCase!.toJson(),
         if (upperCase != null) 'upperCase': upperCase!.toJson(),
@@ -889,7 +888,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -941,7 +940,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiName != null) 'apiName': apiName!,
         if (customDefinition != null) 'customDefinition': customDefinition!,
         if (deprecatedApiNames != null)
@@ -980,7 +979,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionName != null) 'dimensionName': dimensionName!,
         if (orderType != null) 'orderType': orderType!,
       };
@@ -999,7 +998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (value != null) 'value': value!,
       };
 }
@@ -1020,7 +1019,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (propertyId != null) 'propertyId': propertyId!,
       };
 }
@@ -1068,7 +1067,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (betweenFilter != null) 'betweenFilter': betweenFilter!.toJson(),
         if (fieldName != null) 'fieldName': fieldName!,
         if (inListFilter != null) 'inListFilter': inListFilter!.toJson(),
@@ -1118,7 +1117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (andGroup != null) 'andGroup': andGroup!.toJson(),
         if (filter != null) 'filter': filter!.toJson(),
         if (notExpression != null) 'notExpression': notExpression!.toJson(),
@@ -1142,7 +1141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expressions != null)
           'expressions': expressions!.map((value) => value.toJson()).toList(),
       };
@@ -1171,7 +1170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseSensitive != null) 'caseSensitive': caseSensitive!,
         if (values != null) 'values': values!,
       };
@@ -1208,7 +1207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensions != null)
           'dimensions': dimensions!.map((value) => value.toJson()).toList(),
         if (metrics != null)
@@ -1259,7 +1258,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expression != null) 'expression': expression!,
         if (invisible != null) 'invisible': invisible!,
         if (name != null) 'name': name!,
@@ -1307,7 +1306,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (type != null) 'type': type!,
       };
@@ -1393,7 +1392,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiName != null) 'apiName': apiName!,
         if (customDefinition != null) 'customDefinition': customDefinition!,
         if (deprecatedApiNames != null)
@@ -1418,7 +1417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricName != null) 'metricName': metricName!,
       };
 }
@@ -1438,7 +1437,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (value != null) 'value': value!,
       };
 }
@@ -1470,7 +1469,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operation != null) 'operation': operation!,
         if (value != null) 'value': value!.toJson(),
       };
@@ -1495,7 +1494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (doubleValue != null) 'doubleValue': doubleValue!,
         if (int64Value != null) 'int64Value': int64Value!,
       };
@@ -1535,7 +1534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (desc != null) 'desc': desc!,
         if (dimension != null) 'dimension': dimension!.toJson(),
         if (metric != null) 'metric': metric!.toJson(),
@@ -1604,7 +1603,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldNames != null) 'fieldNames': fieldNames!,
         if (limit != null) 'limit': limit!,
         if (metricAggregations != null)
@@ -1631,7 +1630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionValues != null)
           'dimensionValues':
               dimensionValues!.map((value) => value.toJson()).toList(),
@@ -1664,7 +1663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pivotDimensionHeaders != null)
           'pivotDimensionHeaders':
               pivotDimensionHeaders!.map((value) => value.toJson()).toList(),
@@ -1700,7 +1699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricName != null) 'metricName': metricName!,
         if (pivotSelections != null)
           'pivotSelections':
@@ -1739,7 +1738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionName != null) 'dimensionName': dimensionName!,
         if (dimensionValue != null) 'dimensionValue': dimensionValue!,
       };
@@ -1794,7 +1793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (concurrentRequests != null)
           'concurrentRequests': concurrentRequests!.toJson(),
         if (serverErrorsPerProjectPerHour != null)
@@ -1824,7 +1823,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumed != null) 'consumed': consumed!,
         if (remaining != null) 'remaining': remaining!,
       };
@@ -1847,7 +1846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataLossFromOtherRow != null)
           'dataLossFromOtherRow': dataLossFromOtherRow!,
       };
@@ -1888,7 +1887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionValues != null)
           'dimensionValues':
               dimensionValues!.map((value) => value.toJson()).toList(),
@@ -2024,7 +2023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cohortSpec != null) 'cohortSpec': cohortSpec!.toJson(),
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (dateRanges != null)
@@ -2132,7 +2131,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aggregates != null)
           'aggregates': aggregates!.map((value) => value.toJson()).toList(),
         if (dimensionHeaders != null)
@@ -2234,7 +2233,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionFilter != null)
           'dimensionFilter': dimensionFilter!.toJson(),
         if (dimensions != null)
@@ -2336,7 +2335,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionHeaders != null)
           'dimensionHeaders':
               dimensionHeaders!.map((value) => value.toJson()).toList(),
@@ -2500,7 +2499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cohortSpec != null) 'cohortSpec': cohortSpec!.toJson(),
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (dateRanges != null)
@@ -2618,7 +2617,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dimensionHeaders != null)
           'dimensionHeaders':
               dimensionHeaders!.map((value) => value.toJson()).toList(),
@@ -2672,7 +2671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caseSensitive != null) 'caseSensitive': caseSensitive!,
         if (matchType != null) 'matchType': matchType!,
         if (value != null) 'value': value!,
diff --git a/generated/googleapis_beta/lib/area120tables/v1alpha1.dart b/generated/googleapis_beta/lib/area120tables/v1alpha1.dart
index 7a4082a..19d5d60 100644
--- a/generated/googleapis_beta/lib/area120tables/v1alpha1.dart
+++ b/generated/googleapis_beta/lib/area120tables/v1alpha1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -666,7 +665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
       };
@@ -688,7 +687,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
       };
 }
@@ -714,7 +713,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (names != null) 'names': names!,
       };
 }
@@ -739,7 +738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requests != null)
           'requests': requests!.map((value) => value.toJson()).toList(),
       };
@@ -761,7 +760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
       };
 }
@@ -836,7 +835,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataType != null) 'dataType': dataType!,
         if (id != null) 'id': id!,
         if (labels != null)
@@ -887,7 +886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parent != null) 'parent': parent!,
         if (row != null) 'row': row!.toJson(),
         if (view != null) 'view': view!,
@@ -908,7 +907,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A single item in a labeled column.
@@ -930,7 +929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (name != null) 'name': name!,
       };
@@ -960,7 +959,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (rows != null) 'rows': rows!.map((value) => value.toJson()).toList(),
       };
@@ -990,7 +989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tables != null)
           'tables': tables!.map((value) => value.toJson()).toList(),
@@ -1021,7 +1020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (workspaces != null)
           'workspaces': workspaces!.map((value) => value.toJson()).toList(),
@@ -1048,7 +1047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (relationshipColumn != null)
           'relationshipColumn': relationshipColumn!,
         if (relationshipColumnId != null)
@@ -1069,7 +1068,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (linkedTable != null) 'linkedTable': linkedTable!,
       };
 }
@@ -1110,17 +1109,16 @@
       updateTime = _json['updateTime'] as core.String;
     }
     if (_json.containsKey('values')) {
-      values =
-          (_json['values'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      values = (_json['values'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (name != null) 'name': name!,
         if (updateTime != null) 'updateTime': updateTime!,
@@ -1172,7 +1170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null)
           'columns': columns!.map((value) => value.toJson()).toList(),
         if (createTime != null) 'createTime': createTime!,
@@ -1217,7 +1215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (row != null) 'row': row!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
         if (view != null) 'view': view!,
@@ -1266,7 +1264,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
diff --git a/generated/googleapis_beta/lib/bigqueryconnection/v1beta1.dart b/generated/googleapis_beta/lib/bigqueryconnection/v1beta1.dart
index 77f37bf..3c422d0 100644
--- a/generated/googleapis_beta/lib/bigqueryconnection/v1beta1.dart
+++ b/generated/googleapis_beta/lib/bigqueryconnection/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -536,7 +535,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -578,7 +577,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -650,7 +649,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -676,7 +675,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (password != null) 'password': password!,
         if (username != null) 'username': username!,
       };
@@ -720,7 +719,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (credential != null) 'credential': credential!.toJson(),
         if (database != null) 'database': database!,
         if (instanceId != null) 'instanceId': instanceId!,
@@ -786,7 +785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudSql != null) 'cloudSql': cloudSql!.toJson(),
         if (creationTime != null) 'creationTime': creationTime!,
         if (description != null) 'description': description!,
@@ -811,7 +810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudSql != null) 'cloudSql': cloudSql!.toJson(),
       };
 }
@@ -830,7 +829,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -894,7 +893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -917,7 +916,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -944,7 +943,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -972,7 +971,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connections != null)
           'connections': connections!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1083,7 +1082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -1120,7 +1119,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -1145,7 +1144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -1166,7 +1165,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
diff --git a/generated/googleapis_beta/lib/clouderrorreporting/v1beta1.dart b/generated/googleapis_beta/lib/clouderrorreporting/v1beta1.dart
index a7c6e3d..046f07e 100644
--- a/generated/googleapis_beta/lib/clouderrorreporting/v1beta1.dart
+++ b/generated/googleapis_beta/lib/clouderrorreporting/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -504,7 +503,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A description of the context in which an error occurred.
@@ -559,7 +558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpRequest != null) 'httpRequest': httpRequest!.toJson(),
         if (reportLocation != null) 'reportLocation': reportLocation!.toJson(),
         if (sourceReferences != null)
@@ -605,7 +604,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (eventTime != null) 'eventTime': eventTime!,
         if (message != null) 'message': message!,
@@ -665,7 +664,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupId != null) 'groupId': groupId!,
         if (name != null) 'name': name!,
         if (resolutionStatus != null) 'resolutionStatus': resolutionStatus!,
@@ -774,7 +773,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (affectedServices != null)
           'affectedServices':
               affectedServices!.map((value) => value.toJson()).toList(),
@@ -842,7 +841,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (method != null) 'method': method!,
         if (referrer != null) 'referrer': referrer!,
         if (remoteIp != null) 'remoteIp': remoteIp!,
@@ -885,7 +884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorEvents != null)
           'errorEvents': errorEvents!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -929,7 +928,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorGroupStats != null)
           'errorGroupStats':
               errorGroupStats!.map((value) => value.toJson()).toList(),
@@ -948,7 +947,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An error event which is reported to the Error Reporting system.
@@ -1016,7 +1015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!.toJson(),
         if (eventTime != null) 'eventTime': eventTime!,
         if (message != null) 'message': message!,
@@ -1066,7 +1065,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceType != null) 'resourceType': resourceType!,
         if (service != null) 'service': service!,
         if (version != null) 'version': version!,
@@ -1109,7 +1108,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filePath != null) 'filePath': filePath!,
         if (functionName != null) 'functionName': functionName!,
         if (lineNumber != null) 'lineNumber': lineNumber!,
@@ -1142,7 +1141,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (repository != null) 'repository': repository!,
         if (revisionId != null) 'revisionId': revisionId!,
       };
@@ -1176,7 +1175,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
@@ -1198,7 +1197,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (url != null) 'url': url!,
       };
 }
diff --git a/generated/googleapis_beta/lib/containeranalysis/v1beta1.dart b/generated/googleapis_beta/lib/containeranalysis/v1beta1.dart
index 49df2d6..f11a039 100644
--- a/generated/googleapis_beta/lib/containeranalysis/v1beta1.dart
+++ b/generated/googleapis_beta/lib/containeranalysis/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1219,7 +1218,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
       };
@@ -1260,7 +1259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checksum != null) 'checksum': checksum!,
         if (id != null) 'id': id!,
         if (names != null) 'names': names!,
@@ -1279,7 +1278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sha256 != null) 'sha256': sha256!,
       };
 }
@@ -1298,7 +1297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (artifactRule != null) 'artifactRule': artifactRule!,
       };
 }
@@ -1332,7 +1331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (genericSignedAttestation != null)
           'genericSignedAttestation': genericSignedAttestation!.toJson(),
         if (pgpSignedAttestation != null)
@@ -1362,7 +1361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hint != null) 'hint': hint!.toJson(),
       };
 }
@@ -1396,7 +1395,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fingerprint != null) 'fingerprint': fingerprint!.toJson(),
         if (resourceUrl != null) 'resourceUrl': resourceUrl!,
       };
@@ -1415,18 +1414,16 @@
 
   BatchCreateNotesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('notes')) {
-      notes = (_json['notes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              Note.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      notes = (_json['notes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          Note.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notes != null)
           'notes': notes!.map((key, item) => core.MapEntry(key, item.toJson())),
       };
@@ -1448,7 +1445,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (notes != null)
           'notes': notes!.map((value) => value.toJson()).toList(),
       };
@@ -1474,7 +1471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (occurrences != null)
           'occurrences': occurrences!.map((value) => value.toJson()).toList(),
       };
@@ -1496,7 +1493,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (occurrences != null)
           'occurrences': occurrences!.map((value) => value.toJson()).toList(),
       };
@@ -1568,7 +1565,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1599,7 +1596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (builderVersion != null) 'builderVersion': builderVersion!,
         if (signature != null) 'signature': signature!.toJson(),
       };
@@ -1661,14 +1658,13 @@
 
   BuildProvenance.fromJson(core.Map _json) {
     if (_json.containsKey('buildOptions')) {
-      buildOptions = (_json['buildOptions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      buildOptions =
+          (_json['buildOptions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('builderVersion')) {
       builderVersion = _json['builderVersion'] as core.String;
@@ -1715,7 +1711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buildOptions != null) 'buildOptions': buildOptions!,
         if (builderVersion != null) 'builderVersion': builderVersion!,
         if (builtArtifacts != null)
@@ -1798,7 +1794,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyId != null) 'keyId': keyId!,
         if (keyType != null) 'keyType': keyType!,
         if (publicKey != null) 'publicKey': publicKey!,
@@ -1816,18 +1812,17 @@
 
   ByProducts.fromJson(core.Map _json) {
     if (_json.containsKey('customValues')) {
-      customValues = (_json['customValues'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      customValues =
+          (_json['customValues'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customValues != null) 'customValues': customValues!,
       };
 }
@@ -1943,7 +1938,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attackComplexity != null) 'attackComplexity': attackComplexity!,
         if (attackVector != null) 'attackVector': attackVector!,
         if (availabilityImpact != null)
@@ -1990,7 +1985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliasContext != null) 'aliasContext': aliasContext!.toJson(),
         if (repoId != null) 'repoId': repoId!.toJson(),
         if (revisionId != null) 'revisionId': revisionId!,
@@ -2051,7 +2046,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (args != null) 'args': args!,
         if (dir != null) 'dir': dir!,
         if (env != null) 'env': env!,
@@ -2078,7 +2073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceUri != null) 'resourceUri': resourceUri!,
       };
 }
@@ -2144,7 +2139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (config != null) 'config': config!,
         if (deployTime != null) 'deployTime': deployTime!,
@@ -2202,7 +2197,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseResourceUrl != null) 'baseResourceUrl': baseResourceUrl!,
         if (distance != null) 'distance': distance!,
         if (fingerprint != null) 'fingerprint': fingerprint!.toJson(),
@@ -2303,7 +2298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpeUri != null) 'cpeUri': cpeUri!,
         if (description != null) 'description': description!,
         if (fixedLocation != null) 'fixedLocation': fixedLocation!.toJson(),
@@ -2336,7 +2331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attestation != null) 'attestation': attestation!.toJson(),
       };
 }
@@ -2390,7 +2385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analysisStatus != null) 'analysisStatus': analysisStatus!,
         if (analysisStatusError != null)
           'analysisStatusError': analysisStatusError!.toJson(),
@@ -2431,7 +2426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analysisKind != null) 'analysisKind': analysisKind!,
       };
 }
@@ -2490,7 +2485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (architecture != null) 'architecture': architecture!,
         if (cpeUri != null) 'cpeUri': cpeUri!,
         if (description != null) 'description': description!,
@@ -2514,7 +2509,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Defines an object for the environment field in in-toto links.
@@ -2527,18 +2522,17 @@
 
   Environment.fromJson(core.Map _json) {
     if (_json.containsKey('customValues')) {
-      customValues = (_json['customValues'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      customValues =
+          (_json['customValues'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customValues != null) 'customValues': customValues!,
       };
 }
@@ -2604,7 +2598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2631,7 +2625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileHash != null)
           'fileHash': fileHash!.map((value) => value.toJson()).toList(),
       };
@@ -2672,7 +2666,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (v1Name != null) 'v1Name': v1Name!,
         if (v2Blob != null) 'v2Blob': v2Blob!,
         if (v2Name != null) 'v2Name': v2Name!,
@@ -2720,7 +2714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fixableCount != null) 'fixableCount': fixableCount!,
         if (resource != null) 'resource': resource!.toJson(),
         if (severity != null) 'severity': severity!,
@@ -2784,7 +2778,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (serializedPayload != null) 'serializedPayload': serializedPayload!,
         if (signatures != null)
@@ -2827,7 +2821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliasContext != null) 'aliasContext': aliasContext!.toJson(),
         if (gerritProject != null) 'gerritProject': gerritProject!,
         if (hostUri != null) 'hostUri': hostUri!,
@@ -2850,7 +2844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -2877,7 +2871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -2903,7 +2897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (revisionId != null) 'revisionId': revisionId!,
         if (url != null) 'url': url!,
       };
@@ -2934,7 +2928,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
       };
@@ -2971,7 +2965,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (provenance != null) 'provenance': provenance!.toJson(),
         if (provenanceBytes != null) 'provenanceBytes': provenanceBytes!,
       };
@@ -2993,7 +2987,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployment != null) 'deployment': deployment!.toJson(),
       };
 }
@@ -3014,7 +3008,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (discovered != null) 'discovered': discovered!.toJson(),
       };
 }
@@ -3035,7 +3029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (derivedImage != null) 'derivedImage': derivedImage!.toJson(),
       };
 }
@@ -3056,7 +3050,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hashes != null) 'hashes': hashes!.toJson(),
         if (resourceUri != null) 'resourceUri': resourceUri!,
       };
@@ -3086,7 +3080,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (signatures != null)
           'signatures': signatures!.map((value) => value.toJson()).toList(),
         if (signed != null) 'signed': signed!.toJson(),
@@ -3109,7 +3103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyid != null) 'keyid': keyid!,
         if (sig != null) 'sig': sig!,
       };
@@ -3131,7 +3125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (installation != null) 'installation': installation!.toJson(),
       };
 }
@@ -3230,7 +3224,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cvssScore != null) 'cvssScore': cvssScore!,
         if (effectiveSeverity != null) 'effectiveSeverity': effectiveSeverity!,
         if (longDescription != null) 'longDescription': longDescription!,
@@ -3276,7 +3270,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
       };
@@ -3304,7 +3298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (humanReadableName != null) 'humanReadableName': humanReadableName!,
       };
 }
@@ -3368,7 +3362,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expectedCommand != null) 'expectedCommand': expectedCommand!,
         if (expectedMaterials != null)
           'expectedMaterials':
@@ -3411,7 +3405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null)
           'location': location!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -3437,7 +3431,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (url != null) 'url': url!,
       };
@@ -3484,7 +3478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arguments != null) 'arguments': arguments!,
         if (directive != null) 'directive': directive!,
       };
@@ -3560,7 +3554,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (byproducts != null) 'byproducts': byproducts!.toJson(),
         if (command != null) 'command': command!,
         if (environment != null) 'environment': environment!.toJson(),
@@ -3593,7 +3587,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (occurrences != null)
           'occurrences': occurrences!.map((value) => value.toJson()).toList(),
@@ -3625,7 +3619,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (notes != null)
           'notes': notes!.map((value) => value.toJson()).toList(),
@@ -3657,7 +3651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (occurrences != null)
           'occurrences': occurrences!.map((value) => value.toJson()).toList(),
@@ -3689,7 +3683,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (scanConfigs != null)
           'scanConfigs': scanConfigs!.map((value) => value.toJson()).toList(),
@@ -3728,7 +3722,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpeUri != null) 'cpeUri': cpeUri!,
         if (path != null) 'path': path!,
         if (version != null) 'version': version!.toJson(),
@@ -3887,7 +3881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attestationAuthority != null)
           'attestationAuthority': attestationAuthority!.toJson(),
         if (baseImage != null) 'baseImage': baseImage!.toJson(),
@@ -4047,7 +4041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attestation != null) 'attestation': attestation!.toJson(),
         if (build != null) 'build': build!.toJson(),
         if (createTime != null) 'createTime': createTime!,
@@ -4093,7 +4087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (distribution != null)
           'distribution': distribution!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -4131,7 +4125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (affectedLocation != null)
           'affectedLocation': affectedLocation!.toJson(),
         if (fixedLocation != null) 'fixedLocation': fixedLocation!.toJson(),
@@ -4201,7 +4195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (pgpKeyId != null) 'pgpKeyId': pgpKeyId!,
         if (signature != null) 'signature': signature!,
@@ -4303,7 +4297,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -4333,7 +4327,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectId != null) 'projectId': projectId!,
         if (repoName != null) 'repoName': repoName!,
       };
@@ -4358,7 +4352,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
         if (url != null) 'url': url!,
       };
@@ -4384,7 +4378,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectRepoId != null) 'projectRepoId': projectRepoId!.toJson(),
         if (uid != null) 'uid': uid!,
       };
@@ -4428,7 +4422,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentHash != null) 'contentHash': contentHash!.toJson(),
         if (name != null) 'name': name!,
         if (uri != null) 'uri': uri!,
@@ -4485,7 +4479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (enabled != null) 'enabled': enabled!,
@@ -4512,7 +4506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -4577,7 +4571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publicKeyId != null) 'publicKeyId': publicKeyId!,
         if (signature != null) 'signature': signature!,
       };
@@ -4627,7 +4621,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyId != null) 'keyId': keyId!,
         if (keyScheme != null) 'keyScheme': keyScheme!,
         if (keyType != null) 'keyType': keyType!,
@@ -4678,18 +4672,17 @@
           _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fileHashes')) {
-      fileHashes = (_json['fileHashes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              FileHashes.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      fileHashes =
+          (_json['fileHashes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          FileHashes.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalContexts != null)
           'additionalContexts':
               additionalContexts!.map((value) => value.toJson()).toList(),
@@ -4735,17 +4728,16 @@
           _json['git'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudRepo != null) 'cloudRepo': cloudRepo!.toJson(),
         if (gerrit != null) 'gerrit': gerrit!.toJson(),
         if (git != null) 'git': git!.toJson(),
@@ -4786,8 +4778,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4800,7 +4792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4826,7 +4818,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4847,7 +4839,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4904,7 +4896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (epoch != null) 'epoch': epoch!,
         if (inclusive != null) 'inclusive': inclusive!,
         if (kind != null) 'kind': kind!,
@@ -4982,7 +4974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cvssScore != null) 'cvssScore': cvssScore!,
         if (cvssV3 != null) 'cvssV3': cvssV3!.toJson(),
         if (details != null)
@@ -5029,7 +5021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpeUri != null) 'cpeUri': cpeUri!,
         if (package != null) 'package': package!,
         if (version != null) 'version': version!.toJson(),
@@ -5053,7 +5045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (counts != null)
           'counts': counts!.map((value) => value.toJson()).toList(),
       };
@@ -5105,7 +5097,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpeUri != null) 'cpeUri': cpeUri!,
         if (description != null) 'description': description!,
         if (fixingKbs != null)
diff --git a/generated/googleapis_beta/lib/datacatalog/v1beta1.dart b/generated/googleapis_beta/lib/datacatalog/v1beta1.dart
index 231f72b..6090e4d 100644
--- a/generated/googleapis_beta/lib/datacatalog/v1beta1.dart
+++ b/generated/googleapis_beta/lib/datacatalog/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2967,7 +2966,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -2988,7 +2987,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -3052,7 +3051,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -3075,7 +3074,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
       };
 }
@@ -3102,7 +3101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestedPolicyVersion != null)
           'requestedPolicyVersion': requestedPolicyVersion!,
       };
@@ -3148,7 +3147,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!,
         if (shardCount != null) 'shardCount': shardCount!,
         if (tablePrefix != null) 'tablePrefix': tablePrefix!,
@@ -3195,7 +3194,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tableSourceType != null) 'tableSourceType': tableSourceType!,
         if (tableSpec != null) 'tableSpec': tableSpec!.toJson(),
         if (viewSpec != null) 'viewSpec': viewSpec!.toJson(),
@@ -3263,7 +3262,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (column != null) 'column': column!,
         if (description != null) 'description': description!,
         if (mode != null) 'mode': mode!,
@@ -3449,7 +3448,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigqueryDateShardedSpec != null)
           'bigqueryDateShardedSpec': bigqueryDateShardedSpec!.toJson(),
         if (bigqueryTableSpec != null)
@@ -3522,7 +3521,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataCatalogTimestamps != null)
           'dataCatalogTimestamps': dataCatalogTimestamps!.toJson(),
         if (description != null) 'description': description!,
@@ -3549,7 +3548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (taxonomies != null)
           'taxonomies': taxonomies!.map((value) => value.toJson()).toList(),
       };
@@ -3581,7 +3580,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enumType != null) 'enumType': enumType!.toJson(),
         if (primitiveType != null) 'primitiveType': primitiveType!,
       };
@@ -3603,7 +3602,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedValues != null)
           'allowedValues':
               allowedValues!.map((value) => value.toJson()).toList(),
@@ -3627,7 +3626,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -3666,7 +3665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filePath != null) 'filePath': filePath!,
         if (gcsTimestamps != null) 'gcsTimestamps': gcsTimestamps!.toJson(),
         if (sizeBytes != null) 'sizeBytes': sizeBytes!,
@@ -3721,7 +3720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filePatterns != null) 'filePatterns': filePatterns!,
         if (sampleGcsFileSpecs != null)
           'sampleGcsFileSpecs':
@@ -3744,7 +3743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inlineSource != null) 'inlineSource': inlineSource!.toJson(),
       };
 }
@@ -3767,7 +3766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (taxonomies != null)
           'taxonomies': taxonomies!.map((value) => value.toJson()).toList(),
       };
@@ -3792,7 +3791,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (taxonomies != null)
           'taxonomies': taxonomies!.map((value) => value.toJson()).toList(),
       };
@@ -3823,7 +3822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3856,7 +3855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (entryGroups != null)
           'entryGroups': entryGroups!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3887,7 +3886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (policyTags != null)
           'policyTags': policyTags!.map((value) => value.toJson()).toList(),
@@ -3919,7 +3918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (tags != null) 'tags': tags!.map((value) => value.toJson()).toList(),
       };
@@ -3949,7 +3948,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (taxonomies != null)
           'taxonomies': taxonomies!.map((value) => value.toJson()).toList(),
@@ -4022,7 +4021,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childPolicyTags != null) 'childPolicyTags': childPolicyTags!,
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
@@ -4049,7 +4048,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newEnumValueDisplayName != null)
           'newEnumValueDisplayName': newEnumValueDisplayName!,
       };
@@ -4073,7 +4072,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (newTagTemplateFieldId != null)
           'newTagTemplateFieldId': newTagTemplateFieldId!,
       };
@@ -4100,7 +4099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null)
           'columns': columns!.map((value) => value.toJson()).toList(),
       };
@@ -4173,7 +4172,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (orderBy != null) 'orderBy': orderBy!,
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
@@ -4246,7 +4245,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeGcpPublicDatasets != null)
           'includeGcpPublicDatasets': includeGcpPublicDatasets!,
         if (includeOrgIds != null) 'includeOrgIds': includeOrgIds!,
@@ -4292,7 +4291,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
@@ -4360,7 +4359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (linkedResource != null) 'linkedResource': linkedResource!,
         if (modifyTime != null) 'modifyTime': modifyTime!,
         if (relativeResourceName != null)
@@ -4415,7 +4414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (childPolicyTags != null)
           'childPolicyTags':
               childPolicyTags!.map((value) => value.toJson()).toList(),
@@ -4471,7 +4470,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activatedPolicyTypes != null)
           'activatedPolicyTypes': activatedPolicyTypes!,
         if (description != null) 'description': description!,
@@ -4510,7 +4509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (expireTime != null) 'expireTime': expireTime!,
         if (updateTime != null) 'updateTime': updateTime!,
@@ -4537,7 +4536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groupedEntry != null) 'groupedEntry': groupedEntry!,
       };
 }
@@ -4593,15 +4592,13 @@
       column = _json['column'] as core.String;
     }
     if (_json.containsKey('fields')) {
-      fields = (_json['fields'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudDatacatalogV1beta1TagField.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      fields = (_json['fields'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudDatacatalogV1beta1TagField.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4614,7 +4611,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (column != null) 'column': column!,
         if (fields != null)
           'fields':
@@ -4687,7 +4684,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (displayName != null) 'displayName': displayName!,
         if (doubleValue != null) 'doubleValue': doubleValue!,
@@ -4711,7 +4708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
       };
 }
@@ -4757,22 +4754,20 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('fields')) {
-      fields = (_json['fields'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudDatacatalogV1beta1TagTemplateField.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      fields = (_json['fields'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudDatacatalogV1beta1TagTemplateField.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (fields != null)
           'fields':
@@ -4844,7 +4839,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (isRequired != null) 'isRequired': isRequired!,
@@ -4933,7 +4928,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activatedPolicyTypes != null)
           'activatedPolicyTypes': activatedPolicyTypes!,
         if (description != null) 'description': description!,
@@ -4960,7 +4955,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (viewQuery != null) 'viewQuery': viewQuery!,
       };
 }
@@ -5060,7 +5055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bindings != null)
           'bindings': bindings!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -5086,7 +5081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
       };
 }
@@ -5110,7 +5105,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -5131,7 +5126,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
diff --git a/generated/googleapis_beta/lib/dataflow/v1b3.dart b/generated/googleapis_beta/lib/dataflow/v1b3.dart
index 036adee..f2b408a 100644
--- a/generated/googleapis_beta/lib/dataflow/v1b3.dart
+++ b/generated/googleapis_beta/lib/dataflow/v1b3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3121,7 +3120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (percentComplete != null) 'percentComplete': percentComplete!,
         if (position != null) 'position': position!.toJson(),
         if (remainingTime != null) 'remainingTime': remainingTime!,
@@ -3187,7 +3186,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumedParallelism != null)
           'consumedParallelism': consumedParallelism!.toJson(),
         if (fractionConsumed != null) 'fractionConsumed': fractionConsumed!,
@@ -3226,7 +3225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fractionConsumed != null) 'fractionConsumed': fractionConsumed!,
         if (fractionOfRemainder != null)
           'fractionOfRemainder': fractionOfRemainder!,
@@ -3261,7 +3260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerSpec != null) 'containerSpec': containerSpec!.toJson(),
         if (jobGraphGcsPath != null) 'jobGraphGcsPath': jobGraphGcsPath!,
         if (metadata != null) 'metadata': metadata!.toJson(),
@@ -3335,7 +3334,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentNumWorkers != null) 'currentNumWorkers': currentNumWorkers!,
         if (description != null) 'description': description!.toJson(),
         if (eventType != null) 'eventType': eventType!,
@@ -3370,7 +3369,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (maxNumWorkers != null) 'maxNumWorkers': maxNumWorkers!,
       };
@@ -3407,7 +3406,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!,
         if (projectId != null) 'projectId': projectId!,
         if (query != null) 'query': query!,
@@ -3440,7 +3439,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instanceId != null) 'instanceId': instanceId!,
         if (projectId != null) 'projectId': projectId!,
         if (tableId != null) 'tableId': tableId!,
@@ -3474,7 +3473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rate != null) 'rate': rate!,
         if (timestamp != null) 'timestamp': timestamp!,
         if (totalMs != null) 'totalMs': totalMs!,
@@ -3495,7 +3494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (templateVersion != null)
           'templateVersion': templateVersion!.toJson(),
       };
@@ -3529,7 +3528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (originalTransformOrCollection != null)
           'originalTransformOrCollection': originalTransformOrCollection!,
@@ -3563,7 +3562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (originalTransform != null) 'originalTransform': originalTransform!,
         if (userName != null) 'userName': userName!,
@@ -3625,7 +3624,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (computationId != null) 'computationId': computationId!,
         if (inputs != null)
           'inputs': inputs!.map((value) => value.toJson()).toList(),
@@ -3664,7 +3663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (index != null) 'index': index!,
         if (position != null) 'position': position!.toJson(),
       };
@@ -3708,7 +3707,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultEnvironment != null)
           'defaultEnvironment': defaultEnvironment!.toJson(),
         if (image != null) 'image': image!,
@@ -3771,7 +3770,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (kind != null) 'kind': kind!,
         if (otherUnits != null) 'otherUnits': otherUnits!,
@@ -3872,7 +3871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (componentStepName != null) 'componentStepName': componentStepName!,
         if (executionStepName != null) 'executionStepName': executionStepName!,
         if (inputIndex != null) 'inputIndex': inputIndex!,
@@ -3909,7 +3908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (name != null) 'name': name!.toJson(),
       };
@@ -4033,7 +4032,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolean != null) 'boolean': boolean!,
         if (cumulative != null) 'cumulative': cumulative!,
         if (distribution != null) 'distribution': distribution!.toJson(),
@@ -4097,18 +4096,17 @@
       location = _json['location'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!.toJson(),
         if (gcsPath != null) 'gcsPath': gcsPath!,
         if (jobName != null) 'jobName': jobName!,
@@ -4131,7 +4129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (templateVersion != null)
           'templateVersion': templateVersion!.toJson(),
       };
@@ -4150,7 +4148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stateful != null) 'stateful': stateful!,
       };
 }
@@ -4182,7 +4180,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataDisks != null) 'dataDisks': dataDisks!,
         if (vmInstance != null) 'vmInstance': vmInstance!,
       };
@@ -4207,7 +4205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (namespace != null) 'namespace': namespace!,
         if (projectId != null) 'projectId': projectId!,
       };
@@ -4221,7 +4219,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Specification of one of the bundles produced as a result of splitting a
@@ -4256,7 +4254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (derivationMode != null) 'derivationMode': derivationMode!,
         if (source != null) 'source': source!.toJson(),
       };
@@ -4303,7 +4301,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (diskType != null) 'diskType': diskType!,
         if (mountPoint != null) 'mountPoint': mountPoint!,
         if (sizeGb != null) 'sizeGb': sizeGb!,
@@ -4402,7 +4400,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (durationValue != null) 'durationValue': durationValue!,
         if (floatValue != null) 'floatValue': floatValue!,
@@ -4469,7 +4467,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!.toJson(),
         if (histogram != null) 'histogram': histogram!.toJson(),
         if (max != null) 'max': max!.toJson(),
@@ -4506,7 +4504,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (primary != null) 'primary': primary!.toJson(),
         if (residual != null) 'residual': residual!.toJson(),
       };
@@ -4526,7 +4524,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Describes the environment in which a Dataflow Job runs.
@@ -4659,24 +4657,24 @@
           _json['flexResourceSchedulingGoal'] as core.String;
     }
     if (_json.containsKey('internalExperiments')) {
-      internalExperiments = (_json['internalExperiments'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      internalExperiments =
+          (_json['internalExperiments'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sdkPipelineOptions')) {
-      sdkPipelineOptions = (_json['sdkPipelineOptions'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      sdkPipelineOptions =
+          (_json['sdkPipelineOptions'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('serviceAccountEmail')) {
       serviceAccountEmail = _json['serviceAccountEmail'] as core.String;
@@ -4692,21 +4690,20 @@
     }
     if (_json.containsKey('userAgent')) {
       userAgent =
-          (_json['userAgent'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+          (_json['userAgent'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('version')) {
-      version =
-          (_json['version'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      version = (_json['version'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('workerPools')) {
       workerPools = (_json['workerPools'] as core.List)
@@ -4722,7 +4719,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusterManagerApiService != null)
           'clusterManagerApiService': clusterManagerApiService!,
         if (dataset != null) 'dataset': dataset!,
@@ -4820,7 +4817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentStateTime != null) 'currentStateTime': currentStateTime!,
         if (executionStageName != null)
           'executionStageName': executionStageName!,
@@ -4914,7 +4911,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (componentSource != null)
           'componentSource':
               componentSource!.map((value) => value.toJson()).toList(),
@@ -4949,7 +4946,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -4967,7 +4964,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filePattern != null) 'filePattern': filePattern!,
       };
 }
@@ -4988,7 +4985,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputs != null)
           'inputs': inputs!.map((value) => value.toJson()).toList(),
       };
@@ -5099,14 +5096,14 @@
           .toList();
     }
     if (_json.containsKey('additionalUserLabels')) {
-      additionalUserLabels = (_json['additionalUserLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      additionalUserLabels =
+          (_json['additionalUserLabels'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('enableStreamingEngine')) {
       enableStreamingEngine = _json['enableStreamingEngine'] as core.bool;
@@ -5152,7 +5149,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalExperiments != null)
           'additionalExperiments': additionalExperiments!,
         if (additionalUserLabels != null)
@@ -5191,7 +5188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (elements != null) 'elements': elements!,
       };
 }
@@ -5216,7 +5213,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!.toJson(),
         if (sum != null) 'sum': sum!,
       };
@@ -5249,7 +5246,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (componentId != null) 'componentId': componentId!,
         if (location != null) 'location': location!,
         if (workerId != null) 'workerId': workerId!,
@@ -5269,7 +5266,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!,
       };
 }
@@ -5315,7 +5312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
         if (runtimeMetadata != null)
           'runtimeMetadata': runtimeMetadata!.toJson(),
@@ -5358,7 +5355,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketCounts != null) 'bucketCounts': bucketCounts!,
         if (firstBucketOffset != null) 'firstBucketOffset': firstBucketOffset!,
       };
@@ -5391,7 +5388,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hotKeyAge != null) 'hotKeyAge': hotKeyAge!,
         if (systemName != null) 'systemName': systemName!,
         if (userStepName != null) 'userStepName': userStepName!,
@@ -5422,7 +5419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputNum != null) 'outputNum': outputNum!,
         if (producerInstructionIndex != null)
           'producerInstructionIndex': producerInstructionIndex!,
@@ -5462,12 +5459,12 @@
 
   InstructionOutput.fromJson(core.Map _json) {
     if (_json.containsKey('codec')) {
-      codec = (_json['codec'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      codec = (_json['codec'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5486,7 +5483,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (codec != null) 'codec': codec!,
         if (name != null) 'name': name!,
         if (onlyCountKeyBytes != null) 'onlyCountKeyBytes': onlyCountKeyBytes!,
@@ -5519,7 +5516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (timestamp != null) 'timestamp': timestamp!,
         if (value != null) 'value': value!.toJson(),
       };
@@ -5541,7 +5538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (elements != null)
           'elements': elements!.map((value) => value.toJson()).toList(),
       };
@@ -5568,7 +5565,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!.toJson(),
         if (sum != null) 'sum': sum!.toJson(),
       };
@@ -5862,13 +5859,12 @@
           _json['jobMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -5919,21 +5915,21 @@
           .toList();
     }
     if (_json.containsKey('transformNameMapping')) {
-      transformNameMapping = (_json['transformNameMapping'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      transformNameMapping =
+          (_json['transformNameMapping'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientRequestId != null) 'clientRequestId': clientRequestId!,
         if (createTime != null) 'createTime': createTime!,
         if (createdFromSnapshotId != null)
@@ -5992,7 +5988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (stages != null)
           'stages': stages!.map((value) => value.toJson()).toList(),
@@ -6009,19 +6005,17 @@
 
   JobExecutionInfo.fromJson(core.Map _json) {
     if (_json.containsKey('stages')) {
-      stages = (_json['stages'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              JobExecutionStageInfo.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      stages = (_json['stages'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          JobExecutionStageInfo.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stages != null)
           'stages':
               stages!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -6047,7 +6041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stepName != null) 'stepName': stepName!,
       };
 }
@@ -6107,7 +6101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (messageImportance != null) 'messageImportance': messageImportance!,
         if (messageText != null) 'messageText': messageText!,
@@ -6185,7 +6179,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigTableDetails != null)
           'bigTableDetails':
               bigTableDetails!.map((value) => value.toJson()).toList(),
@@ -6235,7 +6229,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricTime != null) 'metricTime': metricTime!,
         if (metrics != null)
           'metrics': metrics!.map((value) => value.toJson()).toList(),
@@ -6275,7 +6269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataDisk != null) 'dataDisk': dataDisk!,
         if (end != null) 'end': end!,
         if (start != null) 'start': start!,
@@ -6331,7 +6325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataDisk != null) 'dataDisk': dataDisk!,
         if (deliveryEndpoint != null) 'deliveryEndpoint': deliveryEndpoint!,
         if (deprecatedPersistentDirectory != null)
@@ -6400,41 +6394,39 @@
       jobName = _json['jobName'] as core.String;
     }
     if (_json.containsKey('launchOptions')) {
-      launchOptions = (_json['launchOptions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      launchOptions =
+          (_json['launchOptions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('transformNameMappings')) {
-      transformNameMappings = (_json['transformNameMappings'] as core.Map)
-          .cast<core.String, core.String>()
+      transformNameMappings = (_json['transformNameMappings']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('update')) {
       update = _json['update'] as core.bool;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerSpec != null) 'containerSpec': containerSpec!.toJson(),
         if (containerSpecGcsPath != null)
           'containerSpecGcsPath': containerSpecGcsPath!,
@@ -6472,7 +6464,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (launchParameter != null)
           'launchParameter': launchParameter!.toJson(),
         if (validateOnly != null) 'validateOnly': validateOnly!,
@@ -6493,7 +6485,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (job != null) 'job': job!.toJson(),
       };
 }
@@ -6532,31 +6524,30 @@
       jobName = _json['jobName'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('transformNameMapping')) {
-      transformNameMapping = (_json['transformNameMapping'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      transformNameMapping =
+          (_json['transformNameMapping'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('update')) {
       update = _json['update'] as core.bool;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environment != null) 'environment': environment!.toJson(),
         if (jobName != null) 'jobName': jobName!,
         if (parameters != null) 'parameters': parameters!,
@@ -6580,7 +6571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (job != null) 'job': job!.toJson(),
       };
 }
@@ -6629,14 +6620,14 @@
       requestedLeaseDuration = _json['requestedLeaseDuration'] as core.String;
     }
     if (_json.containsKey('unifiedWorkerRequest')) {
-      unifiedWorkerRequest = (_json['unifiedWorkerRequest'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      unifiedWorkerRequest =
+          (_json['unifiedWorkerRequest'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('workItemTypes')) {
       workItemTypes = (_json['workItemTypes'] as core.List)
@@ -6653,7 +6644,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentWorkerTime != null) 'currentWorkerTime': currentWorkerTime!,
         if (location != null) 'location': location!,
         if (requestedLeaseDuration != null)
@@ -6682,14 +6673,14 @@
 
   LeaseWorkItemResponse.fromJson(core.Map _json) {
     if (_json.containsKey('unifiedWorkerResponse')) {
-      unifiedWorkerResponse = (_json['unifiedWorkerResponse'] as core.Map)
-          .cast<core.String, core.Object>()
+      unifiedWorkerResponse = (_json['unifiedWorkerResponse']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('workItems')) {
       workItems = (_json['workItems'] as core.List)
@@ -6699,7 +6690,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unifiedWorkerResponse != null)
           'unifiedWorkerResponse': unifiedWorkerResponse!,
         if (workItems != null)
@@ -6738,7 +6729,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscalingEvents != null)
           'autoscalingEvents':
               autoscalingEvents!.map((value) => value.toJson()).toList(),
@@ -6786,7 +6777,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failedLocation != null)
           'failedLocation':
               failedLocation!.map((value) => value.toJson()).toList(),
@@ -6811,7 +6802,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (snapshots != null)
           'snapshots': snapshots!.map((value) => value.toJson()).toList(),
       };
@@ -6841,7 +6832,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (templateVersions != null)
           'templateVersions':
@@ -6894,7 +6885,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (counterPrefix != null) 'counterPrefix': counterPrefix!,
         if (instructions != null)
           'instructions': instructions!.map((value) => value.toJson()).toList(),
@@ -6935,7 +6926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentLimitBytes != null) 'currentLimitBytes': currentLimitBytes!,
         if (currentRssBytes != null) 'currentRssBytes': currentRssBytes!,
         if (timestamp != null) 'timestamp': timestamp!,
@@ -6965,7 +6956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricIndex != null) 'metricIndex': metricIndex!,
         if (shortId != null) 'shortId': shortId!,
       };
@@ -6994,13 +6985,12 @@
 
   MetricStructuredName.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
-      context =
-          (_json['context'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      context = (_json['context'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -7010,7 +7000,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (context != null) 'context': context!,
         if (name != null) 'name': name!,
         if (origin != null) 'origin': origin!,
@@ -7142,7 +7132,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cumulative != null) 'cumulative': cumulative!,
         if (distribution != null) 'distribution': distribution!,
         if (gauge != null) 'gauge': gauge!,
@@ -7188,7 +7178,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (op != null) 'op': op!,
         if (value != null) 'value': value!,
@@ -7204,17 +7194,16 @@
 
   ModifyTemplateVersionLabelResponse.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
       };
 }
@@ -7243,7 +7232,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (removeOnly != null) 'removeOnly': removeOnly!,
         if (tag != null) 'tag': tag!,
       };
@@ -7264,7 +7253,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tags != null) 'tags': tags!,
       };
 }
@@ -7286,7 +7275,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataDisk != null) 'dataDisk': dataDisk!,
       };
 }
@@ -7305,7 +7294,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (tag != null) 'tag': tag!,
       };
 }
@@ -7343,7 +7332,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
       };
@@ -7378,7 +7367,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null) 'location': location!,
         if (name != null) 'name': name!,
       };
@@ -7430,17 +7419,16 @@
           .toList();
     }
     if (_json.containsKey('userFn')) {
-      userFn =
-          (_json['userFn'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      userFn = (_json['userFn'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (input != null) 'input': input!.toJson(),
         if (multiOutputInfos != null)
           'multiOutputInfos':
@@ -7523,7 +7511,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (flatten != null) 'flatten': flatten!.toJson(),
         if (name != null) 'name': name!,
         if (originalName != null) 'originalName': originalName!,
@@ -7560,7 +7548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -7639,7 +7627,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (helpText != null) 'helpText': helpText!,
         if (isOptional != null) 'isOptional': isOptional!,
         if (label != null) 'label': label!,
@@ -7687,14 +7675,14 @@
           _json['input'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputElementCodec')) {
-      inputElementCodec = (_json['inputElementCodec'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      inputElementCodec =
+          (_json['inputElementCodec'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('originalCombineValuesInputStoreName')) {
       originalCombineValuesInputStoreName =
@@ -7711,18 +7699,18 @@
           .toList();
     }
     if (_json.containsKey('valueCombiningFn')) {
-      valueCombiningFn = (_json['valueCombiningFn'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      valueCombiningFn =
+          (_json['valueCombiningFn'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (input != null) 'input': input!.toJson(),
         if (inputElementCodec != null) 'inputElementCodec': inputElementCodec!,
         if (originalCombineValuesInputStoreName != null)
@@ -7776,7 +7764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayData != null)
           'displayData': displayData!.map((value) => value.toJson()).toList(),
         if (executionPipelineStage != null)
@@ -7808,7 +7796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (time != null) 'time': time!,
         if (value != null) 'value': value!,
       };
@@ -7864,7 +7852,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (byteOffset != null) 'byteOffset': byteOffset!,
         if (concatPosition != null) 'concatPosition': concatPosition!.toJson(),
         if (end != null) 'end': end!,
@@ -7898,7 +7886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentProgress != null) 'currentProgress': currentProgress!,
         if (dataPoints != null)
           'dataPoints': dataPoints!.map((value) => value.toJson()).toList(),
@@ -7924,7 +7912,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (subscription != null) 'subscription': subscription!,
         if (topic != null) 'topic': topic!,
       };
@@ -7986,7 +7974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dropLateData != null) 'dropLateData': dropLateData!,
         if (idLabel != null) 'idLabel': idLabel!,
         if (subscription != null) 'subscription': subscription!,
@@ -8023,7 +8011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expireTime != null) 'expireTime': expireTime!,
         if (snapshotName != null) 'snapshotName': snapshotName!,
         if (topicName != null) 'topicName': topicName!,
@@ -8045,7 +8033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queryProperty != null) 'queryProperty': queryProperty!,
       };
 }
@@ -8066,7 +8054,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (source != null) 'source': source!.toJson(),
       };
 }
@@ -8109,14 +8097,14 @@
       location = _json['location'] as core.String;
     }
     if (_json.containsKey('unifiedWorkerRequest')) {
-      unifiedWorkerRequest = (_json['unifiedWorkerRequest'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      unifiedWorkerRequest =
+          (_json['unifiedWorkerRequest'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('workItemStatuses')) {
       workItemStatuses = (_json['workItemStatuses'] as core.List)
@@ -8129,7 +8117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currentWorkerTime != null) 'currentWorkerTime': currentWorkerTime!,
         if (location != null) 'location': location!,
         if (unifiedWorkerRequest != null)
@@ -8159,14 +8147,14 @@
 
   ReportWorkItemStatusResponse.fromJson(core.Map _json) {
     if (_json.containsKey('unifiedWorkerResponse')) {
-      unifiedWorkerResponse = (_json['unifiedWorkerResponse'] as core.Map)
-          .cast<core.String, core.Object>()
+      unifiedWorkerResponse = (_json['unifiedWorkerResponse']
+              as core.Map<core.String, core.dynamic>)
           .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('workItemServiceStates')) {
       workItemServiceStates = (_json['workItemServiceStates'] as core.List)
@@ -8176,7 +8164,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (unifiedWorkerResponse != null)
           'unifiedWorkerResponse': unifiedWorkerResponse!,
         if (workItemServiceStates != null)
@@ -8210,7 +8198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isInfinite != null) 'isInfinite': isInfinite!,
         if (value != null) 'value': value!,
       };
@@ -8236,15 +8224,14 @@
 
   ResourceUtilizationReport.fromJson(core.Map _json) {
     if (_json.containsKey('containers')) {
-      containers = (_json['containers'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              ResourceUtilizationReport.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      containers =
+          (_json['containers'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          ResourceUtilizationReport.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('cpuTime')) {
       cpuTime = (_json['cpuTime'] as core.List)
@@ -8260,7 +8247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containers != null)
           'containers':
               containers!.map((key, item) => core.MapEntry(key, item.toJson())),
@@ -8279,7 +8266,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The environment values to set at runtime.
@@ -8383,14 +8370,14 @@
           .toList();
     }
     if (_json.containsKey('additionalUserLabels')) {
-      additionalUserLabels = (_json['additionalUserLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      additionalUserLabels =
+          (_json['additionalUserLabels'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('bypassTempDirValidation')) {
       bypassTempDirValidation = _json['bypassTempDirValidation'] as core.bool;
@@ -8436,7 +8423,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalExperiments != null)
           'additionalExperiments': additionalExperiments!,
         if (additionalUserLabels != null)
@@ -8484,7 +8471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (parameters != null)
           'parameters': parameters!.map((value) => value.toJson()).toList(),
         if (sdkInfo != null) 'sdkInfo': sdkInfo!.toJson(),
@@ -8518,7 +8505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (language != null) 'language': language!,
         if (version != null) 'version': version!,
       };
@@ -8556,7 +8543,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerImage != null) 'containerImage': containerImage!,
         if (environmentId != null) 'environmentId': environmentId!,
         if (useSingleCorePerContainer != null)
@@ -8598,7 +8585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sdkSupportStatus != null) 'sdkSupportStatus': sdkSupportStatus!,
         if (version != null) 'version': version!,
         if (versionDisplayName != null)
@@ -8639,7 +8626,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (componentId != null) 'componentId': componentId!,
         if (data != null) 'data': data!,
         if (location != null) 'location': location!,
@@ -8657,7 +8644,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A request for sending worker messages to the service.
@@ -8684,7 +8671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null) 'location': location!,
         if (workerMessages != null)
           'workerMessages':
@@ -8708,7 +8695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (workerMessageResponses != null)
           'workerMessageResponses':
               workerMessageResponses!.map((value) => value.toJson()).toList(),
@@ -8767,17 +8754,16 @@
       systemName = _json['systemName'] as core.String;
     }
     if (_json.containsKey('userFn')) {
-      userFn =
-          (_json['userFn'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      userFn = (_json['userFn'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputs != null)
           'inputs': inputs!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -8809,7 +8795,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sink != null) 'sink': sink!.toJson(),
         if (tag != null) 'tag': tag!,
       };
@@ -8834,7 +8820,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (command != null) 'command': command!,
         if (exitCode != null) 'exitCode': exitCode!,
       };
@@ -8862,12 +8848,12 @@
 
   SideInputInfo.fromJson(core.Map _json) {
     if (_json.containsKey('kind')) {
-      kind = (_json['kind'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      kind = (_json['kind'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sources')) {
       sources = (_json['sources'] as core.List)
@@ -8880,7 +8866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (sources != null)
           'sources': sources!.map((value) => value.toJson()).toList(),
@@ -8906,24 +8892,24 @@
 
   Sink.fromJson(core.Map _json) {
     if (_json.containsKey('codec')) {
-      codec = (_json['codec'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      codec = (_json['codec'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('spec')) {
-      spec = (_json['spec'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      spec = (_json['spec'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (codec != null) 'codec': codec!,
         if (spec != null) 'spec': spec!,
       };
@@ -9006,7 +8992,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!,
         if (description != null) 'description': description!,
         if (diskSizeBytes != null) 'diskSizeBytes': diskSizeBytes!,
@@ -9054,7 +9040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (location != null) 'location': location!,
         if (snapshotSources != null) 'snapshotSources': snapshotSources!,
@@ -9117,8 +9103,8 @@
   Source.fromJson(core.Map _json) {
     if (_json.containsKey('baseSpecs')) {
       baseSpecs = (_json['baseSpecs'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -9127,12 +9113,12 @@
           .toList();
     }
     if (_json.containsKey('codec')) {
-      codec = (_json['codec'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      codec = (_json['codec'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('doesNotNeedSplitting')) {
       doesNotNeedSplitting = _json['doesNotNeedSplitting'] as core.bool;
@@ -9142,16 +9128,16 @@
           _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spec')) {
-      spec = (_json['spec'] as core.Map).cast<core.String, core.Object>().map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      spec = (_json['spec'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseSpecs != null) 'baseSpecs': baseSpecs!,
         if (codec != null) 'codec': codec!,
         if (doesNotNeedSplitting != null)
@@ -9196,7 +9182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (primary != null) 'primary': primary!.toJson(),
         if (primarySource != null) 'primarySource': primarySource!.toJson(),
         if (residual != null) 'residual': residual!.toJson(),
@@ -9218,7 +9204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (source != null) 'source': source!.toJson(),
       };
 }
@@ -9237,7 +9223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadata != null) 'metadata': metadata!.toJson(),
       };
 }
@@ -9274,7 +9260,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (estimatedSizeBytes != null)
           'estimatedSizeBytes': estimatedSizeBytes!,
         if (infinite != null) 'infinite': infinite!,
@@ -9334,7 +9320,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (getMetadata != null) 'getMetadata': getMetadata!.toJson(),
         if (name != null) 'name': name!,
         if (originalName != null) 'originalName': originalName!,
@@ -9367,7 +9353,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (getMetadata != null) 'getMetadata': getMetadata!.toJson(),
         if (split != null) 'split': split!.toJson(),
       };
@@ -9394,7 +9380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (desiredBundleSizeBytes != null)
           'desiredBundleSizeBytes': desiredBundleSizeBytes!,
         if (desiredShardSizeBytes != null)
@@ -9434,7 +9420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (options != null) 'options': options!.toJson(),
         if (source != null) 'source': source!.toJson(),
       };
@@ -9487,7 +9473,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bundles != null)
           'bundles': bundles!.map((value) => value.toJson()).toList(),
         if (outcome != null) 'outcome': outcome!,
@@ -9525,7 +9511,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (derivationMode != null) 'derivationMode': derivationMode!,
         if (source != null) 'source': source!.toJson(),
       };
@@ -9556,7 +9542,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (databaseId != null) 'databaseId': databaseId!,
         if (instanceId != null) 'instanceId': instanceId!,
         if (projectId != null) 'projectId': projectId!,
@@ -9583,7 +9569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (highBits != null) 'highBits': highBits!,
         if (lowBits != null) 'lowBits': lowBits!,
       };
@@ -9614,7 +9600,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (workers != null)
           'workers': workers!.map((value) => value.toJson()).toList(),
@@ -9654,7 +9640,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (originalTransformOrCollection != null)
           'originalTransformOrCollection': originalTransformOrCollection!,
@@ -9723,7 +9709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTime != null) 'endTime': endTime!,
         if (metrics != null)
           'metrics': metrics!.map((value) => value.toJson()).toList(),
@@ -9753,7 +9739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isRead != null) 'isRead': isRead!,
         if (stateFamily != null) 'stateFamily': stateFamily!,
       };
@@ -9792,8 +9778,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -9806,7 +9792,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -9855,18 +9841,17 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = (_json['properties'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      properties =
+          (_json['properties'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
         if (properties != null) 'properties': properties!,
@@ -9911,7 +9896,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customSourceLocation != null)
           'customSourceLocation': customSourceLocation!.toJson(),
         if (pubsubLocation != null) 'pubsubLocation': pubsubLocation!.toJson(),
@@ -9941,7 +9926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (importStateEndpoint != null)
           'importStateEndpoint': importStateEndpoint!,
         if (snapshotId != null) 'snapshotId': snapshotId!,
@@ -9985,19 +9970,18 @@
       systemName = _json['systemName'] as core.String;
     }
     if (_json.containsKey('transformUserNameToStateFamily')) {
-      transformUserNameToStateFamily =
-          (_json['transformUserNameToStateFamily'] as core.Map)
-              .cast<core.String, core.String>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      transformUserNameToStateFamily = (_json['transformUserNameToStateFamily']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (computationId != null) 'computationId': computationId!,
         if (instructions != null)
           'instructions': instructions!.map((value) => value.toJson()).toList(),
@@ -10032,7 +10016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (computationId != null) 'computationId': computationId!,
         if (rangeAssignments != null)
           'rangeAssignments':
@@ -10080,7 +10064,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (computationRanges != null)
           'computationRanges':
               computationRanges!.map((value) => value.toJson()).toList(),
@@ -10141,15 +10125,14 @@
               .toList();
     }
     if (_json.containsKey('userStepToStateFamilyNameMap')) {
-      userStepToStateFamilyNameMap =
-          (_json['userStepToStateFamilyNameMap'] as core.Map)
-              .cast<core.String, core.String>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      userStepToStateFamilyNameMap = (_json['userStepToStateFamilyNameMap']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('windmillServiceEndpoint')) {
       windmillServiceEndpoint = _json['windmillServiceEndpoint'] as core.String;
@@ -10159,7 +10142,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commitStreamChunkSizeBytes != null)
           'commitStreamChunkSizeBytes': commitStreamChunkSizeBytes!,
         if (getDataStreamChunkSizeBytes != null)
@@ -10221,7 +10204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (drain != null) 'drain': drain!,
         if (receiveWorkPort != null) 'receiveWorkPort': receiveWorkPort!,
         if (snapshotConfig != null) 'snapshotConfig': snapshotConfig!.toJson(),
@@ -10251,7 +10234,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stateFamily != null) 'stateFamily': stateFamily!,
         if (tag != null) 'tag': tag!,
       };
@@ -10271,7 +10254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (streamId != null) 'streamId': streamId!,
       };
 }
@@ -10291,7 +10274,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (elements != null) 'elements': elements!,
       };
 }
@@ -10328,7 +10311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (messageKey != null) 'messageKey': messageKey!,
         if (messageText != null) 'messageText': messageText!,
         if (parameters != null)
@@ -10482,7 +10465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alsologtostderr != null) 'alsologtostderr': alsologtostderr!,
         if (baseTaskDir != null) 'baseTaskDir': baseTaskDir!,
         if (baseUrl != null) 'baseUrl': baseUrl!,
@@ -10543,7 +10526,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (name != null) 'name': name!,
         if (parameters != null)
@@ -10620,13 +10603,12 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
@@ -10644,7 +10626,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (artifact != null) 'artifact': artifact!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
@@ -10697,19 +10679,18 @@
       persistentStateVersion = _json['persistentStateVersion'] as core.int;
     }
     if (_json.containsKey('userStageToComputationNameMap')) {
-      userStageToComputationNameMap =
-          (_json['userStageToComputationNameMap'] as core.Map)
-              .cast<core.String, core.String>()
-              .map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      userStageToComputationNameMap = (_json['userStageToComputationNameMap']
+              as core.Map<core.String, core.dynamic>)
+          .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (computations != null)
           'computations': computations!.map((value) => value.toJson()).toList(),
         if (dataDiskAssignments != null)
@@ -10785,7 +10766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayData != null)
           'displayData': displayData!.map((value) => value.toJson()).toList(),
         if (id != null) 'id': id!,
@@ -10820,7 +10801,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (queryInfo != null) 'queryInfo': queryInfo!.toJson(),
       };
@@ -10936,7 +10917,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configuration != null) 'configuration': configuration!,
         if (id != null) 'id': id!,
         if (initialReportIndex != null)
@@ -11026,7 +11007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attemptId != null) 'attemptId': attemptId!,
         if (endTime != null) 'endTime': endTime!,
         if (metrics != null)
@@ -11099,14 +11080,13 @@
           _json['completeWorkStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('harnessData')) {
-      harnessData = (_json['harnessData'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      harnessData =
+          (_json['harnessData'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('hotKeyDetection')) {
       hotKeyDetection = HotKeyDetection.fromJson(
@@ -11141,7 +11121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completeWorkStatus != null)
           'completeWorkStatus': completeWorkStatus!.toJson(),
         if (harnessData != null) 'harnessData': harnessData!,
@@ -11308,7 +11288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completed != null) 'completed': completed!,
         if (counterUpdates != null)
           'counterUpdates':
@@ -11358,7 +11338,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (workItems != null)
           'workItems': workItems!.map((value) => value.toJson()).toList(),
         if (workerName != null) 'workerName': workerName!,
@@ -11410,8 +11390,8 @@
     }
     if (_json.containsKey('pods')) {
       pods = (_json['pods'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -11433,7 +11413,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (msg != null) 'msg': msg!,
         if (pods != null) 'pods': pods!,
         if (reportInterval != null) 'reportInterval': reportInterval!,
@@ -11461,7 +11441,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reportInterval != null) 'reportInterval': reportInterval!,
       };
 }
@@ -11510,17 +11490,16 @@
       event = _json['event'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerStartTime != null)
           'containerStartTime': containerStartTime!,
         if (event != null) 'event': event!,
@@ -11562,13 +11541,12 @@
 
   WorkerMessage.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('time')) {
       time = _json['time'] as core.String;
@@ -11595,7 +11573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (time != null) 'time': time!,
         if (workerHealthReport != null)
@@ -11652,18 +11630,17 @@
       code = _json['code'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = (_json['parameters'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      parameters =
+          (_json['parameters'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (parameters != null) 'parameters': parameters!,
       };
@@ -11701,7 +11678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (workerHealthReportResponse != null)
           'workerHealthReportResponse': workerHealthReportResponse!.toJson(),
         if (workerMetricsResponse != null)
@@ -11896,13 +11873,12 @@
       machineType = _json['machineType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('network')) {
       network = _json['network'] as core.String;
@@ -11923,13 +11899,12 @@
           .toList();
     }
     if (_json.containsKey('poolArgs')) {
-      poolArgs =
-          (_json['poolArgs'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      poolArgs = (_json['poolArgs'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('sdkHarnessContainerImages')) {
       sdkHarnessContainerImages =
@@ -11958,7 +11933,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (autoscalingSettings != null)
           'autoscalingSettings': autoscalingSettings!.toJson(),
         if (dataDisks != null)
@@ -12048,7 +12023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseUrl != null) 'baseUrl': baseUrl!,
         if (reportingEnabled != null) 'reportingEnabled': reportingEnabled!,
         if (servicePath != null) 'servicePath': servicePath!,
@@ -12079,7 +12054,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reason != null) 'reason': reason!,
       };
 }
@@ -12092,7 +12067,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An instruction that writes records.
@@ -12118,7 +12093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (input != null) 'input': input!.toJson(),
         if (sink != null) 'sink': sink!.toJson(),
       };
diff --git a/generated/googleapis_beta/lib/datalabeling/v1beta1.dart b/generated/googleapis_beta/lib/datalabeling/v1beta1.dart
index ca914f5..b77bb25 100644
--- a/generated/googleapis_beta/lib/datalabeling/v1beta1.dart
+++ b/generated/googleapis_beta/lib/datalabeling/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2457,7 +2456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (instruction != null) 'instruction': instruction!,
         if (partialFailures != null)
@@ -2515,7 +2514,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
@@ -2584,7 +2583,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (dataset != null) 'dataset': dataset!,
         if (exportCount != null) 'exportCount': exportCount!,
@@ -2619,7 +2618,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mimeType != null) 'mimeType': mimeType!,
         if (outputUri != null) 'outputUri': outputUri!,
       };
@@ -2640,7 +2639,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputFolderUri != null) 'outputFolderUri': outputFolderUri!,
       };
 }
@@ -2751,7 +2750,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDatasetDescription != null)
           'annotatedDatasetDescription': annotatedDatasetDescription!,
         if (annotatedDatasetDisplayName != null)
@@ -2806,7 +2805,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
         if (partialFailures != null)
@@ -2847,7 +2846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!,
         if (importCount != null) 'importCount': importCount!,
         if (totalCount != null) 'totalCount': totalCount!,
@@ -2870,7 +2869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -2891,7 +2890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -2912,7 +2911,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -2933,7 +2932,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -2954,7 +2953,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -2975,7 +2974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -3161,7 +3160,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
@@ -3211,18 +3210,17 @@
 
   GoogleCloudDatalabelingV1alpha1LabelStats.fromJson(core.Map _json) {
     if (_json.containsKey('exampleCount')) {
-      exampleCount = (_json['exampleCount'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      exampleCount =
+          (_json['exampleCount'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exampleCount != null) 'exampleCount': exampleCount!,
       };
 }
@@ -3243,7 +3241,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -3264,7 +3262,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -3285,7 +3283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -3306,7 +3304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -3327,7 +3325,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -3348,7 +3346,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -3381,7 +3379,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
         if (gcsFolderDestination != null)
           'gcsFolderDestination': gcsFolderDestination!.toJson(),
@@ -3527,7 +3525,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSource != null) 'annotationSource': annotationSource!,
         if (annotationType != null) 'annotationType': annotationType!,
         if (blockingResources != null) 'blockingResources': blockingResources!,
@@ -3651,7 +3649,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPolyConfig != null)
           'boundingPolyConfig': boundingPolyConfig!.toJson(),
         if (eventConfig != null) 'eventConfig': eventConfig!.toJson(),
@@ -3739,7 +3737,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationMetadata != null)
           'annotationMetadata': annotationMetadata!.toJson(),
         if (annotationSentiment != null)
@@ -3766,7 +3764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operatorMetadata != null)
           'operatorMetadata': operatorMetadata!.toJson(),
       };
@@ -3819,7 +3817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (displayName != null) 'displayName': displayName!,
         if (index != null) 'index': index!,
@@ -3892,7 +3890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecs != null)
           'annotationSpecs':
               annotationSpecs!.map((value) => value.toJson()).toList(),
@@ -3928,7 +3926,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowMultiLabel != null) 'allowMultiLabel': allowMultiLabel!,
         if (annotationSpecSet != null) 'annotationSpecSet': annotationSpecSet!,
       };
@@ -4035,7 +4033,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageBoundingPolyAnnotation != null)
           'imageBoundingPolyAnnotation': imageBoundingPolyAnnotation!.toJson(),
         if (imageClassificationAnnotation != null)
@@ -4083,7 +4081,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attemptTime != null) 'attemptTime': attemptTime!,
         if (partialFailures != null)
           'partialFailures':
@@ -4118,7 +4116,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputUri != null) 'inputUri': inputUri!,
       };
 }
@@ -4141,7 +4139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iouThreshold != null) 'iouThreshold': iouThreshold!,
       };
 }
@@ -4163,7 +4161,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vertices != null)
           'vertices': vertices!.map((value) => value.toJson()).toList(),
       };
@@ -4192,7 +4190,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSet != null) 'annotationSpecSet': annotationSpecSet!,
         if (instructionMessage != null)
           'instructionMessage': instructionMessage!,
@@ -4213,7 +4211,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isMultiLabel != null) 'isMultiLabel': isMultiLabel!,
       };
 }
@@ -4242,7 +4240,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confusionMatrix != null)
           'confusionMatrix': confusionMatrix!.toJson(),
         if (prCurve != null) 'prCurve': prCurve!.toJson(),
@@ -4325,7 +4323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidenceThreshold != null)
           'confidenceThreshold': confidenceThreshold!,
         if (f1Score != null) 'f1Score': f1Score!,
@@ -4359,7 +4357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (row != null) 'row': row!.map((value) => value.toJson()).toList(),
       };
 }
@@ -4386,7 +4384,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
         if (itemCount != null) 'itemCount': itemCount!,
       };
@@ -4414,7 +4412,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSet != null)
           'annotationSpecSet': annotationSpecSet!.toJson(),
       };
@@ -4436,7 +4434,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!.toJson(),
       };
 }
@@ -4458,7 +4456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (job != null) 'job': job!.toJson(),
       };
 }
@@ -4497,7 +4495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (instruction != null) 'instruction': instruction!,
         if (partialFailures != null)
@@ -4523,7 +4521,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instruction != null) 'instruction': instruction!.toJson(),
       };
 }
@@ -4545,7 +4543,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsFileUri != null) 'gcsFileUri': gcsFileUri!,
       };
 }
@@ -4589,7 +4587,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imagePayload != null) 'imagePayload': imagePayload!.toJson(),
         if (name != null) 'name': name!,
         if (textPayload != null) 'textPayload': textPayload!.toJson(),
@@ -4687,7 +4685,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockingResources != null) 'blockingResources': blockingResources!,
         if (createTime != null) 'createTime': createTime!,
         if (dataItemCount != null) 'dataItemCount': dataItemCount!,
@@ -4800,7 +4798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationType != null) 'annotationType': annotationType!,
         if (config != null) 'config': config!.toJson(),
         if (createTime != null) 'createTime': createTime!,
@@ -4835,7 +4833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingBoxEvaluationOptions != null)
           'boundingBoxEvaluationOptions':
               boundingBoxEvaluationOptions!.toJson(),
@@ -5000,7 +4998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSet != null) 'annotationSpecSet': annotationSpecSet!,
         if (attempts != null)
           'attempts': attempts!.map((value) => value.toJson()).toList(),
@@ -5048,7 +5046,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (minAcceptableMeanAveragePrecision != null)
           'minAcceptableMeanAveragePrecision':
@@ -5170,14 +5168,14 @@
 
   GoogleCloudDatalabelingV1beta1EvaluationJobConfig.fromJson(core.Map _json) {
     if (_json.containsKey('bigqueryImportKeys')) {
-      bigqueryImportKeys = (_json['bigqueryImportKeys'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      bigqueryImportKeys =
+          (_json['bigqueryImportKeys'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('boundingPolyConfig')) {
       boundingPolyConfig =
@@ -5227,7 +5225,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigqueryImportKeys != null)
           'bigqueryImportKeys': bigqueryImportKeys!,
         if (boundingPolyConfig != null)
@@ -5270,7 +5268,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (classificationMetrics != null)
           'classificationMetrics': classificationMetrics!.toJson(),
         if (objectDetectionMetrics != null)
@@ -5315,7 +5313,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSets != null)
           'annotationSpecSets': annotationSpecSets!,
         if (clipLength != null) 'clipLength': clipLength!,
@@ -5377,7 +5375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotations != null)
           'annotations': annotations!.map((value) => value.toJson()).toList(),
         if (imagePayload != null) 'imagePayload': imagePayload!.toJson(),
@@ -5412,7 +5410,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (groundTruthExample != null)
           'groundTruthExample': groundTruthExample!.toJson(),
         if (modelCreatedExamples != null)
@@ -5470,7 +5468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
@@ -5539,7 +5537,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (dataset != null) 'dataset': dataset!,
         if (exportCount != null) 'exportCount': exportCount!,
@@ -5595,7 +5593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (filter != null) 'filter': filter!,
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
@@ -5662,7 +5660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (body != null) 'body': body!,
         if (createTime != null) 'createTime': createTime!,
         if (image != null) 'image': image!,
@@ -5699,7 +5697,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feedbackThreadMetadata != null)
           'feedbackThreadMetadata': feedbackThreadMetadata!.toJson(),
         if (name != null) 'name': name!,
@@ -5747,7 +5745,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (lastUpdateTime != null) 'lastUpdateTime': lastUpdateTime!,
         if (status != null) 'status': status!,
@@ -5780,7 +5778,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mimeType != null) 'mimeType': mimeType!,
         if (outputUri != null) 'outputUri': outputUri!,
       };
@@ -5801,7 +5799,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputFolderUri != null) 'outputFolderUri': outputFolderUri!,
       };
 }
@@ -5833,7 +5831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputUri != null) 'inputUri': inputUri!,
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -5944,7 +5942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDatasetDescription != null)
           'annotatedDatasetDescription': annotatedDatasetDescription!,
         if (annotatedDatasetDisplayName != null)
@@ -5988,7 +5986,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (normalizedBoundingPoly != null)
@@ -6011,7 +6009,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
       };
 }
@@ -6054,7 +6052,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowMultiLabel != null) 'allowMultiLabel': allowMultiLabel!,
         if (annotationSpecSet != null) 'annotationSpecSet': annotationSpecSet!,
         if (answerAggregationType != null)
@@ -6100,7 +6098,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageThumbnail != null) 'imageThumbnail': imageThumbnail!,
         if (imageUri != null) 'imageUri': imageUri!,
         if (mimeType != null) 'mimeType': mimeType!,
@@ -6135,7 +6133,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
         if (normalizedPolyline != null)
           'normalizedPolyline': normalizedPolyline!.toJson(),
@@ -6170,15 +6168,15 @@
   GoogleCloudDatalabelingV1beta1ImageSegmentationAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('annotationColors')) {
-      annotationColors = (_json['annotationColors'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudDatalabelingV1beta1AnnotationSpec.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      annotationColors =
+          (_json['annotationColors'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudDatalabelingV1beta1AnnotationSpec.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('imageBytes')) {
       imageBytes = _json['imageBytes'] as core.String;
@@ -6188,7 +6186,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationColors != null)
           'annotationColors': annotationColors!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -6237,7 +6235,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
         if (partialFailures != null)
@@ -6278,7 +6276,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!,
         if (importCount != null) 'importCount': importCount!,
         if (totalCount != null) 'totalCount': totalCount!,
@@ -6310,7 +6308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (userEmailAddress != null) 'userEmailAddress': userEmailAddress!,
       };
@@ -6408,7 +6406,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationType != null) 'annotationType': annotationType!,
         if (bigquerySource != null) 'bigquerySource': bigquerySource!.toJson(),
         if (classificationMetadata != null)
@@ -6519,7 +6517,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blockingResources != null) 'blockingResources': blockingResources!,
         if (createTime != null) 'createTime': createTime!,
         if (csvInstruction != null) 'csvInstruction': csvInstruction!.toJson(),
@@ -6548,7 +6546,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -6569,7 +6567,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -6590,7 +6588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -6611,7 +6609,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -6632,7 +6630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -6723,7 +6721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
         if (boundingPolyConfig != null)
           'boundingPolyConfig': boundingPolyConfig!.toJson(),
@@ -6752,7 +6750,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -6938,7 +6936,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
@@ -6988,18 +6986,17 @@
 
   GoogleCloudDatalabelingV1beta1LabelStats.fromJson(core.Map _json) {
     if (_json.containsKey('exampleCount')) {
-      exampleCount = (_json['exampleCount'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      exampleCount =
+          (_json['exampleCount'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exampleCount != null) 'exampleCount': exampleCount!,
       };
 }
@@ -7020,7 +7017,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -7041,7 +7038,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -7101,7 +7098,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
         if (feature != null) 'feature': feature!,
         if (textClassificationConfig != null)
@@ -7127,7 +7124,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -7148,7 +7145,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -7169,7 +7166,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -7190,7 +7187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -7275,7 +7272,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
         if (eventConfig != null) 'eventConfig': eventConfig!.toJson(),
         if (feature != null) 'feature': feature!,
@@ -7312,7 +7309,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDatasets != null)
           'annotatedDatasets':
               annotatedDatasets!.map((value) => value.toJson()).toList(),
@@ -7345,7 +7342,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSets != null)
           'annotationSpecSets':
               annotationSpecSets!.map((value) => value.toJson()).toList(),
@@ -7376,7 +7373,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataItems != null)
           'dataItems': dataItems!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -7406,7 +7403,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasets != null)
           'datasets': datasets!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -7437,7 +7434,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (evaluationJobs != null)
           'evaluationJobs':
               evaluationJobs!.map((value) => value.toJson()).toList(),
@@ -7468,7 +7465,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (examples != null)
           'examples': examples!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -7499,7 +7496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feedbackMessages != null)
           'feedbackMessages':
               feedbackMessages!.map((value) => value.toJson()).toList(),
@@ -7531,7 +7528,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (feedbackThreads != null)
           'feedbackThreads':
               feedbackThreads!.map((value) => value.toJson()).toList(),
@@ -7563,7 +7560,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instructions != null)
           'instructions': instructions!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -7588,7 +7585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedVertices != null)
           'normalizedVertices':
               normalizedVertices!.map((value) => value.toJson()).toList(),
@@ -7612,7 +7609,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedVertices != null)
           'normalizedVertices':
               normalizedVertices!.map((value) => value.toJson()).toList(),
@@ -7641,7 +7638,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -7676,7 +7673,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSet != null) 'annotationSpecSet': annotationSpecSet!,
         if (extractionFrameRate != null)
           'extractionFrameRate': extractionFrameRate!,
@@ -7698,7 +7695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (prCurve != null) 'prCurve': prCurve!.toJson(),
       };
 }
@@ -7736,7 +7733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSet != null) 'annotationSpecSet': annotationSpecSet!,
         if (clipLength != null) 'clipLength': clipLength!,
         if (overlapLength != null) 'overlapLength': overlapLength!,
@@ -7769,7 +7766,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (normalizedBoundingPoly != null)
           'normalizedBoundingPoly': normalizedBoundingPoly!.toJson(),
@@ -7785,7 +7782,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// General information useful for labels coming from contributors.
@@ -7824,7 +7821,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (comments != null) 'comments': comments!,
         if (labelVotes != null) 'labelVotes': labelVotes!,
         if (score != null) 'score': score!,
@@ -7860,7 +7857,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
         if (gcsFolderDestination != null)
           'gcsFolderDestination': gcsFolderDestination!.toJson(),
@@ -7875,7 +7872,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Instruction from a PDF file.
@@ -7893,7 +7890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsFileUri != null) 'gcsFileUri': gcsFileUri!,
       };
 }
@@ -7915,7 +7912,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vertices != null)
           'vertices': vertices!.map((value) => value.toJson()).toList(),
       };
@@ -7944,7 +7941,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSet != null) 'annotationSpecSet': annotationSpecSet!,
         if (instructionMessage != null)
           'instructionMessage': instructionMessage!,
@@ -7999,7 +7996,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
         if (areaUnderCurve != null) 'areaUnderCurve': areaUnderCurve!,
         if (confidenceMetricsEntries != null)
@@ -8018,7 +8015,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message ResumeEvaluationJob.
@@ -8029,7 +8026,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A row in the confusion matrix.
@@ -8060,7 +8057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
         if (entries != null)
           'entries': entries!.map((value) => value.toJson()).toList(),
@@ -8091,7 +8088,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (evaluations != null)
           'evaluations': evaluations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8128,7 +8125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageSize != null) 'pageSize': pageSize!,
         if (pageToken != null) 'pageToken': pageToken!,
       };
@@ -8159,7 +8156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exampleComparisons != null)
           'exampleComparisons':
               exampleComparisons!.map((value) => value.toJson()).toList(),
@@ -8190,7 +8187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSet != null) 'annotationSpecSet': annotationSpecSet!,
         if (instructionMessage != null)
           'instructionMessage': instructionMessage!,
@@ -8214,7 +8211,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enableLabelSentimentSelection != null)
           'enableLabelSentimentSelection': enableLabelSentimentSelection!,
       };
@@ -8239,7 +8236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (end != null) 'end': end!,
         if (start != null) 'start': start!,
       };
@@ -8260,7 +8257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
       };
 }
@@ -8302,7 +8299,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowMultiLabel != null) 'allowMultiLabel': allowMultiLabel!,
         if (annotationSpecSet != null) 'annotationSpecSet': annotationSpecSet!,
         if (sentimentConfig != null)
@@ -8334,7 +8331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
         if (sequentialSegment != null)
           'sequentialSegment': sequentialSegment!.toJson(),
@@ -8357,7 +8354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSet != null) 'annotationSpecSet': annotationSpecSet!,
       };
 }
@@ -8378,7 +8375,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
       };
 }
@@ -8396,7 +8393,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (textContent != null) 'textContent': textContent!,
       };
 }
@@ -8422,7 +8419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTimeOffset != null) 'endTimeOffset': endTimeOffset!,
         if (startTimeOffset != null) 'startTimeOffset': startTimeOffset!,
       };
@@ -8449,7 +8446,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -8477,7 +8474,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
         if (timeSegment != null) 'timeSegment': timeSegment!.toJson(),
       };
@@ -8523,7 +8520,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpecSetConfigs != null)
           'annotationSpecSetConfigs':
               annotationSpecSetConfigs!.map((value) => value.toJson()).toList(),
@@ -8553,7 +8550,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
         if (timeSegment != null) 'timeSegment': timeSegment!.toJson(),
       };
@@ -8592,7 +8589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotationSpec != null) 'annotationSpec': annotationSpec!.toJson(),
         if (objectTrackingFrames != null)
           'objectTrackingFrames':
@@ -8642,7 +8639,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frameRate != null) 'frameRate': frameRate!,
         if (mimeType != null) 'mimeType': mimeType!,
         if (signedUri != null) 'signedUri': signedUri!,
@@ -8679,7 +8676,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (thumbnail != null) 'thumbnail': thumbnail!,
         if (timeOffset != null) 'timeOffset': timeOffset!,
       };
@@ -8719,7 +8716,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (instruction != null) 'instruction': instruction!,
         if (partialFailures != null)
@@ -8777,7 +8774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
@@ -8846,7 +8843,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (dataset != null) 'dataset': dataset!,
         if (exportCount != null) 'exportCount': exportCount!,
@@ -8881,7 +8878,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mimeType != null) 'mimeType': mimeType!,
         if (outputUri != null) 'outputUri': outputUri!,
       };
@@ -8903,7 +8900,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputFolderUri != null) 'outputFolderUri': outputFolderUri!,
       };
 }
@@ -8930,7 +8927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
       };
@@ -9042,7 +9039,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDatasetDescription != null)
           'annotatedDatasetDescription': annotatedDatasetDescription!,
         if (annotatedDatasetDisplayName != null)
@@ -9097,7 +9094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
         if (partialFailures != null)
@@ -9138,7 +9135,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!,
         if (importCount != null) 'importCount': importCount!,
         if (totalCount != null) 'totalCount': totalCount!,
@@ -9161,7 +9158,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9182,7 +9179,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9203,7 +9200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9224,7 +9221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9245,7 +9242,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9266,7 +9263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9452,7 +9449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
@@ -9502,18 +9499,17 @@
 
   GoogleCloudDatalabelingV1p1alpha1LabelStats.fromJson(core.Map _json) {
     if (_json.containsKey('exampleCount')) {
-      exampleCount = (_json['exampleCount'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      exampleCount =
+          (_json['exampleCount'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exampleCount != null) 'exampleCount': exampleCount!,
       };
 }
@@ -9534,7 +9530,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9555,7 +9551,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9576,7 +9572,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9597,7 +9593,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9618,7 +9614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9639,7 +9635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -9672,7 +9668,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
         if (gcsFolderDestination != null)
           'gcsFolderDestination': gcsFolderDestination!.toJson(),
@@ -9713,7 +9709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (instruction != null) 'instruction': instruction!,
         if (partialFailures != null)
@@ -9771,7 +9767,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
@@ -9840,7 +9836,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (dataset != null) 'dataset': dataset!,
         if (exportCount != null) 'exportCount': exportCount!,
@@ -9875,7 +9871,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mimeType != null) 'mimeType': mimeType!,
         if (outputUri != null) 'outputUri': outputUri!,
       };
@@ -9897,7 +9893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outputFolderUri != null) 'outputFolderUri': outputFolderUri!,
       };
 }
@@ -10008,7 +10004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDatasetDescription != null)
           'annotatedDatasetDescription': annotatedDatasetDescription!,
         if (annotatedDatasetDisplayName != null)
@@ -10063,7 +10059,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
         if (partialFailures != null)
@@ -10104,7 +10100,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataset != null) 'dataset': dataset!,
         if (importCount != null) 'importCount': importCount!,
         if (totalCount != null) 'totalCount': totalCount!,
@@ -10127,7 +10123,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10148,7 +10144,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10169,7 +10165,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10190,7 +10186,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10211,7 +10207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10232,7 +10228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10418,7 +10414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (annotatedDataset != null) 'annotatedDataset': annotatedDataset!,
         if (createTime != null) 'createTime': createTime!,
         if (dataset != null) 'dataset': dataset!,
@@ -10468,18 +10464,17 @@
 
   GoogleCloudDatalabelingV1p2alpha1LabelStats.fromJson(core.Map _json) {
     if (_json.containsKey('exampleCount')) {
-      exampleCount = (_json['exampleCount'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      exampleCount =
+          (_json['exampleCount'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exampleCount != null) 'exampleCount': exampleCount!,
       };
 }
@@ -10500,7 +10495,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10521,7 +10516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10542,7 +10537,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10563,7 +10558,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10584,7 +10579,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10605,7 +10600,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicConfig != null) 'basicConfig': basicConfig!.toJson(),
       };
 }
@@ -10638,7 +10633,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
         if (gcsFolderDestination != null)
           'gcsFolderDestination': gcsFolderDestination!.toJson(),
@@ -10668,7 +10663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -10729,29 +10724,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -10774,7 +10767,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -10810,8 +10803,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -10824,7 +10817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis_beta/lib/datamigration/v1beta1.dart b/generated/googleapis_beta/lib/datamigration/v1beta1.dart
index 947ee26..ba494ac 100644
--- a/generated/googleapis_beta/lib/datamigration/v1beta1.dart
+++ b/generated/googleapis_beta/lib/datamigration/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1564,7 +1563,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1606,7 +1605,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1678,7 +1677,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1693,7 +1692,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Specifies required connection parameters, and, optionally, the parameters
@@ -1737,7 +1736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudSqlId != null) 'cloudSqlId': cloudSqlId!,
         if (privateIp != null) 'privateIp': privateIp!,
         if (publicIp != null) 'publicIp': publicIp!,
@@ -1854,14 +1853,13 @@
       dataDiskType = _json['dataDiskType'] as core.String;
     }
     if (_json.containsKey('databaseFlags')) {
-      databaseFlags = (_json['databaseFlags'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      databaseFlags =
+          (_json['databaseFlags'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('databaseVersion')) {
       databaseVersion = _json['databaseVersion'] as core.String;
@@ -1886,21 +1884,20 @@
       tier = _json['tier'] as core.String;
     }
     if (_json.containsKey('userLabels')) {
-      userLabels = (_json['userLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      userLabels =
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activationPolicy != null) 'activationPolicy': activationPolicy!,
         if (autoStorageIncrease != null)
           'autoStorageIncrease': autoStorageIncrease!,
@@ -2000,13 +1997,12 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('mysql')) {
       mysql = MySqlConnectionProfile.fromJson(
@@ -2026,7 +2022,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudsql != null) 'cloudsql': cloudsql!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (displayName != null) 'displayName': displayName!,
@@ -2067,7 +2063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (engine != null) 'engine': engine!,
         if (provider != null) 'provider': provider!,
       };
@@ -2087,7 +2083,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -2151,7 +2147,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2194,7 +2190,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vm != null) 'vm': vm!,
         if (vmCreationConfig != null)
           'vmCreationConfig': vmCreationConfig!.toJson(),
@@ -2271,7 +2267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -2315,7 +2311,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (connectionProfiles != null)
           'connectionProfiles':
               connectionProfiles!.map((value) => value.toJson()).toList(),
@@ -2346,7 +2342,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2385,7 +2381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (migrationJobs != null)
           'migrationJobs':
               migrationJobs!.map((value) => value.toJson()).toList(),
@@ -2416,7 +2412,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -2460,32 +2456,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -2649,13 +2643,12 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2695,7 +2688,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (destination != null) 'destination': destination!,
         if (destinationDatabase != null)
@@ -2768,7 +2761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorCode != null) 'errorCode': errorCode!,
         if (errorDetailMessage != null)
           'errorDetailMessage': errorDetailMessage!,
@@ -2844,7 +2837,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudSqlId != null) 'cloudSqlId': cloudSqlId!,
         if (host != null) 'host': host!,
         if (password != null) 'password': password!,
@@ -2909,29 +2902,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -3044,7 +3035,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -3062,7 +3053,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for 'RestartMigrationJob' request.
@@ -3073,7 +3064,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for 'ResumeMigrationJob' request.
@@ -3084,7 +3075,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The details needed to configure a reverse SSH tunnel between the source and
@@ -3131,7 +3122,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vm != null) 'vm': vm!,
         if (vmIp != null) 'vmIp': vmIp!,
         if (vmPort != null) 'vmPort': vmPort!,
@@ -3166,7 +3157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -3207,7 +3198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expireTime != null) 'expireTime': expireTime!,
         if (label != null) 'label': label!,
         if (ttl != null) 'ttl': ttl!,
@@ -3257,7 +3248,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorizedNetworks != null)
           'authorizedNetworks':
               authorizedNetworks!.map((value) => value.toJson()).toList(),
@@ -3280,7 +3271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (script != null) 'script': script!,
       };
 }
@@ -3338,7 +3329,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caCertificate != null) 'caCertificate': caCertificate!,
         if (clientCertificate != null) 'clientCertificate': clientCertificate!,
         if (clientKey != null) 'clientKey': clientKey!,
@@ -3354,7 +3345,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The source database will allow incoming connections from the destination
@@ -3369,7 +3360,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -3405,8 +3396,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3419,7 +3410,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -3434,7 +3425,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for `TestIamPermissions` method.
@@ -3456,7 +3447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3477,7 +3468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3490,7 +3481,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// VM creation configuration message
@@ -3520,7 +3511,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (subnet != null) 'subnet': subnet!,
         if (vmMachineType != null) 'vmMachineType': vmMachineType!,
         if (vmZone != null) 'vmZone': vmZone!,
@@ -3542,7 +3533,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vmZone != null) 'vmZone': vmZone!,
       };
 }
@@ -3563,7 +3554,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (vpc != null) 'vpc': vpc!,
       };
 }
diff --git a/generated/googleapis_beta/lib/documentai/v1beta3.dart b/generated/googleapis_beta/lib/documentai/v1beta3.dart
index f50a798..8360169 100644
--- a/generated/googleapis_beta/lib/documentai/v1beta3.dart
+++ b/generated/googleapis_beta/lib/documentai/v1beta3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -521,7 +520,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
         if (stateMessage != null) 'stateMessage': stateMessage!,
@@ -545,7 +544,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -566,7 +565,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -587,7 +586,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -608,7 +607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -629,7 +628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -642,7 +641,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The long running operation metadata for disable processor method.
@@ -661,7 +660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -676,7 +675,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The long running operation metadata for enable processor method.
@@ -695,7 +694,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -710,7 +709,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Metadata of the EvaluateProcessorVersion method.
@@ -729,7 +728,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -748,7 +747,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (evaluation != null) 'evaluation': evaluation!,
       };
 }
@@ -789,7 +788,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
         if (testDatasetValidation != null)
           'testDatasetValidation': testDatasetValidation!.toJson(),
@@ -832,7 +831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (datasetErrors != null)
           'datasetErrors':
               datasetErrors!.map((value) => value.toJson()).toList(),
@@ -856,7 +855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (processorVersion != null) 'processorVersion': processorVersion!,
       };
 }
@@ -878,7 +877,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -891,7 +890,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The long running operation metadata for updating the human review
@@ -911,7 +910,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -932,7 +931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -992,7 +991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (individualProcessStatuses != null)
           'individualProcessStatuses': individualProcessStatuses!
@@ -1043,7 +1042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (humanReviewStatus != null)
           'humanReviewStatus': humanReviewStatus!.toJson(),
         if (inputGcsSource != null) 'inputGcsSource': inputGcsSource!,
@@ -1061,7 +1060,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The common metadata for long running operations.
@@ -1102,7 +1101,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
         if (stateMessage != null) 'stateMessage': stateMessage!,
@@ -1151,7 +1150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (humanReviewOperation != null)
           'humanReviewOperation': humanReviewOperation!,
         if (state != null) 'state': state!,
@@ -1174,7 +1173,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
       };
 }
@@ -1192,7 +1191,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!,
       };
 }
@@ -1217,7 +1216,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -1250,7 +1249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedVertices != null)
           'normalizedVertices':
               normalizedVertices!.map((value) => value.toJson()).toList(),
@@ -1407,7 +1406,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
@@ -1544,7 +1543,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (id != null) 'id': id!,
         if (mentionId != null) 'mentionId': mentionId!,
@@ -1631,7 +1630,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressValue != null) 'addressValue': addressValue!.toJson(),
         if (booleanValue != null) 'booleanValue': booleanValue!,
         if (dateValue != null) 'dateValue': dateValue!.toJson(),
@@ -1666,7 +1665,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
         if (relation != null) 'relation': relation!,
         if (subjectId != null) 'subjectId': subjectId!,
@@ -1815,7 +1814,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blocks != null)
           'blocks': blocks!.map((value) => value.toJson()).toList(),
         if (detectedLanguages != null)
@@ -1863,7 +1862,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageRefs != null)
           'pageRefs': pageRefs!.map((value) => value.toJson()).toList(),
       };
@@ -1920,7 +1919,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (layoutId != null) 'layoutId': layoutId!,
         if (layoutType != null) 'layoutType': layoutType!,
@@ -1962,7 +1961,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -1996,7 +1995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -2027,7 +2026,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (unit != null) 'unit': unit!,
         if (width != null) 'width': width!,
@@ -2090,7 +2089,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldName != null) 'fieldName': fieldName!.toJson(),
         if (fieldValue != null) 'fieldValue': fieldValue!.toJson(),
         if (nameDetectedLanguages != null)
@@ -2140,7 +2139,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (height != null) 'height': height!,
         if (mimeType != null) 'mimeType': mimeType!,
@@ -2194,7 +2193,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (orientation != null) 'orientation': orientation!,
@@ -2237,7 +2236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -2288,7 +2287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cols != null) 'cols': cols!,
         if (data != null) 'data': data!,
         if (rows != null) 'rows': rows!,
@@ -2329,7 +2328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -2384,7 +2383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bodyRows != null)
           'bodyRows': bodyRows!.map((value) => value.toJson()).toList(),
         if (detectedLanguages != null)
@@ -2435,7 +2434,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colSpan != null) 'colSpan': colSpan!,
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -2463,7 +2462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cells != null)
           'cells': cells!.map((value) => value.toJson()).toList(),
       };
@@ -2510,7 +2509,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedBreak != null) 'detectedBreak': detectedBreak!.toJson(),
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -2540,7 +2539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -2580,7 +2579,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -2636,7 +2635,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (parents != null)
           'parents': parents!.map((value) => value.toJson()).toList(),
@@ -2668,7 +2667,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (revision != null) 'revision': revision!,
       };
@@ -2727,7 +2726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agent != null) 'agent': agent!,
         if (createTime != null) 'createTime': createTime!,
         if (humanReview != null) 'humanReview': humanReview!.toJson(),
@@ -2761,7 +2760,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
         if (stateMessage != null) 'stateMessage': stateMessage!,
       };
@@ -2796,7 +2795,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (shardCount != null) 'shardCount': shardCount!,
         if (shardIndex != null) 'shardIndex': shardIndex!,
         if (textOffset != null) 'textOffset': textOffset!,
@@ -2867,7 +2866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null)
           'backgroundColor': backgroundColor!.toJson(),
         if (color != null) 'color': color!.toJson(),
@@ -2900,7 +2899,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (size != null) 'size': size!,
         if (unit != null) 'unit': unit!,
       };
@@ -2932,7 +2931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (textSegments != null)
           'textSegments': textSegments!.map((value) => value.toJson()).toList(),
@@ -2963,7 +2962,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endIndex != null) 'endIndex': endIndex!,
         if (startIndex != null) 'startIndex': startIndex!,
       };
@@ -3005,7 +3004,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changedText != null) 'changedText': changedText!,
         if (provenance != null)
           'provenance': provenance!.map((value) => value.toJson()).toList(),
@@ -3056,7 +3055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (provenance != null)
           'provenance': provenance!.map((value) => value.toJson()).toList(),
@@ -3077,7 +3076,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -3094,7 +3093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -3128,7 +3127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -3156,7 +3155,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -3202,7 +3201,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
         if (stateMessage != null) 'stateMessage': stateMessage!,
@@ -3240,7 +3239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
         if (pagesPerShard != null) 'pagesPerShard': pagesPerShard!,
       };
@@ -3272,7 +3271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
@@ -3299,7 +3298,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -3325,7 +3324,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (responses != null)
           'responses': responses!.map((value) => value.toJson()).toList(),
       };
@@ -3358,7 +3357,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedVertices != null)
           'normalizedVertices':
               normalizedVertices!.map((value) => value.toJson()).toList(),
@@ -3525,7 +3524,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
@@ -3664,7 +3663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (id != null) 'id': id!,
         if (mentionId != null) 'mentionId': mentionId!,
@@ -3751,7 +3750,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressValue != null) 'addressValue': addressValue!.toJson(),
         if (booleanValue != null) 'booleanValue': booleanValue!,
         if (dateValue != null) 'dateValue': dateValue!.toJson(),
@@ -3786,7 +3785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
         if (relation != null) 'relation': relation!,
         if (subjectId != null) 'subjectId': subjectId!,
@@ -3829,7 +3828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (automlModel != null) 'automlModel': automlModel!,
         if (confidence != null) 'confidence': confidence!,
         if (name != null) 'name': name!,
@@ -3978,7 +3977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blocks != null)
           'blocks': blocks!.map((value) => value.toJson()).toList(),
         if (detectedLanguages != null)
@@ -4026,7 +4025,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageRefs != null)
           'pageRefs': pageRefs!.map((value) => value.toJson()).toList(),
       };
@@ -4083,7 +4082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (layoutId != null) 'layoutId': layoutId!,
         if (layoutType != null) 'layoutType': layoutType!,
@@ -4125,7 +4124,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -4159,7 +4158,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -4190,7 +4189,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (unit != null) 'unit': unit!,
         if (width != null) 'width': width!,
@@ -4253,7 +4252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldName != null) 'fieldName': fieldName!.toJson(),
         if (fieldValue != null) 'fieldValue': fieldValue!.toJson(),
         if (nameDetectedLanguages != null)
@@ -4303,7 +4302,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (height != null) 'height': height!,
         if (mimeType != null) 'mimeType': mimeType!,
@@ -4357,7 +4356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (orientation != null) 'orientation': orientation!,
@@ -4400,7 +4399,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -4451,7 +4450,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cols != null) 'cols': cols!,
         if (data != null) 'data': data!,
         if (rows != null) 'rows': rows!,
@@ -4492,7 +4491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -4547,7 +4546,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bodyRows != null)
           'bodyRows': bodyRows!.map((value) => value.toJson()).toList(),
         if (detectedLanguages != null)
@@ -4598,7 +4597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colSpan != null) 'colSpan': colSpan!,
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -4626,7 +4625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cells != null)
           'cells': cells!.map((value) => value.toJson()).toList(),
       };
@@ -4673,7 +4672,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedBreak != null) 'detectedBreak': detectedBreak!.toJson(),
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -4703,7 +4702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -4743,7 +4742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -4799,7 +4798,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (parents != null)
           'parents': parents!.map((value) => value.toJson()).toList(),
@@ -4831,7 +4830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (revision != null) 'revision': revision!,
       };
@@ -4890,7 +4889,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agent != null) 'agent': agent!,
         if (createTime != null) 'createTime': createTime!,
         if (humanReview != null) 'humanReview': humanReview!.toJson(),
@@ -4924,7 +4923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
         if (stateMessage != null) 'stateMessage': stateMessage!,
       };
@@ -4959,7 +4958,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (shardCount != null) 'shardCount': shardCount!,
         if (shardIndex != null) 'shardIndex': shardIndex!,
         if (textOffset != null) 'textOffset': textOffset!,
@@ -5030,7 +5029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null)
           'backgroundColor': backgroundColor!.toJson(),
         if (color != null) 'color': color!.toJson(),
@@ -5063,7 +5062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (size != null) 'size': size!,
         if (unit != null) 'unit': unit!,
       };
@@ -5095,7 +5094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (textSegments != null)
           'textSegments': textSegments!.map((value) => value.toJson()).toList(),
@@ -5126,7 +5125,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endIndex != null) 'endIndex': endIndex!,
         if (startIndex != null) 'startIndex': startIndex!,
       };
@@ -5168,7 +5167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changedText != null) 'changedText': changedText!,
         if (provenance != null)
           'provenance': provenance!.map((value) => value.toJson()).toList(),
@@ -5219,7 +5218,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (provenance != null)
           'provenance': provenance!.map((value) => value.toJson()).toList(),
@@ -5240,7 +5239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -5257,7 +5256,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -5307,7 +5306,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contents != null) 'contents': contents!,
         if (gcsSource != null) 'gcsSource': gcsSource!.toJson(),
         if (mimeType != null) 'mimeType': mimeType!,
@@ -5336,7 +5335,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -5382,7 +5381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
         if (stateMessage != null) 'stateMessage': stateMessage!,
@@ -5420,7 +5419,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!.toJson(),
         if (pagesPerShard != null) 'pagesPerShard': pagesPerShard!,
       };
@@ -5452,7 +5451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (outputConfig != null) 'outputConfig': outputConfig!.toJson(),
       };
@@ -5479,7 +5478,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -5508,7 +5507,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDocuments != null) 'gcsDocuments': gcsDocuments!.toJson(),
         if (gcsPrefix != null) 'gcsPrefix': gcsPrefix!.toJson(),
       };
@@ -5570,7 +5569,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (individualProcessStatuses != null)
           'individualProcessStatuses': individualProcessStatuses!
@@ -5633,7 +5632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (humanReviewOperation != null)
           'humanReviewOperation': humanReviewOperation!,
         if (humanReviewStatus != null)
@@ -5699,7 +5698,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documentOutputConfig != null)
           'documentOutputConfig': documentOutputConfig!.toJson(),
         if (inputConfigs != null)
@@ -5734,7 +5733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsSource != null) 'gcsSource': gcsSource!,
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -5754,7 +5753,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!,
       };
 }
@@ -5767,7 +5766,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A bounding polygon for the detected image annotation.
@@ -5797,7 +5796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (normalizedVertices != null)
           'normalizedVertices':
               normalizedVertices!.map((value) => value.toJson()).toList(),
@@ -5844,7 +5843,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
         if (stateMessage != null) 'stateMessage': stateMessage!,
@@ -6000,7 +5999,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (entities != null)
           'entities': entities!.map((value) => value.toJson()).toList(),
@@ -6137,7 +6136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (id != null) 'id': id!,
         if (mentionId != null) 'mentionId': mentionId!,
@@ -6224,7 +6223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressValue != null) 'addressValue': addressValue!.toJson(),
         if (booleanValue != null) 'booleanValue': booleanValue!,
         if (dateValue != null) 'dateValue': dateValue!.toJson(),
@@ -6259,7 +6258,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectId != null) 'objectId': objectId!,
         if (relation != null) 'relation': relation!,
         if (subjectId != null) 'subjectId': subjectId!,
@@ -6285,7 +6284,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsOutputConfig != null)
           'gcsOutputConfig': gcsOutputConfig!.toJson(),
       };
@@ -6305,7 +6304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsUri != null) 'gcsUri': gcsUri!,
       };
 }
@@ -6452,7 +6451,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (blocks != null)
           'blocks': blocks!.map((value) => value.toJson()).toList(),
         if (detectedLanguages != null)
@@ -6500,7 +6499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pageRefs != null)
           'pageRefs': pageRefs!.map((value) => value.toJson()).toList(),
       };
@@ -6557,7 +6556,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (layoutId != null) 'layoutId': layoutId!,
         if (layoutType != null) 'layoutType': layoutType!,
@@ -6599,7 +6598,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -6633,7 +6632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (confidence != null) 'confidence': confidence!,
         if (languageCode != null) 'languageCode': languageCode!,
       };
@@ -6664,7 +6663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (unit != null) 'unit': unit!,
         if (width != null) 'width': width!,
@@ -6727,7 +6726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fieldName != null) 'fieldName': fieldName!.toJson(),
         if (fieldValue != null) 'fieldValue': fieldValue!.toJson(),
         if (nameDetectedLanguages != null)
@@ -6777,7 +6776,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (height != null) 'height': height!,
         if (mimeType != null) 'mimeType': mimeType!,
@@ -6831,7 +6830,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boundingPoly != null) 'boundingPoly': boundingPoly!.toJson(),
         if (confidence != null) 'confidence': confidence!,
         if (orientation != null) 'orientation': orientation!,
@@ -6874,7 +6873,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -6925,7 +6924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cols != null) 'cols': cols!,
         if (data != null) 'data': data!,
         if (rows != null) 'rows': rows!,
@@ -6966,7 +6965,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -7021,7 +7020,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bodyRows != null)
           'bodyRows': bodyRows!.map((value) => value.toJson()).toList(),
         if (detectedLanguages != null)
@@ -7072,7 +7071,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (colSpan != null) 'colSpan': colSpan!,
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -7100,7 +7099,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cells != null)
           'cells': cells!.map((value) => value.toJson()).toList(),
       };
@@ -7147,7 +7146,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedBreak != null) 'detectedBreak': detectedBreak!.toJson(),
         if (detectedLanguages != null)
           'detectedLanguages':
@@ -7177,7 +7176,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
       };
 }
@@ -7217,7 +7216,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detectedLanguages != null)
           'detectedLanguages':
               detectedLanguages!.map((value) => value.toJson()).toList(),
@@ -7273,7 +7272,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (parents != null)
           'parents': parents!.map((value) => value.toJson()).toList(),
@@ -7305,7 +7304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (revision != null) 'revision': revision!,
       };
@@ -7364,7 +7363,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (agent != null) 'agent': agent!,
         if (createTime != null) 'createTime': createTime!,
         if (humanReview != null) 'humanReview': humanReview!.toJson(),
@@ -7398,7 +7397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (state != null) 'state': state!,
         if (stateMessage != null) 'stateMessage': stateMessage!,
       };
@@ -7433,7 +7432,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (shardCount != null) 'shardCount': shardCount!,
         if (shardIndex != null) 'shardIndex': shardIndex!,
         if (textOffset != null) 'textOffset': textOffset!,
@@ -7504,7 +7503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backgroundColor != null)
           'backgroundColor': backgroundColor!.toJson(),
         if (color != null) 'color': color!.toJson(),
@@ -7537,7 +7536,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (size != null) 'size': size!,
         if (unit != null) 'unit': unit!,
       };
@@ -7569,7 +7568,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (textSegments != null)
           'textSegments': textSegments!.map((value) => value.toJson()).toList(),
@@ -7600,7 +7599,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endIndex != null) 'endIndex': endIndex!,
         if (startIndex != null) 'startIndex': startIndex!,
       };
@@ -7642,7 +7641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (changedText != null) 'changedText': changedText!,
         if (provenance != null)
           'provenance': provenance!.map((value) => value.toJson()).toList(),
@@ -7693,7 +7692,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (provenance != null)
           'provenance': provenance!.map((value) => value.toJson()).toList(),
@@ -7721,7 +7720,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsUri != null) 'gcsUri': gcsUri!,
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -7744,7 +7743,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (documents != null)
           'documents': documents!.map((value) => value.toJson()).toList(),
       };
@@ -7763,7 +7762,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsUriPrefix != null) 'gcsUriPrefix': gcsUriPrefix!,
       };
 }
@@ -7809,7 +7808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (humanReviewOperation != null)
           'humanReviewOperation': humanReviewOperation!,
         if (state != null) 'state': state!,
@@ -7839,7 +7838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -7882,7 +7881,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
         if (inlineDocument != null) 'inlineDocument': inlineDocument!.toJson(),
         if (rawDocument != null) 'rawDocument': rawDocument!.toJson(),
@@ -7924,7 +7923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
         if (humanReviewOperation != null)
           'humanReviewOperation': humanReviewOperation!,
@@ -7959,7 +7958,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (content != null) 'content': content!,
         if (mimeType != null) 'mimeType': mimeType!,
       };
@@ -8014,7 +8013,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonMetadata != null) 'commonMetadata': commonMetadata!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (state != null) 'state': state!,
@@ -8044,7 +8043,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (document != null) 'document': document!.toJson(),
         if (inlineDocument != null) 'inlineDocument': inlineDocument!.toJson(),
       };
@@ -8063,7 +8062,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsDestination != null) 'gcsDestination': gcsDestination!,
       };
 }
@@ -8089,7 +8088,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -8118,7 +8117,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -8162,32 +8161,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -8250,29 +8247,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -8295,7 +8290,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -8331,8 +8326,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -8345,7 +8340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -8440,7 +8435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alpha != null) 'alpha': alpha!,
         if (blue != null) 'blue': blue!,
         if (green != null) 'green': green!,
@@ -8488,7 +8483,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -8605,7 +8600,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (hours != null) 'hours': hours!,
         if (minutes != null) 'minutes': minutes!,
@@ -8651,7 +8646,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -8821,7 +8816,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressLines != null) 'addressLines': addressLines!,
         if (administrativeArea != null)
           'administrativeArea': administrativeArea!,
@@ -8859,7 +8854,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (version != null) 'version': version!,
       };
diff --git a/generated/googleapis_beta/lib/domains/v1beta1.dart b/generated/googleapis_beta/lib/domains/v1beta1.dart
index 874237c..e6c4a81 100644
--- a/generated/googleapis_beta/lib/domains/v1beta1.dart
+++ b/generated/googleapis_beta/lib/domains/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1095,7 +1094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1137,7 +1136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1158,7 +1157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
       };
 }
@@ -1229,7 +1228,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1279,7 +1278,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactNotices != null) 'contactNotices': contactNotices!,
         if (contactSettings != null)
           'contactSettings': contactSettings!.toJson(),
@@ -1324,7 +1323,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dnsSettings != null) 'dnsSettings': dnsSettings!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
         if (validateOnly != null) 'validateOnly': validateOnly!,
@@ -1357,7 +1356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (managementSettings != null)
           'managementSettings': managementSettings!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
@@ -1406,7 +1405,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (faxNumber != null) 'faxNumber': faxNumber!,
         if (phoneNumber != null) 'phoneNumber': phoneNumber!,
@@ -1481,7 +1480,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adminContact != null) 'adminContact': adminContact!.toJson(),
         if (privacy != null) 'privacy': privacy!,
         if (registrantContact != null)
@@ -1523,7 +1522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dsRecords != null)
           'dsRecords': dsRecords!.map((value) => value.toJson()).toList(),
         if (nameServers != null) 'nameServers': nameServers!,
@@ -1563,7 +1562,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customDns != null) 'customDns': customDns!.toJson(),
         if (glueRecords != null)
           'glueRecords': glueRecords!.map((value) => value.toJson()).toList(),
@@ -1630,7 +1629,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (digest != null) 'digest': digest!,
         if (digestType != null) 'digestType': digestType!,
@@ -1646,7 +1645,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Represents a textual expression in the Common Expression Language (CEL)
@@ -1710,7 +1709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1762,7 +1761,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hostName != null) 'hostName': hostName!,
         if (ipv4Addresses != null) 'ipv4Addresses': ipv4Addresses!,
         if (ipv6Addresses != null) 'ipv6Addresses': ipv6Addresses!,
@@ -1826,7 +1825,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dsRecords != null)
           'dsRecords': dsRecords!.map((value) => value.toJson()).toList(),
         if (dsState != null) 'dsState': dsState!,
@@ -1856,7 +1855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1885,7 +1884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1917,7 +1916,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (registrations != null)
           'registrations':
@@ -1962,32 +1961,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -2033,7 +2030,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (renewalMethod != null) 'renewalMethod': renewalMethod!,
         if (transferLockState != null) 'transferLockState': transferLockState!,
       };
@@ -2072,7 +2069,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -2133,29 +2130,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2209,7 +2204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -2323,7 +2318,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -2496,7 +2491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (addressLines != null) 'addressLines': addressLines!,
         if (administrativeArea != null)
           'administrativeArea': administrativeArea!,
@@ -2572,7 +2567,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactNotices != null) 'contactNotices': contactNotices!,
         if (domainNotices != null) 'domainNotices': domainNotices!,
         if (registration != null) 'registration': registration!.toJson(),
@@ -2638,7 +2633,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availability != null) 'availability': availability!,
         if (domainName != null) 'domainName': domainName!,
         if (domainNotices != null) 'domainNotices': domainNotices!,
@@ -2771,13 +2766,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('managementSettings')) {
       managementSettings = ManagementSettings.fromJson(
@@ -2801,7 +2795,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contactSettings != null)
           'contactSettings': contactSettings!.toJson(),
         if (createTime != null) 'createTime': createTime!,
@@ -2828,7 +2822,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response for the `RetrieveRegisterParameters` method.
@@ -2845,7 +2839,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (registerParameters != null)
           'registerParameters': registerParameters!.toJson(),
       };
@@ -2867,7 +2861,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (registerParameters != null)
           'registerParameters':
               registerParameters!.map((value) => value.toJson()).toList(),
@@ -2901,7 +2895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -2940,8 +2934,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2954,7 +2948,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2980,7 +2974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -3001,7 +2995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
diff --git a/generated/googleapis_beta/lib/factchecktools/v1alpha1.dart b/generated/googleapis_beta/lib/factchecktools/v1alpha1.dart
index afc8360..cc2c8b5 100644
--- a/generated/googleapis_beta/lib/factchecktools/v1alpha1.dart
+++ b/generated/googleapis_beta/lib/factchecktools/v1alpha1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -414,7 +413,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (claimDate != null) 'claimDate': claimDate!,
         if (claimReview != null)
           'claimReview': claimReview!.map((value) => value.toJson()).toList(),
@@ -457,7 +456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageUrl != null) 'imageUrl': imageUrl!,
         if (jobTitle != null) 'jobTitle': jobTitle!,
         if (name != null) 'name': name!,
@@ -519,7 +518,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bestRating != null) 'bestRating': bestRating!,
         if (imageUrl != null) 'imageUrl': imageUrl!,
         if (ratingExplanation != null) 'ratingExplanation': ratingExplanation!,
@@ -577,7 +576,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (languageCode != null) 'languageCode': languageCode!,
         if (publisher != null) 'publisher': publisher!.toJson(),
         if (reviewDate != null) 'reviewDate': reviewDate!,
@@ -609,7 +608,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageUrl != null) 'imageUrl': imageUrl!,
         if (name != null) 'name': name!,
       };
@@ -696,7 +695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (claimAppearances != null) 'claimAppearances': claimAppearances!,
         if (claimAuthor != null) 'claimAuthor': claimAuthor!.toJson(),
         if (claimDate != null) 'claimDate': claimDate!,
@@ -783,7 +782,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (claimReviewAuthor != null)
           'claimReviewAuthor': claimReviewAuthor!.toJson(),
         if (claimReviewMarkups != null)
@@ -823,7 +822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (claims != null)
           'claims': claims!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -859,7 +858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (claimReviewMarkupPages != null)
           'claimReviewMarkupPages':
               claimReviewMarkupPages!.map((value) => value.toJson()).toList(),
@@ -891,7 +890,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (site != null) 'site': site!,
       };
@@ -911,5 +910,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis_beta/lib/firebase/v1beta1.dart b/generated/googleapis_beta/lib/firebase/v1beta1.dart
index ad9dc1b..ffba10e 100644
--- a/generated/googleapis_beta/lib/firebase/v1beta1.dart
+++ b/generated/googleapis_beta/lib/firebase/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1832,7 +1831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locationId != null) 'locationId': locationId!,
         if (regionCode != null) 'regionCode': regionCode!,
         if (timeZone != null) 'timeZone': timeZone!,
@@ -1864,7 +1863,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyticsAccountId != null)
           'analyticsAccountId': analyticsAccountId!,
         if (analyticsPropertyId != null)
@@ -1915,7 +1914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (databaseURL != null) 'databaseURL': databaseURL!,
         if (locationId != null) 'locationId': locationId!,
         if (projectId != null) 'projectId': projectId!,
@@ -1955,7 +1954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyticsProperty != null)
           'analyticsProperty': analyticsProperty!.toJson(),
         if (streamMappings != null)
@@ -1991,7 +1990,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (id != null) 'id': id!,
       };
@@ -2056,7 +2055,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appId != null) 'appId': appId!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -2094,7 +2093,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configFileContents != null)
           'configFileContents': configFileContents!,
         if (configFilename != null) 'configFilename': configFilename!,
@@ -2158,7 +2157,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hostingSite != null) 'hostingSite': hostingSite!,
         if (locationId != null) 'locationId': locationId!,
         if (realtimeDatabaseInstance != null)
@@ -2181,7 +2180,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 class FinalizeDefaultLocationRequest {
@@ -2199,7 +2198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locationId != null) 'locationId': locationId!,
       };
 }
@@ -2264,7 +2263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appId != null) 'appId': appId!,
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
@@ -2357,7 +2356,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (projectId != null) 'projectId': projectId!,
@@ -2433,7 +2432,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appId != null) 'appId': appId!,
         if (appStoreId != null) 'appStoreId': appStoreId!,
         if (bundleId != null) 'bundleId': bundleId!,
@@ -2472,7 +2471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configFileContents != null)
           'configFileContents': configFileContents!,
         if (configFilename != null) 'configFilename': configFilename!,
@@ -2506,7 +2505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apps != null) 'apps': apps!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -2539,7 +2538,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2574,7 +2573,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (projectInfo != null)
           'projectInfo': projectInfo!.map((value) => value.toJson()).toList(),
@@ -2608,7 +2607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (results != null)
           'results': results!.map((value) => value.toJson()).toList(),
@@ -2642,7 +2641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apps != null) 'apps': apps!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -2663,7 +2662,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificates != null)
           'certificates': certificates!.map((value) => value.toJson()).toList(),
       };
@@ -2696,7 +2695,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apps != null) 'apps': apps!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -2743,7 +2742,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (features != null) 'features': features!,
         if (locationId != null) 'locationId': locationId!,
         if (type != null) 'type': type!,
@@ -2758,7 +2757,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// This resource represents a long-running operation that is the result of a
@@ -2815,29 +2814,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2882,7 +2879,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (locationId != null) 'locationId': locationId!,
         if (project != null) 'project': project!,
@@ -2910,7 +2907,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyticsPropertyId != null)
           'analyticsPropertyId': analyticsPropertyId!,
       };
@@ -2942,7 +2939,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apps != null) 'apps': apps!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -2991,7 +2988,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certType != null) 'certType': certType!,
         if (name != null) 'name': name!,
         if (shaHash != null) 'shaHash': shaHash!,
@@ -3031,8 +3028,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3045,7 +3042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -3097,7 +3094,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canonicalCode != null) 'canonicalCode': canonicalCode!,
         if (code != null) 'code': code!,
         if (message != null) 'message': message!,
@@ -3146,7 +3143,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (app != null) 'app': app!,
         if (measurementId != null) 'measurementId': measurementId!,
         if (streamId != null) 'streamId': streamId!,
@@ -3224,7 +3221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appId != null) 'appId': appId!,
         if (appUrls != null) 'appUrls': appUrls!,
         if (displayName != null) 'displayName': displayName!,
@@ -3321,7 +3318,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiKey != null) 'apiKey': apiKey!,
         if (appId != null) 'appId': appId!,
         if (authDomain != null) 'authDomain': authDomain!,
diff --git a/generated/googleapis_beta/lib/firebasedatabase/v1beta.dart b/generated/googleapis_beta/lib/firebasedatabase/v1beta.dart
index 8463a99..1758517 100644
--- a/generated/googleapis_beta/lib/firebasedatabase/v1beta.dart
+++ b/generated/googleapis_beta/lib/firebasedatabase/v1beta.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -469,7 +468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (databaseUrl != null) 'databaseUrl': databaseUrl!,
         if (name != null) 'name': name!,
         if (project != null) 'project': project!,
@@ -486,7 +485,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response from the ListDatabaseInstances method.
@@ -517,7 +516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instances != null)
           'instances': instances!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -532,5 +531,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis_beta/lib/lifesciences/v2beta.dart b/generated/googleapis_beta/lib/lifesciences/v2beta.dart
index 001d6db..c6f2e7e 100644
--- a/generated/googleapis_beta/lib/lifesciences/v2beta.dart
+++ b/generated/googleapis_beta/lib/lifesciences/v2beta.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -412,7 +411,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (count != null) 'count': count!,
         if (type != null) 'type': type!,
       };
@@ -609,14 +608,13 @@
       entrypoint = _json['entrypoint'] as core.String;
     }
     if (_json.containsKey('environment')) {
-      environment = (_json['environment'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      environment =
+          (_json['environment'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('ignoreExitStatus')) {
       ignoreExitStatus = _json['ignoreExitStatus'] as core.bool;
@@ -625,13 +623,12 @@
       imageUri = _json['imageUri'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('mounts')) {
       mounts = (_json['mounts'] as core.List)
@@ -644,12 +641,12 @@
     }
     if (_json.containsKey('portMappings')) {
       portMappings =
-          (_json['portMappings'] as core.Map).cast<core.String, core.int>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.int,
-                ),
-              );
+          (_json['portMappings'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.int,
+        ),
+      );
     }
     if (_json.containsKey('publishExposedPorts')) {
       publishExposedPorts = _json['publishExposedPorts'] as core.bool;
@@ -662,7 +659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alwaysRun != null) 'alwaysRun': alwaysRun!,
         if (blockExternalNetwork != null)
           'blockExternalNetwork': blockExternalNetwork!,
@@ -698,7 +695,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// An event generated when a container is forcibly terminated by the worker.
@@ -717,7 +714,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionId != null) 'actionId': actionId!,
       };
 }
@@ -751,16 +748,16 @@
     }
     if (_json.containsKey('portMappings')) {
       portMappings =
-          (_json['portMappings'] as core.Map).cast<core.String, core.int>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.int,
-                ),
-              );
+          (_json['portMappings'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.int,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionId != null) 'actionId': actionId!,
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (portMappings != null) 'portMappings': portMappings!,
@@ -799,7 +796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionId != null) 'actionId': actionId!,
         if (exitStatus != null) 'exitStatus': exitStatus!,
         if (stderr != null) 'stderr': stderr!,
@@ -836,7 +833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cause != null) 'cause': cause!,
         if (metrics != null) 'metrics': metrics!,
       };
@@ -889,7 +886,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (sizeGb != null) 'sizeGb': sizeGb!,
         if (sourceImage != null) 'sourceImage': sourceImage!,
@@ -911,7 +908,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Carries information about events that occur during pipeline execution.
@@ -1006,7 +1003,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (containerKilled != null)
           'containerKilled': containerKilled!.toJson(),
         if (containerStarted != null)
@@ -1048,7 +1045,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disk != null) 'disk': disk!,
       };
 }
@@ -1154,7 +1151,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cause != null) 'cause': cause!,
         if (code != null) 'code': code!,
       };
@@ -1182,7 +1179,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1211,7 +1208,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1255,32 +1252,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1331,13 +1326,12 @@
           .toList();
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('pipeline')) {
       pipeline = Pipeline.fromJson(
@@ -1351,7 +1345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
         if (events != null)
@@ -1388,7 +1382,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disk != null) 'disk': disk!,
         if (path != null) 'path': path!,
         if (readOnly != null) 'readOnly': readOnly!,
@@ -1410,7 +1404,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (target != null) 'target': target!,
       };
 }
@@ -1455,7 +1449,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (network != null) 'network': network!,
         if (subnetwork != null) 'subnetwork': subnetwork!,
         if (usePrivateAddress != null) 'usePrivateAddress': usePrivateAddress!,
@@ -1505,29 +1499,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1572,7 +1564,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sizeGb != null) 'sizeGb': sizeGb!,
         if (sourceImage != null) 'sourceImage': sourceImage!,
         if (type != null) 'type': type!,
@@ -1612,14 +1604,13 @@
           .toList();
     }
     if (_json.containsKey('environment')) {
-      environment = (_json['environment'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      environment =
+          (_json['environment'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('resources')) {
       resources = Resources.fromJson(
@@ -1630,7 +1621,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actions != null)
           'actions': actions!.map((value) => value.toJson()).toList(),
         if (environment != null) 'environment': environment!,
@@ -1652,7 +1643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageUri != null) 'imageUri': imageUri!,
       };
 }
@@ -1670,7 +1661,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (imageUri != null) 'imageUri': imageUri!,
       };
 }
@@ -1711,7 +1702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (regions != null) 'regions': regions!,
         if (virtualMachine != null) 'virtualMachine': virtualMachine!.toJson(),
         if (zones != null) 'zones': zones!,
@@ -1748,13 +1739,12 @@
 
   RunPipelineRequest.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('pipeline')) {
       pipeline = Pipeline.fromJson(
@@ -1765,7 +1755,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (labels != null) 'labels': labels!,
         if (pipeline != null) 'pipeline': pipeline!.toJson(),
         if (pubSubTopic != null) 'pubSubTopic': pubSubTopic!,
@@ -1781,7 +1771,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Holds encrypted information that is only decrypted and stored in RAM by the
@@ -1810,7 +1800,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cipherText != null) 'cipherText': cipherText!,
         if (keyName != null) 'keyName': keyName!,
       };
@@ -1841,7 +1831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (email != null) 'email': email!,
         if (scopes != null) 'scopes': scopes!,
       };
@@ -1880,8 +1870,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1894,7 +1884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1924,7 +1914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (actionId != null) 'actionId': actionId!,
         if (exitStatus != null) 'exitStatus': exitStatus!,
       };
@@ -2065,13 +2055,12 @@
           _json['enableStackdriverMonitoring'] as core.bool;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('machineType')) {
       machineType = _json['machineType'] as core.String;
@@ -2098,7 +2087,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accelerators != null)
           'accelerators': accelerators!.map((value) => value.toJson()).toList(),
         if (bootDiskSizeGb != null) 'bootDiskSizeGb': bootDiskSizeGb!,
@@ -2161,7 +2150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (existingDisk != null) 'existingDisk': existingDisk!.toJson(),
         if (nfsMount != null) 'nfsMount': nfsMount!.toJson(),
         if (persistentDisk != null) 'persistentDisk': persistentDisk!.toJson(),
@@ -2194,7 +2183,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!,
         if (machineType != null) 'machineType': machineType!,
         if (zone != null) 'zone': zone!,
@@ -2221,7 +2210,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (instance != null) 'instance': instance!,
         if (zone != null) 'zone': zone!,
       };
diff --git a/generated/googleapis_beta/lib/metastore/v1beta.dart b/generated/googleapis_beta/lib/metastore/v1beta.dart
index 6d3d43b..c2c023b 100644
--- a/generated/googleapis_beta/lib/metastore/v1beta.dart
+++ b/generated/googleapis_beta/lib/metastore/v1beta.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1080,7 +1079,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1122,7 +1121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1195,7 +1194,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1235,7 +1234,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (databaseType != null) 'databaseType': databaseType!,
         if (gcsUri != null) 'gcsUri': gcsUri!,
         if (sourceDatabase != null) 'sourceDatabase': sourceDatabase!,
@@ -1256,7 +1255,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for DataprocMetastore.ExportMetadata.
@@ -1294,7 +1293,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationGcsFolder != null)
           'destinationGcsFolder': destinationGcsFolder!,
         if (requestId != null) 'requestId': requestId!,
@@ -1362,7 +1361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -1396,14 +1395,13 @@
 
   HiveMetastoreConfig.fromJson(core.Map _json) {
     if (_json.containsKey('configOverrides')) {
-      configOverrides = (_json['configOverrides'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      configOverrides =
+          (_json['configOverrides'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('kerberosConfig')) {
       kerberosConfig = KerberosConfig.fromJson(
@@ -1414,7 +1412,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (configOverrides != null) 'configOverrides': configOverrides!,
         if (kerberosConfig != null) 'kerberosConfig': kerberosConfig!.toJson(),
         if (version != null) 'version': version!,
@@ -1441,7 +1439,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isDefault != null) 'isDefault': isDefault!,
         if (version != null) 'version': version!,
       };
@@ -1481,7 +1479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keytab != null) 'keytab': keytab!.toJson(),
         if (krb5ConfigGcsUri != null) 'krb5ConfigGcsUri': krb5ConfigGcsUri!,
         if (principal != null) 'principal': principal!,
@@ -1510,7 +1508,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1549,7 +1547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadataImports != null)
           'metadataImports':
               metadataImports!.map((value) => value.toJson()).toList(),
@@ -1580,7 +1578,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1619,7 +1617,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (services != null)
           'services': services!.map((value) => value.toJson()).toList(),
@@ -1664,32 +1662,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -1719,7 +1715,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (supportedHiveMetastoreVersions != null)
           'supportedHiveMetastoreVersions': supportedHiveMetastoreVersions!
               .map((value) => value.toJson())
@@ -1758,7 +1754,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dayOfWeek != null) 'dayOfWeek': dayOfWeek!,
         if (hourOfDay != null) 'hourOfDay': hourOfDay!,
       };
@@ -1810,7 +1806,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destinationGcsUri != null) 'destinationGcsUri': destinationGcsUri!,
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
@@ -1880,7 +1876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (databaseDump != null) 'databaseDump': databaseDump!.toJson(),
         if (description != null) 'description': description!,
@@ -1899,7 +1895,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The metadata management activities of the metastore service.
@@ -1931,7 +1927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metadataExports != null)
           'metadataExports':
               metadataExports!.map((value) => value.toJson()).toList(),
@@ -1994,29 +1990,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2127,7 +2121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -2196,7 +2190,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backup != null) 'backup': backup!,
         if (endTime != null) 'endTime': endTime!,
         if (startTime != null) 'startTime': startTime!,
@@ -2220,7 +2214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudSecret != null) 'cloudSecret': cloudSecret!,
       };
 }
@@ -2347,13 +2341,12 @@
           _json['hiveMetastoreConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('maintenanceWindow')) {
       maintenanceWindow = MaintenanceWindow.fromJson(
@@ -2394,7 +2387,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (artifactGcsUri != null) 'artifactGcsUri': artifactGcsUri!,
         if (createTime != null) 'createTime': createTime!,
         if (endpointUri != null) 'endpointUri': endpointUri!,
@@ -2445,7 +2438,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -2484,8 +2477,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2498,7 +2491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2524,7 +2517,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -2544,7 +2537,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
diff --git a/generated/googleapis_beta/lib/networkconnectivity/v1alpha1.dart b/generated/googleapis_beta/lib/networkconnectivity/v1alpha1.dart
index 7d72b98..f078b60 100644
--- a/generated/googleapis_beta/lib/networkconnectivity/v1alpha1.dart
+++ b/generated/googleapis_beta/lib/networkconnectivity/v1alpha1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1584,7 +1583,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (intValue != null) 'intValue': intValue!,
         if (stringValue != null) 'stringValue': stringValue!.toJson(),
@@ -1613,22 +1612,20 @@
 
   Attributes.fromJson(core.Map _json) {
     if (_json.containsKey('attributeMap')) {
-      attributeMap = (_json['attributeMap'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              AttributeValue.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      attributeMap =
+          (_json['attributeMap'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          AttributeValue.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('droppedAttributesCount')) {
       droppedAttributesCount = _json['droppedAttributesCount'] as core.int;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeMap != null)
           'attributeMap': attributeMap!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -1678,7 +1675,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1720,7 +1717,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1747,7 +1744,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reportRequests != null)
           'reportRequests':
               reportRequests!.map((value) => value.toJson()).toList(),
@@ -1820,7 +1817,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1932,7 +1929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketCounts != null) 'bucketCounts': bucketCounts!,
         if (count != null) 'count': count!,
         if (exemplars != null)
@@ -1964,7 +1961,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Exemplars are example points that may be used to annotate aggregated
@@ -2001,8 +1998,8 @@
   Exemplar.fromJson(core.Map _json) {
     if (_json.containsKey('attachments')) {
       attachments = (_json['attachments'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2018,7 +2015,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachments != null) 'attachments': attachments!,
         if (timestamp != null) 'timestamp': timestamp!,
         if (value != null) 'value': value!,
@@ -2050,7 +2047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bounds != null) 'bounds': bounds!,
       };
 }
@@ -2091,7 +2088,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (growthFactor != null) 'growthFactor': growthFactor!,
         if (numFiniteBuckets != null) 'numFiniteBuckets': numFiniteBuckets!,
         if (scale != null) 'scale': scale!,
@@ -2159,7 +2156,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -2175,7 +2172,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The response message for Operations.ListOperations.
@@ -2201,7 +2198,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -2262,29 +2259,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -2326,8 +2321,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2340,7 +2335,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2473,7 +2468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheFillBytes != null) 'cacheFillBytes': cacheFillBytes!,
         if (cacheHit != null) 'cacheHit': cacheHit!,
         if (cacheLookup != null) 'cacheLookup': cacheLookup!,
@@ -2549,13 +2544,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2576,7 +2570,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (labels != null) 'labels': labels!,
@@ -2622,7 +2616,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numFiniteBuckets != null) 'numFiniteBuckets': numFiniteBuckets!,
         if (offset != null) 'offset': offset!,
         if (width != null) 'width': width!,
@@ -2662,7 +2656,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (hubs != null) 'hubs': hubs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (unreachable != null) 'unreachable': unreachable!,
@@ -2691,7 +2685,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2731,7 +2725,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (spokes != null)
           'spokes': spokes!.map((value) => value.toJson()).toList(),
@@ -2776,32 +2770,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -2907,13 +2899,12 @@
       insertId = _json['insertId'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2923,14 +2914,13 @@
           _json['operation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('protoPayload')) {
-      protoPayload = (_json['protoPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      protoPayload =
+          (_json['protoPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('severity')) {
       severity = _json['severity'] as core.String;
@@ -2940,14 +2930,13 @@
           _json['sourceLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('structPayload')) {
-      structPayload = (_json['structPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      structPayload =
+          (_json['structPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('textPayload')) {
       textPayload = _json['textPayload'] as core.String;
@@ -2960,7 +2949,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpRequest != null) 'httpRequest': httpRequest!.toJson(),
         if (insertId != null) 'insertId': insertId!,
         if (labels != null) 'labels': labels!,
@@ -3023,7 +3012,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (first != null) 'first': first!,
         if (id != null) 'id': id!,
         if (last != null) 'last': last!,
@@ -3074,7 +3063,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (file != null) 'file': file!,
         if (function != null) 'function': function!,
         if (line != null) 'line': line!,
@@ -3144,13 +3133,12 @@
       int64Value = _json['int64Value'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('moneyValue')) {
       moneyValue = Money.fromJson(
@@ -3164,7 +3152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (distributionValue != null)
           'distributionValue': distributionValue!.toJson(),
@@ -3203,7 +3191,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricName != null) 'metricName': metricName!,
         if (metricValues != null)
           'metricValues': metricValues!.map((value) => value.toJson()).toList(),
@@ -3243,7 +3231,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -3376,8 +3364,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3389,13 +3377,12 @@
       importance = _json['importance'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('logEntries')) {
       logEntries = (_json['logEntries'] as core.List)
@@ -3435,18 +3422,17 @@
           .toList();
     }
     if (_json.containsKey('userLabels')) {
-      userLabels = (_json['userLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      userLabels =
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerId != null) 'consumerId': consumerId!,
         if (endTime != null) 'endTime': endTime!,
         if (extensions != null) 'extensions': extensions!,
@@ -3537,7 +3523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -3653,7 +3639,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -3687,7 +3673,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quotaMode != null) 'quotaMode': quotaMode!,
       };
 }
@@ -3735,7 +3721,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
         if (serviceConfigId != null) 'serviceConfigId': serviceConfigId!,
@@ -3777,7 +3763,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceContainer != null) 'resourceContainer': resourceContainer!,
         if (resourceLocation != null) 'resourceLocation': resourceLocation!,
         if (resourceName != null) 'resourceName': resourceName!,
@@ -3808,7 +3794,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (networkInterface != null) 'networkInterface': networkInterface!,
         if (virtualMachine != null) 'virtualMachine': virtualMachine!,
@@ -3842,7 +3828,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -3913,13 +3899,12 @@
       hub = _json['hub'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('linkedInterconnectAttachments')) {
       linkedInterconnectAttachments =
@@ -3954,7 +3939,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (hub != null) 'hub': hub!,
@@ -3992,7 +3977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4013,7 +3998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4150,7 +4135,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!.toJson(),
         if (childSpanCount != null) 'childSpanCount': childSpanCount!,
         if (displayName != null) 'displayName': displayName!.toJson(),
@@ -4193,7 +4178,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (truncatedByteCount != null)
           'truncatedByteCount': truncatedByteCount!,
         if (value != null) 'value': value!,
diff --git a/generated/googleapis_beta/lib/ondemandscanning/v1beta1.dart b/generated/googleapis_beta/lib/ondemandscanning/v1beta1.dart
index a878ff8..cc2564d 100644
--- a/generated/googleapis_beta/lib/ondemandscanning/v1beta1.dart
+++ b/generated/googleapis_beta/lib/ondemandscanning/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -457,7 +456,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
       };
@@ -483,7 +482,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (resourceUri != null) 'resourceUri': resourceUri!,
       };
@@ -514,7 +513,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (packages != null)
           'packages': packages!.map((value) => value.toJson()).toList(),
         if (resourceUri != null) 'resourceUri': resourceUri!,
@@ -535,7 +534,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (scan != null) 'scan': scan!,
       };
 }
@@ -575,7 +574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (checksum != null) 'checksum': checksum!,
         if (id != null) 'id': id!,
         if (names != null) 'names': names!,
@@ -642,7 +641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jwts != null) 'jwts': jwts!.map((value) => value.toJson()).toList(),
         if (serializedPayload != null) 'serializedPayload': serializedPayload!,
         if (signatures != null)
@@ -681,7 +680,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (provenance != null) 'provenance': provenance!.toJson(),
         if (provenanceBytes != null) 'provenanceBytes': provenanceBytes!,
       };
@@ -743,14 +742,13 @@
 
   BuildProvenance.fromJson(core.Map _json) {
     if (_json.containsKey('buildOptions')) {
-      buildOptions = (_json['buildOptions'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      buildOptions =
+          (_json['buildOptions'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('builderVersion')) {
       builderVersion = _json['builderVersion'] as core.String;
@@ -797,7 +795,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buildOptions != null) 'buildOptions': buildOptions!,
         if (builderVersion != null) 'builderVersion': builderVersion!,
         if (builtArtifacts != null)
@@ -837,7 +835,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoryId != null) 'categoryId': categoryId!,
         if (name != null) 'name': name!,
       };
@@ -871,7 +869,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliasContext != null) 'aliasContext': aliasContext!.toJson(),
         if (repoId != null) 'repoId': repoId!.toJson(),
         if (revisionId != null) 'revisionId': revisionId!,
@@ -932,7 +930,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (args != null) 'args': args!,
         if (dir != null) 'dir': dir!,
         if (env != null) 'env': env!,
@@ -1003,7 +1001,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (address != null) 'address': address!,
         if (config != null) 'config': config!,
         if (deployTime != null) 'deployTime': deployTime!,
@@ -1067,7 +1065,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analysisStatus != null) 'analysisStatus': analysisStatus!,
         if (analysisStatusError != null)
           'analysisStatusError': analysisStatusError!.toJson(),
@@ -1092,7 +1090,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Container message for hashes of byte content of files, used in source
@@ -1114,7 +1112,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileHash != null)
           'fileHash': fileHash!.map((value) => value.toJson()).toList(),
       };
@@ -1155,7 +1153,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (v1Name != null) 'v1Name': v1Name!,
         if (v2Blob != null) 'v2Blob': v2Blob!,
         if (v2Name != null) 'v2Name': v2Name!,
@@ -1197,7 +1195,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aliasContext != null) 'aliasContext': aliasContext!.toJson(),
         if (gerritProject != null) 'gerritProject': gerritProject!,
         if (hostUri != null) 'hostUri': hostUri!,
@@ -1225,7 +1223,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (revisionId != null) 'revisionId': revisionId!,
         if (url != null) 'url': url!,
       };
@@ -1260,7 +1258,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (type != null) 'type': type!,
         if (value != null) 'value': value!,
       };
@@ -1285,7 +1283,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (revision != null) 'revision': revision!,
         if (updateId != null) 'updateId': updateId!,
       };
@@ -1337,7 +1335,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseResourceUrl != null) 'baseResourceUrl': baseResourceUrl!,
         if (distance != null) 'distance': distance!,
         if (fingerprint != null) 'fingerprint': fingerprint!.toJson(),
@@ -1361,7 +1359,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compactJwt != null) 'compactJwt': compactJwt!,
       };
 }
@@ -1390,7 +1388,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (arguments != null) 'arguments': arguments!,
         if (directive != null) 'directive': directive!,
       };
@@ -1418,7 +1416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1449,7 +1447,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (occurrences != null)
           'occurrences': occurrences!.map((value) => value.toJson()).toList(),
@@ -1488,7 +1486,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpeUri != null) 'cpeUri': cpeUri!,
         if (path != null) 'path': path!,
         if (version != null) 'version': version!.toJson(),
@@ -1634,7 +1632,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attestation != null) 'attestation': attestation!.toJson(),
         if (build != null) 'build': build!.toJson(),
         if (createTime != null) 'createTime': createTime!,
@@ -1707,29 +1705,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1779,7 +1775,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpeUri != null) 'cpeUri': cpeUri!,
         if (os != null) 'os': os!,
         if (osVersion != null) 'osVersion': osVersion!,
@@ -1859,7 +1855,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (affectedCpeUri != null) 'affectedCpeUri': affectedCpeUri!,
         if (affectedPackage != null) 'affectedPackage': affectedPackage!,
         if (affectedVersion != null)
@@ -1898,7 +1894,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (location != null)
           'location': location!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -1927,7 +1923,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectId != null) 'projectId': projectId!,
         if (repoName != null) 'repoName': repoName!,
       };
@@ -1952,7 +1948,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (label != null) 'label': label!,
         if (url != null) 'url': url!,
       };
@@ -1978,7 +1974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (projectRepoId != null) 'projectRepoId': projectRepoId!.toJson(),
         if (uid != null) 'uid': uid!,
       };
@@ -2044,7 +2040,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publicKeyId != null) 'publicKeyId': publicKeyId!,
         if (signature != null) 'signature': signature!,
       };
@@ -2093,18 +2089,17 @@
           _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fileHashes')) {
-      fileHashes = (_json['fileHashes'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              FileHashes.fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      fileHashes =
+          (_json['fileHashes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          FileHashes.fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalContexts != null)
           'additionalContexts':
               additionalContexts!.map((value) => value.toJson()).toList(),
@@ -2150,17 +2145,16 @@
           _json['git'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloudRepo != null) 'cloudRepo': cloudRepo!.toJson(),
         if (gerrit != null) 'gerrit': gerrit!.toJson(),
         if (git != null) 'git': git!.toJson(),
@@ -2201,8 +2195,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -2215,7 +2209,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -2265,7 +2259,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (classification != null) 'classification': classification!,
         if (cpeUri != null) 'cpeUri': cpeUri!,
         if (cve != null) 'cve': cve!,
@@ -2323,7 +2317,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (distribution != null) 'distribution': distribution!.toJson(),
         if (package != null) 'package': package!,
         if (parsedVersion != null) 'parsedVersion': parsedVersion!.toJson(),
@@ -2391,7 +2385,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (epoch != null) 'epoch': epoch!,
         if (fullName != null) 'fullName': fullName!,
         if (inclusive != null) 'inclusive': inclusive!,
@@ -2502,7 +2496,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cvssScore != null) 'cvssScore': cvssScore!,
         if (effectiveSeverity != null) 'effectiveSeverity': effectiveSeverity!,
         if (fixAvailable != null) 'fixAvailable': fixAvailable!,
@@ -2577,7 +2571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categories != null)
           'categories': categories!.map((value) => value.toJson()).toList(),
         if (description != null) 'description': description!,
diff --git a/generated/googleapis_beta/lib/policysimulator/v1beta1.dart b/generated/googleapis_beta/lib/policysimulator/v1beta1.dart
index 2aac0de..8f91455 100644
--- a/generated/googleapis_beta/lib/policysimulator/v1beta1.dart
+++ b/generated/googleapis_beta/lib/policysimulator/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -791,7 +790,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessChange != null) 'accessChange': accessChange!,
         if (baseline != null) 'baseline': baseline!.toJson(),
         if (simulated != null) 'simulated': simulated!.toJson(),
@@ -845,7 +844,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullResourceName != null) 'fullResourceName': fullResourceName!,
         if (permission != null) 'permission': permission!,
         if (principal != null) 'principal': principal!,
@@ -948,15 +947,14 @@
           _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('memberships')) {
-      memberships = (_json['memberships'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudPolicysimulatorV1beta1BindingExplanationAnnotatedMembership
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      memberships =
+          (_json['memberships'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudPolicysimulatorV1beta1BindingExplanationAnnotatedMembership
+              .fromJson(item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('relevance')) {
       relevance = _json['relevance'] as core.String;
@@ -972,7 +970,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (access != null) 'access': access!,
         if (condition != null) 'condition': condition!.toJson(),
         if (memberships != null)
@@ -1025,7 +1023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (membership != null) 'membership': membership!,
         if (relevance != null) 'relevance': relevance!,
       };
@@ -1079,7 +1077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessState != null) 'accessState': accessState!,
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
@@ -1169,7 +1167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (access != null) 'access': access!,
         if (bindingExplanations != null)
           'bindingExplanations':
@@ -1207,7 +1205,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (replayResults != null)
           'replayResults':
@@ -1269,7 +1267,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (name != null) 'name': name!,
         if (resultsSummary != null) 'resultsSummary': resultsSummary!.toJson(),
@@ -1308,19 +1306,18 @@
       logSource = _json['logSource'] as core.String;
     }
     if (_json.containsKey('policyOverlay')) {
-      policyOverlay = (_json['policyOverlay'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleIamV1Policy.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      policyOverlay =
+          (_json['policyOverlay'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleIamV1Policy.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (logSource != null) 'logSource': logSource!,
         if (policyOverlay != null)
           'policyOverlay': policyOverlay!
@@ -1351,7 +1348,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessDiff != null) 'accessDiff': accessDiff!.toJson(),
       };
 }
@@ -1370,7 +1367,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (startTime != null) 'startTime': startTime!,
       };
 }
@@ -1439,7 +1436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessTuple != null) 'accessTuple': accessTuple!.toJson(),
         if (diff != null) 'diff': diff!.toJson(),
         if (error != null) 'error': error!.toJson(),
@@ -1497,7 +1494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (differenceCount != null) 'differenceCount': differenceCount!,
         if (errorCount != null) 'errorCount': errorCount!,
         if (logCount != null) 'logCount': logCount!,
@@ -1549,7 +1546,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -1591,7 +1588,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -1663,7 +1660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -1775,7 +1772,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -1808,7 +1805,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -1869,29 +1866,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -1933,8 +1928,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1947,7 +1942,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -1994,7 +1989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (month != null) 'month': month!,
         if (year != null) 'year': year!,
@@ -2062,7 +2057,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
diff --git a/generated/googleapis_beta/lib/privateca/v1beta1.dart b/generated/googleapis_beta/lib/privateca/v1beta1.dart
index 8e912ab..22c3f0b 100644
--- a/generated/googleapis_beta/lib/privateca/v1beta1.dart
+++ b/generated/googleapis_beta/lib/privateca/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1917,7 +1916,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caCertificateAccessUrl != null)
           'caCertificateAccessUrl': caCertificateAccessUrl!,
         if (crlAccessUrl != null) 'crlAccessUrl': crlAccessUrl!,
@@ -1970,7 +1969,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pemCaCertificate != null) 'pemCaCertificate': pemCaCertificate!,
         if (requestId != null) 'requestId': requestId!,
         if (subordinateConfig != null)
@@ -1999,7 +1998,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedConfigValues != null)
           'allowedConfigValues':
               allowedConfigValues!.map((value) => value.toJson()).toList(),
@@ -2093,7 +2092,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowCustomSans != null) 'allowCustomSans': allowCustomSans!,
         if (allowGlobbingDnsWildcards != null)
           'allowGlobbingDnsWildcards': allowGlobbingDnsWildcards!,
@@ -2146,7 +2145,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditLogConfigs != null)
           'auditLogConfigs':
               auditLogConfigs!.map((value) => value.toJson()).toList(),
@@ -2188,7 +2187,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exemptedMembers != null) 'exemptedMembers': exemptedMembers!,
         if (logType != null) 'logType': logType!,
       };
@@ -2216,7 +2215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reportRequests != null)
           'reportRequests':
               reportRequests!.map((value) => value.toJson()).toList(),
@@ -2289,7 +2288,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (condition != null) 'condition': condition!.toJson(),
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
@@ -2327,7 +2326,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (isCa != null) 'isCa': isCa!,
         if (maxIssuerPathLength != null)
           'maxIssuerPathLength': maxIssuerPathLength!,
@@ -2342,7 +2341,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A Certificate corresponds to a signed X.509 certificate issued by a
@@ -2430,13 +2429,12 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lifetime')) {
       lifetime = _json['lifetime'] as core.String;
@@ -2464,7 +2462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificateDescription != null)
           'certificateDescription': certificateDescription!.toJson(),
         if (config != null) 'config': config!.toJson(),
@@ -2666,13 +2664,12 @@
           _json['keySpec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('lifetime')) {
       lifetime = _json['lifetime'] as core.String;
@@ -2703,7 +2700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessUrls != null) 'accessUrls': accessUrls!.toJson(),
         if (caCertificateDescriptions != null)
           'caCertificateDescriptions': caCertificateDescriptions!
@@ -2825,7 +2822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedCommonNames != null)
           'allowedCommonNames': allowedCommonNames!,
         if (allowedConfigList != null)
@@ -2883,7 +2880,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (publicKey != null) 'publicKey': publicKey!.toJson(),
         if (reusableConfig != null) 'reusableConfig': reusableConfig!.toJson(),
         if (subjectConfig != null) 'subjectConfig': subjectConfig!.toJson(),
@@ -2963,7 +2960,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aiaIssuingCertificateUrls != null)
           'aiaIssuingCertificateUrls': aiaIssuingCertificateUrls!,
         if (authorityKeyId != null) 'authorityKeyId': authorityKeyId!.toJson(),
@@ -2992,7 +2989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sha256Hash != null) 'sha256Hash': sha256Hash!,
       };
 }
@@ -3064,13 +3061,12 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3095,7 +3091,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessUrl != null) 'accessUrl': accessUrl!,
         if (createTime != null) 'createTime': createTime!,
         if (labels != null) 'labels': labels!,
@@ -3136,7 +3132,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestId != null) 'requestId': requestId!,
       };
 }
@@ -3155,7 +3151,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for CertificateAuthorityService.EnableCertificateAuthority.
@@ -3184,7 +3180,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestId != null) 'requestId': requestId!,
       };
 }
@@ -3223,8 +3219,8 @@
   Exemplar.fromJson(core.Map _json) {
     if (_json.containsKey('attachments')) {
       attachments = (_json['attachments'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3240,7 +3236,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attachments != null) 'attachments': attachments!,
         if (timestamp != null) 'timestamp': timestamp!,
         if (value != null) 'value': value!,
@@ -3308,7 +3304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
         if (expression != null) 'expression': expression!,
         if (location != null) 'location': location!,
@@ -3375,7 +3371,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientAuth != null) 'clientAuth': clientAuth!,
         if (codeSigning != null) 'codeSigning': codeSigning!,
         if (emailProtection != null) 'emailProtection': emailProtection!,
@@ -3401,7 +3397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pemCsr != null) 'pemCsr': pemCsr!,
       };
 }
@@ -3432,7 +3428,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (intValue != null) 'intValue': intValue!,
         if (stringValue != null) 'stringValue': stringValue!.toJson(),
@@ -3461,22 +3457,21 @@
 
   GoogleApiServicecontrolV1Attributes.fromJson(core.Map _json) {
     if (_json.containsKey('attributeMap')) {
-      attributeMap = (_json['attributeMap'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleApiServicecontrolV1AttributeValue.fromJson(
-                  item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      attributeMap =
+          (_json['attributeMap'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleApiServicecontrolV1AttributeValue.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('droppedAttributesCount')) {
       droppedAttributesCount = _json['droppedAttributesCount'] as core.int;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributeMap != null)
           'attributeMap': attributeMap!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -3590,7 +3585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bucketCounts != null) 'bucketCounts': bucketCounts!,
         if (count != null) 'count': count!,
         if (exemplars != null)
@@ -3633,7 +3628,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bounds != null) 'bounds': bounds!,
       };
 }
@@ -3674,7 +3669,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (growthFactor != null) 'growthFactor': growthFactor!,
         if (numFiniteBuckets != null) 'numFiniteBuckets': numFiniteBuckets!,
         if (scale != null) 'scale': scale!,
@@ -3807,7 +3802,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cacheFillBytes != null) 'cacheFillBytes': cacheFillBytes!,
         if (cacheHit != null) 'cacheHit': cacheHit!,
         if (cacheLookup != null) 'cacheLookup': cacheLookup!,
@@ -3861,7 +3856,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (numFiniteBuckets != null) 'numFiniteBuckets': numFiniteBuckets!,
         if (offset != null) 'offset': offset!,
         if (width != null) 'width': width!,
@@ -3965,13 +3960,12 @@
       insertId = _json['insertId'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3981,14 +3975,13 @@
           _json['operation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('protoPayload')) {
-      protoPayload = (_json['protoPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      protoPayload =
+          (_json['protoPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('severity')) {
       severity = _json['severity'] as core.String;
@@ -3998,14 +3991,13 @@
           _json['sourceLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('structPayload')) {
-      structPayload = (_json['structPayload'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      structPayload =
+          (_json['structPayload'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('textPayload')) {
       textPayload = _json['textPayload'] as core.String;
@@ -4018,7 +4010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (httpRequest != null) 'httpRequest': httpRequest!.toJson(),
         if (insertId != null) 'insertId': insertId!,
         if (labels != null) 'labels': labels!,
@@ -4081,7 +4073,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (first != null) 'first': first!,
         if (id != null) 'id': id!,
         if (last != null) 'last': last!,
@@ -4132,7 +4124,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (file != null) 'file': file!,
         if (function != null) 'function': function!,
         if (line != null) 'line': line!,
@@ -4202,13 +4194,12 @@
       int64Value = _json['int64Value'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('moneyValue')) {
       moneyValue = Money.fromJson(
@@ -4222,7 +4213,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (boolValue != null) 'boolValue': boolValue!,
         if (distributionValue != null)
           'distributionValue': distributionValue!.toJson(),
@@ -4262,7 +4253,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (metricName != null) 'metricName': metricName!,
         if (metricValues != null)
           'metricValues': metricValues!.map((value) => value.toJson()).toList(),
@@ -4394,8 +4385,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4407,13 +4398,12 @@
       importance = _json['importance'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('logEntries')) {
       logEntries = (_json['logEntries'] as core.List)
@@ -4457,18 +4447,17 @@
           .toList();
     }
     if (_json.containsKey('userLabels')) {
-      userLabels = (_json['userLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      userLabels =
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (consumerId != null) 'consumerId': consumerId!,
         if (endTime != null) 'endTime': endTime!,
         if (extensions != null) 'extensions': extensions!,
@@ -4516,7 +4505,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (quotaMode != null) 'quotaMode': quotaMode!,
       };
 }
@@ -4565,7 +4554,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
         if (serviceConfigId != null) 'serviceConfigId': serviceConfigId!,
@@ -4607,7 +4596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceContainer != null) 'resourceContainer': resourceContainer!,
         if (resourceLocation != null) 'resourceLocation': resourceLocation!,
         if (resourceName != null) 'resourceName': resourceName!,
@@ -4746,7 +4735,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (attributes != null) 'attributes': attributes!.toJson(),
         if (childSpanCount != null) 'childSpanCount': childSpanCount!,
         if (displayName != null) 'displayName': displayName!.toJson(),
@@ -4789,7 +4778,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (truncatedByteCount != null)
           'truncatedByteCount': truncatedByteCount!,
         if (value != null) 'value': value!,
@@ -4821,7 +4810,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowConfigBasedIssuance != null)
           'allowConfigBasedIssuance': allowConfigBasedIssuance!,
         if (allowCsrBasedIssuance != null)
@@ -4857,7 +4846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (includeCaCertUrl != null) 'includeCaCertUrl': includeCaCertUrl!,
         if (includeCrlAccessUrl != null)
           'includeCrlAccessUrl': includeCrlAccessUrl!,
@@ -4881,7 +4870,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyId != null) 'keyId': keyId!,
       };
 }
@@ -4919,7 +4908,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (baseKeyUsage != null) 'baseKeyUsage': baseKeyUsage!.toJson(),
         if (extendedKeyUsage != null)
           'extendedKeyUsage': extendedKeyUsage!.toJson(),
@@ -4993,7 +4982,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certSign != null) 'certSign': certSign!,
         if (contentCommitment != null) 'contentCommitment': contentCommitment!,
         if (crlSign != null) 'crlSign': crlSign!,
@@ -5053,7 +5042,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (algorithm != null) 'algorithm': algorithm!,
         if (cloudKmsKeyVersion != null)
           'cloudKmsKeyVersion': cloudKmsKeyVersion!,
@@ -5093,7 +5082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificateAuthorities != null)
           'certificateAuthorities':
               certificateAuthorities!.map((value) => value.toJson()).toList(),
@@ -5138,7 +5127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificateRevocationLists != null)
           'certificateRevocationLists': certificateRevocationLists!
               .map((value) => value.toJson())
@@ -5181,7 +5170,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificates != null)
           'certificates': certificates!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5211,7 +5200,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (locations != null)
           'locations': locations!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -5240,7 +5229,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -5280,7 +5269,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (reusableConfigs != null)
           'reusableConfigs':
@@ -5326,32 +5315,30 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (labels != null) 'labels': labels!,
         if (locationId != null) 'locationId': locationId!,
@@ -5393,7 +5380,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (nanos != null) 'nanos': nanos!,
         if (units != null) 'units': units!,
@@ -5421,7 +5408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (objectIdPath != null) 'objectIdPath': objectIdPath!,
       };
 }
@@ -5480,29 +5467,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -5578,7 +5563,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -5694,7 +5679,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (auditConfigs != null)
           'auditConfigs': auditConfigs!.map((value) => value.toJson()).toList(),
         if (bindings != null)
@@ -5751,7 +5736,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (type != null) 'type': type!,
       };
@@ -5783,7 +5768,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (requestId != null) 'requestId': requestId!,
       };
 }
@@ -5836,13 +5821,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5856,7 +5840,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (description != null) 'description': description!,
         if (labels != null) 'labels': labels!,
@@ -5929,7 +5913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (additionalExtensions != null)
           'additionalExtensions':
               additionalExtensions!.map((value) => value.toJson()).toList(),
@@ -5967,7 +5951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reusableConfig != null) 'reusableConfig': reusableConfig!,
         if (reusableConfigValues != null)
           'reusableConfigValues': reusableConfigValues!.toJson(),
@@ -6011,7 +5995,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (revocationState != null) 'revocationState': revocationState!,
         if (revocationTime != null) 'revocationTime': revocationTime!,
       };
@@ -6069,7 +6053,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reason != null) 'reason': reason!,
         if (requestId != null) 'requestId': requestId!,
       };
@@ -6119,7 +6103,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificate != null) 'certificate': certificate!,
         if (hexSerialNumber != null) 'hexSerialNumber': hexSerialNumber!,
         if (revocationReason != null) 'revocationReason': revocationReason!,
@@ -6164,7 +6148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ignoreActiveCertificates != null)
           'ignoreActiveCertificates': ignoreActiveCertificates!,
         if (requestId != null) 'requestId': requestId!,
@@ -6198,7 +6182,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (updateMask != null) 'updateMask': updateMask!,
       };
@@ -6237,8 +6221,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -6251,7 +6235,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -6308,7 +6292,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (countryCode != null) 'countryCode': countryCode!,
         if (locality != null) 'locality': locality!,
         if (organization != null) 'organization': organization!,
@@ -6370,7 +6354,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customSans != null)
           'customSans': customSans!.map((value) => value.toJson()).toList(),
         if (dnsNames != null) 'dnsNames': dnsNames!,
@@ -6414,7 +6398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonName != null) 'commonName': commonName!,
         if (subject != null) 'subject': subject!.toJson(),
         if (subjectAltName != null) 'subjectAltName': subjectAltName!.toJson(),
@@ -6475,7 +6459,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonName != null) 'commonName': commonName!,
         if (hexSerialNumber != null) 'hexSerialNumber': hexSerialNumber!,
         if (lifetime != null) 'lifetime': lifetime!,
@@ -6519,7 +6503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certificateAuthority != null)
           'certificateAuthority': certificateAuthority!,
         if (pemIssuerChain != null) 'pemIssuerChain': pemIssuerChain!.toJson(),
@@ -6545,7 +6529,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (pemCertificates != null) 'pemCertificates': pemCertificates!,
       };
 }
@@ -6569,7 +6553,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -6590,7 +6574,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -6636,7 +6620,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (critical != null) 'critical': critical!,
         if (objectId != null) 'objectId': objectId!.toJson(),
         if (value != null) 'value': value!,
diff --git a/generated/googleapis_beta/lib/prod_tt_sasportal/v1alpha1.dart b/generated/googleapis_beta/lib/prod_tt_sasportal/v1alpha1.dart
index a479853..246b3a4 100644
--- a/generated/googleapis_beta/lib/prod_tt_sasportal/v1alpha1.dart
+++ b/generated/googleapis_beta/lib/prod_tt_sasportal/v1alpha1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3598,7 +3597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
       };
@@ -3638,7 +3637,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encodedDevice != null) 'encodedDevice': encodedDevice!,
         if (installerId != null) 'installerId': installerId!,
       };
@@ -3675,7 +3674,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (sasUserIds != null) 'sasUserIds': sasUserIds!,
@@ -3732,7 +3731,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedBillingModes != null)
           'allowedBillingModes': allowedBillingModes!,
         if (defaultBillingMode != null)
@@ -3834,7 +3833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeConfig != null) 'activeConfig': activeConfig!.toJson(),
         if (deviceMetadata != null) 'deviceMetadata': deviceMetadata!.toJson(),
         if (displayName != null) 'displayName': displayName!,
@@ -3888,7 +3887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (radioTechnology != null) 'radioTechnology': radioTechnology!,
         if (supportedSpec != null) 'supportedSpec': supportedSpec!,
       };
@@ -3978,7 +3977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (airInterface != null) 'airInterface': airInterface!.toJson(),
         if (callSign != null) 'callSign': callSign!,
         if (category != null) 'category': category!,
@@ -4076,7 +4075,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelType != null) 'channelType': channelType!,
         if (expireTime != null) 'expireTime': expireTime!,
         if (frequencyRange != null) 'frequencyRange': frequencyRange!.toJson(),
@@ -4097,7 +4096,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Information about the model of the device.
@@ -4137,7 +4136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firmwareVersion != null) 'firmwareVersion': firmwareVersion!,
         if (hardwareVersion != null) 'hardwareVersion': hardwareVersion!,
         if (name != null) 'name': name!,
@@ -4166,7 +4165,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dpaId != null) 'dpaId': dpaId!,
         if (frequencyRange != null) 'frequencyRange': frequencyRange!.toJson(),
       };
@@ -4186,7 +4185,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Frequency range from `low_frequency` to `high_frequency`.
@@ -4208,7 +4207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (highFrequencyMhz != null) 'highFrequencyMhz': highFrequencyMhz!,
         if (lowFrequencyMhz != null) 'lowFrequencyMhz': lowFrequencyMhz!,
       };
@@ -4222,7 +4221,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response for GenerateSecret.
@@ -4238,7 +4237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (secret != null) 'secret': secret!,
       };
 }
@@ -4258,7 +4257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resource != null) 'resource': resource!,
       };
 }
@@ -4409,7 +4408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (antennaAzimuth != null) 'antennaAzimuth': antennaAzimuth!,
         if (antennaBeamwidth != null) 'antennaBeamwidth': antennaBeamwidth!,
         if (antennaDowntilt != null) 'antennaDowntilt': antennaDowntilt!,
@@ -4453,7 +4452,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customers != null)
           'customers': customers!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4485,7 +4484,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployments != null)
           'deployments': deployments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4517,7 +4516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4549,7 +4548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (nodes != null)
           'nodes': nodes!.map((value) => value.toJson()).toList(),
@@ -4572,7 +4571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!,
       };
 }
@@ -4593,7 +4592,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!,
       };
 }
@@ -4614,7 +4613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!,
       };
 }
@@ -4648,7 +4647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (sasUserIds != null) 'sasUserIds': sasUserIds!,
@@ -4709,29 +4708,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4777,7 +4774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignments != null)
           'assignments': assignments!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -4810,7 +4807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (resource != null) 'resource': resource!,
       };
@@ -4835,7 +4832,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (device != null) 'device': device!.toJson(),
       };
 }
@@ -4873,8 +4870,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4887,7 +4884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4917,7 +4914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
         if (resource != null) 'resource': resource!,
       };
@@ -4938,7 +4935,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4977,7 +4974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encodedDevice != null) 'encodedDevice': encodedDevice!,
         if (installerId != null) 'installerId': installerId!,
       };
@@ -5017,7 +5014,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encodedSecret != null) 'encodedSecret': encodedSecret!,
         if (installerId != null) 'installerId': installerId!,
         if (secret != null) 'secret': secret!,
@@ -5032,5 +5029,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis_beta/lib/recommendationengine/v1beta1.dart b/generated/googleapis_beta/lib/recommendationengine/v1beta1.dart
index c050e56..030c24b 100644
--- a/generated/googleapis_beta/lib/recommendationengine/v1beta1.dart
+++ b/generated/googleapis_beta/lib/recommendationengine/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1356,8 +1355,8 @@
     }
     if (_json.containsKey('extensions')) {
       extensions = (_json['extensions'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -1367,7 +1366,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (data != null) 'data': data!,
         if (extensions != null) 'extensions': extensions!,
@@ -1382,7 +1381,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for TriggerCatalogRejoin method.
@@ -1399,7 +1398,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rejoinedUserEventsCount != null)
           'rejoinedUserEventsCount': rejoinedUserEventsCount!,
       };
@@ -1422,7 +1421,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (recommendationModel != null)
           'recommendationModel': recommendationModel!,
       };
@@ -1436,7 +1435,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// BigQuery source import data from.
@@ -1502,7 +1501,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dataSchema != null) 'dataSchema': dataSchema!,
         if (datasetId != null) 'datasetId': datasetId!,
         if (gcsStagingDir != null) 'gcsStagingDir': gcsStagingDir!,
@@ -1554,7 +1553,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (catalogItemLevelConfig != null)
           'catalogItemLevelConfig': catalogItemLevelConfig!.toJson(),
         if (defaultEventStoreId != null)
@@ -1586,7 +1585,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (catalogItems != null)
           'catalogItems': catalogItems!.map((value) => value.toJson()).toList(),
       };
@@ -1718,7 +1717,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoryHierarchies != null)
           'categoryHierarchies':
               categoryHierarchies!.map((value) => value.toJson()).toList(),
@@ -1756,7 +1755,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categories != null) 'categories': categories!,
       };
 }
@@ -1802,7 +1801,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventItemLevel != null) 'eventItemLevel': eventItemLevel!,
         if (predictItemLevel != null) 'predictItemLevel': predictItemLevel!,
       };
@@ -1828,7 +1827,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (predictionApiKeyRegistration != null)
           'predictionApiKeyRegistration':
               predictionApiKeyRegistration!.toJson(),
@@ -1926,7 +1925,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventAttributes != null)
           'eventAttributes': eventAttributes!.toJson(),
         if (experimentIds != null) 'experimentIds': experimentIds!,
@@ -1966,30 +1965,30 @@
 
   GoogleCloudRecommendationengineV1beta1FeatureMap.fromJson(core.Map _json) {
     if (_json.containsKey('categoricalFeatures')) {
-      categoricalFeatures = (_json['categoricalFeatures'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudRecommendationengineV1beta1FeatureMapStringList
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      categoricalFeatures =
+          (_json['categoricalFeatures'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudRecommendationengineV1beta1FeatureMapStringList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
     if (_json.containsKey('numericalFeatures')) {
-      numericalFeatures = (_json['numericalFeatures'] as core.Map)
-          .cast<core.String, core.Map<core.String, core.Object?>>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              GoogleCloudRecommendationengineV1beta1FeatureMapFloatList
-                  .fromJson(item as core.Map<core.String, core.dynamic>),
-            ),
-          );
+      numericalFeatures =
+          (_json['numericalFeatures'] as core.Map<core.String, core.dynamic>)
+              .map(
+        (key, item) => core.MapEntry(
+          key,
+          GoogleCloudRecommendationengineV1beta1FeatureMapFloatList.fromJson(
+              item as core.Map<core.String, core.dynamic>),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (categoricalFeatures != null)
           'categoricalFeatures': categoricalFeatures!
               .map((key, item) => core.MapEntry(key, item.toJson())),
@@ -2015,7 +2014,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (value != null) 'value': value!,
       };
 }
@@ -2036,7 +2035,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (value != null) 'value': value!,
       };
 }
@@ -2085,7 +2084,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputUris != null) 'inputUris': inputUris!,
         if (jsonSchema != null) 'jsonSchema': jsonSchema!,
       };
@@ -2122,7 +2121,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (height != null) 'height': height!,
         if (uri != null) 'uri': uri!,
         if (width != null) 'width': width!,
@@ -2178,7 +2177,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (requestId != null) 'requestId': requestId!,
@@ -2215,7 +2214,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -2240,7 +2239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (gcsPrefix != null) 'gcsPrefix': gcsPrefix!,
       };
 }
@@ -2295,7 +2294,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (failureCount != null) 'failureCount': failureCount!,
         if (operationName != null) 'operationName': operationName!,
@@ -2346,7 +2345,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
         if (inputConfig != null) 'inputConfig': inputConfig!.toJson(),
         if (requestId != null) 'requestId': requestId!,
@@ -2391,7 +2390,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errorSamples != null)
           'errorSamples': errorSamples!.map((value) => value.toJson()).toList(),
         if (errorsConfig != null) 'errorsConfig': errorsConfig!.toJson(),
@@ -2441,7 +2440,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bigQuerySource != null) 'bigQuerySource': bigQuerySource!.toJson(),
         if (catalogInlineSource != null)
           'catalogInlineSource': catalogInlineSource!.toJson(),
@@ -2478,7 +2477,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (catalogItems != null)
           'catalogItems': catalogItems!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2511,7 +2510,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (catalogs != null)
           'catalogs': catalogs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -2548,7 +2547,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (predictionApiKeyRegistrations != null)
           'predictionApiKeyRegistrations': predictionApiKeyRegistrations!
@@ -2584,7 +2583,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (userEvents != null)
           'userEvents': userEvents!.map((value) => value.toJson()).toList(),
@@ -2685,13 +2684,12 @@
       filter = _json['filter'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels =
-          (_json['labels'] as core.Map).cast<core.String, core.String>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.String,
-                ),
-              );
+      labels = (_json['labels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
     if (_json.containsKey('pageSize')) {
       pageSize = _json['pageSize'] as core.int;
@@ -2700,13 +2698,12 @@
       pageToken = _json['pageToken'] as core.String;
     }
     if (_json.containsKey('params')) {
-      params =
-          (_json['params'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      params = (_json['params'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('userEvent')) {
       userEvent = GoogleCloudRecommendationengineV1beta1UserEvent.fromJson(
@@ -2714,7 +2711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dryRun != null) 'dryRun': dryRun!,
         if (filter != null) 'filter': filter!,
         if (labels != null) 'labels': labels!,
@@ -2773,13 +2770,12 @@
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('nextPageToken')) {
       nextPageToken = _json['nextPageToken'] as core.String;
@@ -2797,7 +2793,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dryRun != null) 'dryRun': dryRun!,
         if (itemsMissingInCatalog != null)
           'itemsMissingInCatalog': itemsMissingInCatalog!,
@@ -2834,18 +2830,17 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('itemMetadata')) {
-      itemMetadata = (_json['itemMetadata'] as core.Map)
-          .cast<core.String, core.Object>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.Object,
-            ),
-          );
+      itemMetadata =
+          (_json['itemMetadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (id != null) 'id': id!,
         if (itemMetadata != null) 'itemMetadata': itemMetadata!,
       };
@@ -2865,7 +2860,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiKey != null) 'apiKey': apiKey!,
       };
 }
@@ -2941,12 +2936,12 @@
       canonicalProductUri = _json['canonicalProductUri'] as core.String;
     }
     if (_json.containsKey('costs')) {
-      costs = (_json['costs'] as core.Map).cast<core.String, core.double>().map(
-            (key, item) => core.MapEntry(
-              key,
-              (item as core.num).toDouble(),
-            ),
-          );
+      costs = (_json['costs'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          (item as core.num).toDouble(),
+        ),
+      );
     }
     if (_json.containsKey('currencyCode')) {
       currencyCode = _json['currencyCode'] as core.String;
@@ -2975,7 +2970,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableQuantity != null) 'availableQuantity': availableQuantity!,
         if (canonicalProductUri != null)
           'canonicalProductUri': canonicalProductUri!,
@@ -3015,7 +3010,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayPrice != null) 'displayPrice': displayPrice!,
         if (originalPrice != null) 'originalPrice': originalPrice!,
       };
@@ -3046,7 +3041,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (max != null) 'max': max!,
         if (min != null) 'min': min!,
       };
@@ -3157,7 +3152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (availableQuantity != null) 'availableQuantity': availableQuantity!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (displayPrice != null) 'displayPrice': displayPrice!,
@@ -3268,7 +3263,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cartId != null) 'cartId': cartId!,
         if (listId != null) 'listId': listId!,
         if (pageCategories != null)
@@ -3329,12 +3324,12 @@
   GoogleCloudRecommendationengineV1beta1PurchaseTransaction.fromJson(
       core.Map _json) {
     if (_json.containsKey('costs')) {
-      costs = (_json['costs'] as core.Map).cast<core.String, core.double>().map(
-            (key, item) => core.MapEntry(
-              key,
-              (item as core.num).toDouble(),
-            ),
-          );
+      costs = (_json['costs'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          (item as core.num).toDouble(),
+        ),
+      );
     }
     if (_json.containsKey('currencyCode')) {
       currencyCode = _json['currencyCode'] as core.String;
@@ -3346,16 +3341,16 @@
       revenue = (_json['revenue'] as core.num).toDouble();
     }
     if (_json.containsKey('taxes')) {
-      taxes = (_json['taxes'] as core.Map).cast<core.String, core.double>().map(
-            (key, item) => core.MapEntry(
-              key,
-              (item as core.num).toDouble(),
-            ),
-          );
+      taxes = (_json['taxes'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          (item as core.num).toDouble(),
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (costs != null) 'costs': costs!,
         if (currencyCode != null) 'currencyCode': currencyCode!,
         if (id != null) 'id': id!,
@@ -3386,7 +3381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (createTime != null) 'createTime': createTime!,
         if (operationName != null) 'operationName': operationName!,
       };
@@ -3431,7 +3426,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (filter != null) 'filter': filter!,
         if (force != null) 'force': force!,
       };
@@ -3467,7 +3462,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (purgedEventsCount != null) 'purgedEventsCount': purgedEventsCount!,
         if (userEventsSample != null)
           'userEventsSample':
@@ -3483,7 +3478,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Request message for CatalogRejoin method.
@@ -3508,7 +3503,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userEventRejoinScope != null)
           'userEventRejoinScope': userEventRejoinScope!,
       };
@@ -3528,7 +3523,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rejoinedUserEventsCount != null)
           'rejoinedUserEventsCount': rejoinedUserEventsCount!,
       };
@@ -3630,7 +3625,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (eventDetail != null) 'eventDetail': eventDetail!.toJson(),
         if (eventSource != null) 'eventSource': eventSource!,
         if (eventTime != null) 'eventTime': eventTime!,
@@ -3664,7 +3659,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (joinedEventsCount != null) 'joinedEventsCount': joinedEventsCount!,
         if (unjoinedEventsCount != null)
           'unjoinedEventsCount': unjoinedEventsCount!,
@@ -3693,7 +3688,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (userEvents != null)
           'userEvents': userEvents!.map((value) => value.toJson()).toList(),
       };
@@ -3769,7 +3764,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (directUserRequest != null) 'directUserRequest': directUserRequest!,
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (userAgent != null) 'userAgent': userAgent!,
@@ -3801,7 +3796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (operations != null)
           'operations': operations!.map((value) => value.toJson()).toList(),
@@ -3862,29 +3857,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -3907,7 +3900,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// The `Status` type defines a logical error model that is suitable for
@@ -3943,8 +3936,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -3957,7 +3950,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
diff --git a/generated/googleapis_beta/lib/sasportal/v1alpha1.dart b/generated/googleapis_beta/lib/sasportal/v1alpha1.dart
index 75b4845..578869f 100644
--- a/generated/googleapis_beta/lib/sasportal/v1alpha1.dart
+++ b/generated/googleapis_beta/lib/sasportal/v1alpha1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -3598,7 +3597,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (members != null) 'members': members!,
         if (role != null) 'role': role!,
       };
@@ -3638,7 +3637,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encodedDevice != null) 'encodedDevice': encodedDevice!,
         if (installerId != null) 'installerId': installerId!,
       };
@@ -3675,7 +3674,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (sasUserIds != null) 'sasUserIds': sasUserIds!,
@@ -3732,7 +3731,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedBillingModes != null)
           'allowedBillingModes': allowedBillingModes!,
         if (defaultBillingMode != null)
@@ -3834,7 +3833,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeConfig != null) 'activeConfig': activeConfig!.toJson(),
         if (deviceMetadata != null) 'deviceMetadata': deviceMetadata!.toJson(),
         if (displayName != null) 'displayName': displayName!,
@@ -3888,7 +3887,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (radioTechnology != null) 'radioTechnology': radioTechnology!,
         if (supportedSpec != null) 'supportedSpec': supportedSpec!,
       };
@@ -3978,7 +3977,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (airInterface != null) 'airInterface': airInterface!.toJson(),
         if (callSign != null) 'callSign': callSign!,
         if (category != null) 'category': category!,
@@ -4076,7 +4075,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channelType != null) 'channelType': channelType!,
         if (expireTime != null) 'expireTime': expireTime!,
         if (frequencyRange != null) 'frequencyRange': frequencyRange!.toJson(),
@@ -4097,7 +4096,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Information about the model of the device.
@@ -4137,7 +4136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (firmwareVersion != null) 'firmwareVersion': firmwareVersion!,
         if (hardwareVersion != null) 'hardwareVersion': hardwareVersion!,
         if (name != null) 'name': name!,
@@ -4166,7 +4165,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dpaId != null) 'dpaId': dpaId!,
         if (frequencyRange != null) 'frequencyRange': frequencyRange!.toJson(),
       };
@@ -4186,7 +4185,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Frequency range from `low_frequency` to `high_frequency`.
@@ -4208,7 +4207,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (highFrequencyMhz != null) 'highFrequencyMhz': highFrequencyMhz!,
         if (lowFrequencyMhz != null) 'lowFrequencyMhz': lowFrequencyMhz!,
       };
@@ -4222,7 +4221,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response for GenerateSecret.
@@ -4238,7 +4237,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (secret != null) 'secret': secret!,
       };
 }
@@ -4258,7 +4257,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resource != null) 'resource': resource!,
       };
 }
@@ -4409,7 +4408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (antennaAzimuth != null) 'antennaAzimuth': antennaAzimuth!,
         if (antennaBeamwidth != null) 'antennaBeamwidth': antennaBeamwidth!,
         if (antennaDowntilt != null) 'antennaDowntilt': antennaDowntilt!,
@@ -4453,7 +4452,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (customers != null)
           'customers': customers!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4485,7 +4484,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (deployments != null)
           'deployments': deployments!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4517,7 +4516,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (devices != null)
           'devices': devices!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -4549,7 +4548,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (nodes != null)
           'nodes': nodes!.map((value) => value.toJson()).toList(),
@@ -4572,7 +4571,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!,
       };
 }
@@ -4593,7 +4592,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!,
       };
 }
@@ -4614,7 +4613,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (destination != null) 'destination': destination!,
       };
 }
@@ -4648,7 +4647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (name != null) 'name': name!,
         if (sasUserIds != null) 'sasUserIds': sasUserIds!,
@@ -4709,29 +4708,27 @@
           _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata =
-          (_json['metadata'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      metadata = (_json['metadata'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('response')) {
-      response =
-          (_json['response'] as core.Map).cast<core.String, core.Object>().map(
-                (key, item) => core.MapEntry(
-                  key,
-                  item as core.Object,
-                ),
-              );
+      response = (_json['response'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.Object,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (done != null) 'done': done!,
         if (error != null) 'error': error!.toJson(),
         if (metadata != null) 'metadata': metadata!,
@@ -4777,7 +4774,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (assignments != null)
           'assignments': assignments!.map((value) => value.toJson()).toList(),
         if (etag != null) 'etag': etag!,
@@ -4810,7 +4807,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (policy != null) 'policy': policy!.toJson(),
         if (resource != null) 'resource': resource!,
       };
@@ -4835,7 +4832,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (device != null) 'device': device!.toJson(),
       };
 }
@@ -4873,8 +4870,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -4887,7 +4884,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -4917,7 +4914,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
         if (resource != null) 'resource': resource!,
       };
@@ -4938,7 +4935,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (permissions != null) 'permissions': permissions!,
       };
 }
@@ -4977,7 +4974,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encodedDevice != null) 'encodedDevice': encodedDevice!,
         if (installerId != null) 'installerId': installerId!,
       };
@@ -5017,7 +5014,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encodedSecret != null) 'encodedSecret': encodedSecret!,
         if (installerId != null) 'installerId': installerId!,
         if (secret != null) 'secret': secret!,
@@ -5032,5 +5029,5 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
diff --git a/generated/googleapis_beta/lib/sqladmin/v1beta4.dart b/generated/googleapis_beta/lib/sqladmin/v1beta4.dart
index 303b292..68e7060 100644
--- a/generated/googleapis_beta/lib/sqladmin/v1beta4.dart
+++ b/generated/googleapis_beta/lib/sqladmin/v1beta4.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -2365,7 +2364,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (expirationTime != null) 'expirationTime': expirationTime!,
         if (kind != null) 'kind': kind!,
         if (name != null) 'name': name!,
@@ -2403,7 +2402,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (message != null) 'message': message!,
         if (region != null) 'region': region!,
@@ -2480,7 +2479,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupRetentionSettings != null)
           'backupRetentionSettings': backupRetentionSettings!.toJson(),
         if (binaryLogEnabled != null) 'binaryLogEnabled': binaryLogEnabled!,
@@ -2516,7 +2515,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupId != null) 'backupId': backupId!,
         if (kind != null) 'kind': kind!,
       };
@@ -2550,7 +2549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (retainedBackups != null) 'retainedBackups': retainedBackups!,
         if (retentionUnit != null) 'retentionUnit': retentionUnit!,
       };
@@ -2700,7 +2699,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupKind != null) 'backupKind': backupKind!,
         if (description != null) 'description': description!,
         if (diskEncryptionConfiguration != null)
@@ -2753,7 +2752,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -2786,7 +2785,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (binLogFileName != null) 'binLogFileName': binLogFileName!,
         if (binLogPosition != null) 'binLogPosition': binLogPosition!,
         if (kind != null) 'kind': kind!,
@@ -2835,7 +2834,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (binLogCoordinates != null)
           'binLogCoordinates': binLogCoordinates!.toJson(),
         if (destinationInstanceName != null)
@@ -2914,7 +2913,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (charset != null) 'charset': charset!,
         if (collation != null) 'collation': collation!,
         if (etag != null) 'etag': etag!,
@@ -2955,7 +2954,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (value != null) 'value': value!,
       };
@@ -2990,7 +2989,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (available != null) 'available': available!,
         if (name != null) 'name': name!,
       };
@@ -3318,7 +3317,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backendType != null) 'backendType': backendType!,
         if (connectionName != null) 'connectionName': connectionName!,
         if (currentDiskSize != null) 'currentDiskSize': currentDiskSize!,
@@ -3384,7 +3383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -3421,7 +3420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (mysqlReplicaConfiguration != null)
           'mysqlReplicaConfiguration': mysqlReplicaConfiguration!.toJson(),
@@ -3469,7 +3468,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (masterInstanceName != null)
           'masterInstanceName': masterInstanceName!,
@@ -3526,7 +3525,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caCertificate != null) 'caCertificate': caCertificate!,
         if (clientCertificate != null) 'clientCertificate': clientCertificate!,
         if (clientKey != null) 'clientKey': clientKey!,
@@ -3576,7 +3575,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endDate != null) 'endDate': endDate!,
         if (startDate != null) 'startDate': startDate!,
         if (time != null) 'time': time!,
@@ -3602,7 +3601,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (kmsKeyName != null) 'kmsKeyName': kmsKeyName!,
       };
@@ -3627,7 +3626,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (kmsKeyVersionName != null) 'kmsKeyVersionName': kmsKeyVersionName!,
       };
@@ -3648,7 +3647,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (selectQuery != null) 'selectQuery': selectQuery!,
       };
 }
@@ -3672,7 +3671,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (masterData != null) 'masterData': masterData!,
       };
 }
@@ -3710,7 +3709,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (mysqlExportOptions != null)
           'mysqlExportOptions': mysqlExportOptions!.toJson(),
         if (schemaOnly != null) 'schemaOnly': schemaOnly!,
@@ -3795,7 +3794,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (csvExportOptions != null)
           'csvExportOptions': csvExportOptions!.toJson(),
         if (databases != null) 'databases': databases!,
@@ -3830,7 +3829,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (settingsVersion != null) 'settingsVersion': settingsVersion!,
       };
@@ -3932,7 +3931,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowedIntValues != null) 'allowedIntValues': allowedIntValues!,
         if (allowedStringValues != null)
           'allowedStringValues': allowedStringValues!,
@@ -3969,7 +3968,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -4008,7 +4007,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certPath != null) 'certPath': certPath!,
         if (pvkPassword != null) 'pvkPassword': pvkPassword!,
         if (pvkPath != null) 'pvkPath': pvkPath!,
@@ -4030,7 +4029,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (encryptionOptions != null)
           'encryptionOptions': encryptionOptions!.toJson(),
       };
@@ -4060,7 +4059,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columns != null) 'columns': columns!,
         if (table != null) 'table': table!,
       };
@@ -4137,7 +4136,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bakImportOptions != null)
           'bakImportOptions': bakImportOptions!.toJson(),
         if (csvImportOptions != null)
@@ -4189,7 +4188,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (queryInsightsEnabled != null)
           'queryInsightsEnabled': queryInsightsEnabled!,
         if (queryStringLength != null) 'queryStringLength': queryStringLength!,
@@ -4214,7 +4213,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cloneContext != null) 'cloneContext': cloneContext!.toJson(),
       };
 }
@@ -4233,7 +4232,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (demoteMasterContext != null)
           'demoteMasterContext': demoteMasterContext!.toJson(),
       };
@@ -4253,7 +4252,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exportContext != null) 'exportContext': exportContext!.toJson(),
       };
 }
@@ -4272,7 +4271,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failoverContext != null)
           'failoverContext': failoverContext!.toJson(),
       };
@@ -4292,7 +4291,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (importContext != null) 'importContext': importContext!.toJson(),
       };
 }
@@ -4337,7 +4336,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -4374,7 +4373,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activeVersion != null) 'activeVersion': activeVersion!,
         if (certs != null)
           'certs': certs!.map((value) => value.toJson()).toList(),
@@ -4396,7 +4395,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (restoreBackupContext != null)
           'restoreBackupContext': restoreBackupContext!.toJson(),
       };
@@ -4417,7 +4416,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rotateServerCaContext != null)
           'rotateServerCaContext': rotateServerCaContext!.toJson(),
       };
@@ -4437,7 +4436,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (truncateLogContext != null)
           'truncateLogContext': truncateLogContext!.toJson(),
       };
@@ -4485,7 +4484,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (authorizedNetworks != null)
           'authorizedNetworks':
               authorizedNetworks!.map((value) => value.toJson()).toList(),
@@ -4540,7 +4539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (ipAddress != null) 'ipAddress': ipAddress!,
         if (timeToRetire != null) 'timeToRetire': timeToRetire!,
         if (type != null) 'type': type!,
@@ -4588,7 +4587,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (followGaeApplication != null)
           'followGaeApplication': followGaeApplication!,
         if (kind != null) 'kind': kind!,
@@ -4642,7 +4641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (day != null) 'day': day!,
         if (hour != null) 'hour': hour!,
         if (kind != null) 'kind': kind!,
@@ -4734,7 +4733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caCertificate != null) 'caCertificate': caCertificate!,
         if (clientCertificate != null) 'clientCertificate': clientCertificate!,
         if (clientKey != null) 'clientKey': clientKey!,
@@ -4809,7 +4808,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (caCertificate != null) 'caCertificate': caCertificate!,
         if (clientCertificate != null) 'clientCertificate': clientCertificate!,
         if (clientKey != null) 'clientKey': clientKey!,
@@ -4993,7 +4992,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupContext != null) 'backupContext': backupContext!.toJson(),
         if (endTime != null) 'endTime': endTime!,
         if (error != null) 'error': error!.toJson(),
@@ -5038,7 +5037,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (kind != null) 'kind': kind!,
         if (message != null) 'message': message!,
@@ -5067,7 +5066,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5105,7 +5104,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5153,7 +5152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failoverTarget != null) 'failoverTarget': failoverTarget!,
         if (kind != null) 'kind': kind!,
         if (mysqlReplicaConfiguration != null)
@@ -5193,7 +5192,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (rescheduleType != null) 'rescheduleType': rescheduleType!,
         if (scheduleTime != null) 'scheduleTime': scheduleTime!,
       };
@@ -5232,7 +5231,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (backupRunId != null) 'backupRunId': backupRunId!,
         if (instanceId != null) 'instanceId': instanceId!,
         if (kind != null) 'kind': kind!,
@@ -5262,7 +5261,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (nextVersion != null) 'nextVersion': nextVersion!,
       };
@@ -5514,18 +5513,17 @@
       tier = _json['tier'] as core.String;
     }
     if (_json.containsKey('userLabels')) {
-      userLabels = (_json['userLabels'] as core.Map)
-          .cast<core.String, core.String>()
-          .map(
-            (key, item) => core.MapEntry(
-              key,
-              item as core.String,
-            ),
-          );
+      userLabels =
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>).map(
+        (key, item) => core.MapEntry(
+          key,
+          item as core.String,
+        ),
+      );
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activationPolicy != null) 'activationPolicy': activationPolicy!,
         if (activeDirectoryConfig != null)
           'activeDirectoryConfig': activeDirectoryConfig!.toJson(),
@@ -5585,7 +5583,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (domain != null) 'domain': domain!,
         if (kind != null) 'kind': kind!,
       };
@@ -5653,7 +5651,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (detail != null) 'detail': detail!,
         if (kind != null) 'kind': kind!,
         if (type != null) 'type': type!,
@@ -5676,7 +5674,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (reschedule != null) 'reschedule': reschedule!.toJson(),
       };
 }
@@ -5704,7 +5702,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (errors != null)
           'errors': errors!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -5735,7 +5733,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (canDefer != null) 'canDefer': canDefer!,
         if (canReschedule != null) 'canReschedule': canReschedule!,
         if (startTime != null) 'startTime': startTime!,
@@ -5761,7 +5759,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (compatibilityLevel != null)
           'compatibilityLevel': compatibilityLevel!,
         if (recoveryModel != null) 'recoveryModel': recoveryModel!,
@@ -5789,7 +5787,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (disabled != null) 'disabled': disabled!,
         if (serverRoles != null) 'serverRoles': serverRoles!,
       };
@@ -5860,7 +5858,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cert != null) 'cert': cert!,
         if (certSerialNumber != null) 'certSerialNumber': certSerialNumber!,
         if (commonName != null) 'commonName': commonName!,
@@ -5895,7 +5893,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (certInfo != null) 'certInfo': certInfo!.toJson(),
         if (certPrivateKey != null) 'certPrivateKey': certPrivateKey!,
       };
@@ -5920,7 +5918,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (accessToken != null) 'access_token': accessToken!,
         if (publicKey != null) 'public_key': publicKey!,
       };
@@ -5941,7 +5939,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commonName != null) 'commonName': commonName!,
       };
 }
@@ -5983,7 +5981,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clientCert != null) 'clientCert': clientCert!.toJson(),
         if (kind != null) 'kind': kind!,
         if (operation != null) 'operation': operation!.toJson(),
@@ -6013,7 +6011,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -6061,7 +6059,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (DiskQuota != null) 'DiskQuota': DiskQuota!,
         if (RAM != null) 'RAM': RAM!,
         if (kind != null) 'kind': kind!,
@@ -6092,7 +6090,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
@@ -6120,7 +6118,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (kind != null) 'kind': kind!,
         if (logType != null) 'logType': logType!,
       };
@@ -6206,7 +6204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (etag != null) 'etag': etag!,
         if (host != null) 'host': host!,
         if (instance != null) 'instance': instance!,
@@ -6251,7 +6249,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (items != null)
           'items': items!.map((value) => value.toJson()).toList(),
         if (kind != null) 'kind': kind!,
diff --git a/generated/googleapis_beta/lib/toolresults/v1beta3.dart b/generated/googleapis_beta/lib/toolresults/v1beta3.dart
index 152b1e7..f2aa4f2 100644
--- a/generated/googleapis_beta/lib/toolresults/v1beta3.dart
+++ b/generated/googleapis_beta/lib/toolresults/v1beta3.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -1896,7 +1895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stackTrace != null) 'stackTrace': stackTrace!.toJson(),
       };
 }
@@ -1940,7 +1939,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
         if (packageName != null) 'packageName': packageName!,
         if (versionCode != null) 'versionCode': versionCode!,
@@ -1992,7 +1991,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (testPackageId != null) 'testPackageId': testPackageId!,
         if (testRunnerClass != null) 'testRunnerClass': testRunnerClass!,
         if (testTargets != null) 'testTargets': testTargets!,
@@ -2048,7 +2047,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appInitialActivity != null)
           'appInitialActivity': appInitialActivity!,
         if (bootstrapPackageId != null)
@@ -2103,7 +2102,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidAppInfo != null) 'androidAppInfo': androidAppInfo!.toJson(),
         if (androidInstrumentationTest != null)
           'androidInstrumentationTest': androidInstrumentationTest!.toJson(),
@@ -2124,7 +2123,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// `Any` contains an arbitrary serialized protocol buffer message along with a
@@ -2197,7 +2196,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (typeUrl != null) 'typeUrl': typeUrl!,
         if (value != null) 'value': value!,
       };
@@ -2234,7 +2233,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fullyDrawnTime != null) 'fullyDrawnTime': fullyDrawnTime!.toJson(),
         if (initialDisplayTime != null)
           'initialDisplayTime': initialDisplayTime!.toJson(),
@@ -2249,7 +2248,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Encapsulates the metadata for basic sample series represented by a line
@@ -2305,7 +2304,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (perfMetricType != null) 'perfMetricType': perfMetricType!,
         if (perfUnit != null) 'perfUnit': perfUnit!,
         if (sampleSeriesLabel != null) 'sampleSeriesLabel': sampleSeriesLabel!,
@@ -2329,7 +2328,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (perfSamples != null)
           'perfSamples': perfSamples!.map((value) => value.toJson()).toList(),
       };
@@ -2349,7 +2348,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (perfSamples != null)
           'perfSamples': perfSamples!.map((value) => value.toJson()).toList(),
       };
@@ -2369,7 +2368,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (screenId != null) 'screenId': screenId!,
       };
 }
@@ -2398,7 +2397,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpuProcessor != null) 'cpuProcessor': cpuProcessor!,
         if (cpuSpeedInGhz != null) 'cpuSpeedInGhz': cpuSpeedInGhz!,
         if (numberOfCores != null) 'numberOfCores': numberOfCores!,
@@ -2418,7 +2417,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (crashPackage != null) 'crashPackage': crashPackage!,
       };
 }
@@ -2431,7 +2430,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A Duration represents a signed, fixed-length span of time represented as a
@@ -2468,7 +2467,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nanos != null) 'nanos': nanos!,
         if (seconds != null) 'seconds': seconds!,
       };
@@ -2495,7 +2494,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (distinctScreens != null) 'distinctScreens': distinctScreens!,
         if (screenIds != null) 'screenIds': screenIds!,
       };
@@ -2523,7 +2522,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (distinctScreens != null) 'distinctScreens': distinctScreens!,
         if (screenIds != null) 'screenIds': screenIds!,
       };
@@ -2644,7 +2643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completionTime != null) 'completionTime': completionTime!.toJson(),
         if (creationTime != null) 'creationTime': creationTime!.toJson(),
         if (dimensionValue != null)
@@ -2679,7 +2678,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -2797,7 +2796,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completionTime != null) 'completionTime': completionTime!.toJson(),
         if (creationTime != null) 'creationTime': creationTime!.toJson(),
         if (dimensionDefinitions != null)
@@ -2820,7 +2819,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Details for an outcome with a FAILURE outcome summary.
@@ -2877,7 +2876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (crashed != null) 'crashed': crashed!,
         if (deviceOutOfMemory != null) 'deviceOutOfMemory': deviceOutOfMemory!,
         if (failedRoboscript != null) 'failedRoboscript': failedRoboscript!,
@@ -2904,7 +2903,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stackTrace != null) 'stackTrace': stackTrace!.toJson(),
       };
 }
@@ -2928,7 +2927,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileUri != null) 'fileUri': fileUri!,
       };
 }
@@ -3025,7 +3024,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (buckets != null)
           'buckets': buckets!.map((value) => value.toJson()).toList(),
         if (highInputLatencyCount != null)
@@ -3062,7 +3061,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (frameCount != null) 'frameCount': frameCount!,
         if (renderMillis != null) 'renderMillis': renderMillis!,
       };
@@ -3121,7 +3120,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (displayName != null) 'displayName': displayName!,
         if (historyId != null) 'historyId': historyId!,
         if (name != null) 'name': name!,
@@ -3168,7 +3167,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (error != null) 'error': error!.toJson(),
         if (sourceImage != null) 'sourceImage': sourceImage!.toJson(),
         if (stepId != null) 'stepId': stepId!,
@@ -3198,7 +3197,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inAppPurchasesFlowsExplored != null)
           'inAppPurchasesFlowsExplored': inAppPurchasesFlowsExplored!,
         if (inAppPurchasesFlowsStarted != null)
@@ -3240,7 +3239,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (abortedByUser != null) 'abortedByUser': abortedByUser!,
         if (hasErrorLogs != null) 'hasErrorLogs': hasErrorLogs!,
         if (infrastructureFailure != null)
@@ -3296,7 +3295,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (multistepNumber != null) 'multistepNumber': multistepNumber!,
         if (outcomeSummary != null) 'outcomeSummary': outcomeSummary!,
         if (runDuration != null) 'runDuration': runDuration!.toJson(),
@@ -3312,7 +3311,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Additional details for an iOS app crash.
@@ -3331,7 +3330,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stackTrace != null) 'stackTrace': stackTrace!.toJson(),
       };
 }
@@ -3351,7 +3350,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (name != null) 'name': name!,
       };
 }
@@ -3364,7 +3363,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A iOS mobile test specification
@@ -3409,7 +3408,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (iosAppInfo != null) 'iosAppInfo': iosAppInfo!.toJson(),
         if (iosRoboTest != null) 'iosRoboTest': iosRoboTest!.toJson(),
         if (iosTestLoop != null) 'iosTestLoop': iosTestLoop!.toJson(),
@@ -3431,7 +3430,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bundleId != null) 'bundleId': bundleId!,
       };
 }
@@ -3455,7 +3454,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bundleId != null) 'bundleId': bundleId!,
         if (xcodeVersion != null) 'xcodeVersion': xcodeVersion!,
       };
@@ -3469,7 +3468,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Response message for EnvironmentService.ListEnvironments.
@@ -3520,7 +3519,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (environments != null)
           'environments': environments!.map((value) => value.toJson()).toList(),
         if (executionId != null) 'executionId': executionId!,
@@ -3555,7 +3554,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (executions != null)
           'executions': executions!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3590,7 +3589,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (histories != null)
           'histories': histories!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -3612,7 +3611,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (perfSampleSeries != null)
           'perfSampleSeries':
               perfSampleSeries!.map((value) => value.toJson()).toList(),
@@ -3642,7 +3641,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (perfSamples != null)
           'perfSamples': perfSamples!.map((value) => value.toJson()).toList(),
@@ -3664,7 +3663,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusters != null)
           'clusters': clusters!.map((value) => value.toJson()).toList(),
       };
@@ -3701,7 +3700,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (clusters != null)
           'clusters': clusters!.map((value) => value.toJson()).toList(),
         if (name != null) 'name': name!,
@@ -3740,7 +3739,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (thumbnails != null)
           'thumbnails': thumbnails!.map((value) => value.toJson()).toList(),
@@ -3772,7 +3771,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (steps != null)
           'steps': steps!.map((value) => value.toJson()).toList(),
@@ -3800,7 +3799,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
         if (testCases != null)
           'testCases': testCases!.map((value) => value.toJson()).toList(),
@@ -3815,7 +3814,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// One dimension of the matrix of different runs of a step.
@@ -3826,7 +3825,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 class MemoryInfo {
@@ -3847,7 +3846,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (memoryCapInKibibyte != null)
           'memoryCapInKibibyte': memoryCapInKibibyte!,
         if (memoryTotalInKibibyte != null)
@@ -3907,7 +3906,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (outcome != null) 'outcome': outcome!.toJson(),
         if (state != null) 'state': state!,
         if (testSuiteOverviews != null)
@@ -3945,7 +3944,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (multistepNumber != null) 'multistepNumber': multistepNumber!,
         if (primaryStep != null) 'primaryStep': primaryStep!.toJson(),
         if (primaryStepId != null) 'primaryStepId': primaryStepId!,
@@ -3968,7 +3967,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (stackTrace != null) 'stackTrace': stackTrace!.toJson(),
       };
 }
@@ -4025,7 +4024,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiSignature != null) 'apiSignature': apiSignature!,
         if (exampleStackTraces != null)
           'exampleStackTraces': exampleStackTraces!,
@@ -4078,7 +4077,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exampleTraceMessages != null)
           'exampleTraceMessages': exampleTraceMessages!,
         if (matcherId != null) 'matcherId': matcherId!,
@@ -4109,7 +4108,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiSignatures != null) 'apiSignatures': apiSignatures!,
         if (uniqueApis != null) 'uniqueApis': uniqueApis!,
       };
@@ -4149,7 +4148,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exampleApis != null)
           'exampleApis': exampleApis!.map((value) => value.toJson()).toList(),
         if (minSdkVersion != null) 'minSdkVersion': minSdkVersion!,
@@ -4227,7 +4226,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (failureDetail != null) 'failureDetail': failureDetail!.toJson(),
         if (inconclusiveDetail != null)
           'inconclusiveDetail': inconclusiveDetail!.toJson(),
@@ -4259,7 +4258,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceName != null) 'resourceName': resourceName!,
         if (screenId != null) 'screenId': screenId!,
       };
@@ -4281,7 +4280,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nameOfGoogleLibrary != null)
           'nameOfGoogleLibrary': nameOfGoogleLibrary!,
       };
@@ -4308,7 +4307,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (cpuInfo != null) 'cpuInfo': cpuInfo!.toJson(),
         if (memoryInfo != null) 'memoryInfo': memoryInfo!.toJson(),
       };
@@ -4382,7 +4381,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (appStartTime != null) 'appStartTime': appStartTime!.toJson(),
         if (executionId != null) 'executionId': executionId!,
         if (graphicsStats != null) 'graphicsStats': graphicsStats!.toJson(),
@@ -4415,7 +4414,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (sampleTime != null) 'sampleTime': sampleTime!.toJson(),
         if (value != null) 'value': value!,
       };
@@ -4472,7 +4471,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (basicPerfSampleSeries != null)
           'basicPerfSampleSeries': basicPerfSampleSeries!.toJson(),
         if (executionId != null) 'executionId': executionId!,
@@ -4491,7 +4490,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// A notification that Robo performed some monkey actions.
@@ -4507,7 +4506,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (totalActions != null) 'totalActions': totalActions!,
       };
 }
@@ -4550,7 +4549,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (individualOutcome != null)
           'individualOutcome':
               individualOutcome!.map((value) => value.toJson()).toList(),
@@ -4583,7 +4582,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (defaultBucket != null) 'defaultBucket': defaultBucket!,
         if (name != null) 'name': name!,
       };
@@ -4608,7 +4607,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (xunitXmlFiles != null)
           'xunitXmlFiles':
               xunitXmlFiles!.map((value) => value.toJson()).toList(),
@@ -4654,7 +4653,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (heightPx != null) 'heightPx': heightPx!,
         if (leftPx != null) 'leftPx': leftPx!,
         if (topPx != null) 'topPx': topPx!,
@@ -4683,7 +4682,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resultsStoragePath != null)
           'resultsStoragePath': resultsStoragePath!.toJson(),
         if (xunitXmlFile != null) 'xunitXmlFile': xunitXmlFile!.toJson(),
@@ -4709,7 +4708,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (successfulActions != null) 'successfulActions': successfulActions!,
         if (totalActions != null) 'totalActions': totalActions!,
       };
@@ -4739,7 +4738,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (privateDoNotAccessOrElseSafeHtmlWrappedValue != null)
           'privateDoNotAccessOrElseSafeHtmlWrappedValue':
               privateDoNotAccessOrElseSafeHtmlWrappedValue!,
@@ -4784,7 +4783,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileReference != null) 'fileReference': fileReference!,
         if (locale != null) 'locale': locale!,
         if (model != null) 'model': model!,
@@ -4832,7 +4831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (activity != null) 'activity': activity!,
         if (clusterId != null) 'clusterId': clusterId!,
         if (keyScreen != null) 'keyScreen': keyScreen!.toJson(),
@@ -4867,7 +4866,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (runs != null) 'runs': runs!.map((value) => value.toJson()).toList(),
         if (shardResult != null) 'shardResult': shardResult!.toJson(),
       };
@@ -4898,7 +4897,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (incompatibleAppVersion != null)
           'incompatibleAppVersion': incompatibleAppVersion!,
         if (incompatibleArchitecture != null)
@@ -4929,7 +4928,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (androidTest != null) 'androidTest': androidTest!.toJson(),
         if (iosTest != null) 'iosTest': iosTest!.toJson(),
       };
@@ -4950,7 +4949,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (exception != null) 'exception': exception!,
       };
 }
@@ -4971,7 +4970,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (action != null) 'action': action!,
         if (uri != null) 'uri': uri!,
       };
@@ -5010,8 +5009,8 @@
     }
     if (_json.containsKey('details')) {
       details = (_json['details'] as core.List)
-          .map<core.Map<core.String, core.Object>>((value) =>
-              (value as core.Map).cast<core.String, core.Object>().map(
+          .map<core.Map<core.String, core.Object>>(
+              (value) => (value as core.Map<core.String, core.dynamic>).map(
                     (key, item) => core.MapEntry(
                       key,
                       item as core.Object,
@@ -5024,7 +5023,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (code != null) 'code': code!,
         if (details != null) 'details': details!,
         if (message != null) 'message': message!,
@@ -5248,7 +5247,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (completionTime != null) 'completionTime': completionTime!.toJson(),
         if (creationTime != null) 'creationTime': creationTime!.toJson(),
         if (description != null) 'description': description!,
@@ -5288,7 +5287,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -5309,7 +5308,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (value != null) 'value': value!,
       };
@@ -5323,7 +5322,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Details for an outcome with a SUCCESS outcome summary.
@@ -5341,7 +5340,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (otherNativeCrash != null) 'otherNativeCrash': otherNativeCrash!,
       };
 }
@@ -5384,7 +5383,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (suggestions != null)
           'suggestions': suggestions!.map((value) => value.toJson()).toList(),
@@ -5492,7 +5491,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (helpUrl != null) 'helpUrl': helpUrl!,
         if (longMessage != null) 'longMessage': longMessage!.toJson(),
         if (priority != null) 'priority': priority!,
@@ -5597,7 +5596,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (elapsedTime != null) 'elapsedTime': elapsedTime!.toJson(),
         if (endTime != null) 'endTime': endTime!.toJson(),
         if (skippedMessage != null) 'skippedMessage': skippedMessage!,
@@ -5644,7 +5643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (className != null) 'className': className!,
         if (name != null) 'name': name!,
         if (testSuiteName != null) 'testSuiteName': testSuiteName!,
@@ -5712,7 +5711,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (testIssues != null)
           'testIssues': testIssues!.map((value) => value.toJson()).toList(),
         if (testSuiteOverviews != null)
@@ -5839,7 +5838,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (category != null) 'category': category!,
         if (errorMessage != null) 'errorMessage': errorMessage!,
         if (severity != null) 'severity': severity!,
@@ -5935,7 +5934,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (elapsedTime != null) 'elapsedTime': elapsedTime!.toJson(),
         if (errorCount != null) 'errorCount': errorCount!,
         if (failureCount != null) 'failureCount': failureCount!,
@@ -5964,7 +5963,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (testProcessDuration != null)
           'testProcessDuration': testProcessDuration!.toJson(),
       };
@@ -6017,7 +6016,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (contentType != null) 'contentType': contentType!,
         if (data != null) 'data': data!,
         if (heightPx != null) 'heightPx': heightPx!,
@@ -6061,7 +6060,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (nanos != null) 'nanos': nanos!,
         if (seconds != null) 'seconds': seconds!,
       };
@@ -6130,7 +6129,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (commandLineArguments != null)
           'commandLineArguments': commandLineArguments!,
         if (exitCode != null) 'exitCode': exitCode!.toJson(),
@@ -6160,7 +6159,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (toolExecution != null) 'toolExecution': toolExecution!.toJson(),
       };
 }
@@ -6181,7 +6180,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (number != null) 'number': number!,
       };
 }
@@ -6222,7 +6221,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (creationTime != null) 'creationTime': creationTime!.toJson(),
         if (output != null) 'output': output!.toJson(),
         if (testCase != null) 'testCase': testCase!.toJson(),
@@ -6255,7 +6254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (depth != null) 'depth': depth!,
         if (screenId != null) 'screenId': screenId!,
         if (screenStateId != null) 'screenStateId': screenStateId!,
@@ -6270,7 +6269,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Additional details of an unused robodirective.
@@ -6286,7 +6285,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceName != null) 'resourceName': resourceName!,
       };
 }
@@ -6313,7 +6312,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (packageName != null) 'packageName': packageName!,
         if (upgradeToVersion != null) 'upgradeToVersion': upgradeToVersion!,
       };
@@ -6332,7 +6331,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceName != null) 'resourceName': resourceName!,
       };
 }
@@ -6352,7 +6351,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (resourceName != null) 'resourceName': resourceName!,
       };
 }
diff --git a/generated/googleapis_beta/lib/transcoder/v1beta1.dart b/generated/googleapis_beta/lib/transcoder/v1beta1.dart
index 4ba685b..f0d6ab4 100644
--- a/generated/googleapis_beta/lib/transcoder/v1beta1.dart
+++ b/generated/googleapis_beta/lib/transcoder/v1beta1.dart
@@ -9,7 +9,6 @@
 // ignore_for_file: prefer_expression_function_bodies
 // ignore_for_file: prefer_interpolation_to_compose_strings
 // ignore_for_file: unnecessary_brace_in_string_interps
-// ignore_for_file: unnecessary_cast
 // ignore_for_file: unnecessary_lambdas
 // ignore_for_file: unnecessary_string_interpolations
 
@@ -445,7 +444,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (startTimeOffset != null) 'startTimeOffset': startTimeOffset!,
       };
 }
@@ -467,7 +466,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyUri != null) 'keyUri': keyUri!,
       };
 }
@@ -500,7 +499,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (animationEnd != null) 'animationEnd': animationEnd!.toJson(),
         if (animationFade != null) 'animationFade': animationFade!.toJson(),
         if (animationStatic != null)
@@ -526,7 +525,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (startTimeOffset != null) 'startTimeOffset': startTimeOffset!,
       };
 }
@@ -578,7 +577,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTimeOffset != null) 'endTimeOffset': endTimeOffset!,
         if (fadeType != null) 'fadeType': fadeType!,
         if (startTimeOffset != null) 'startTimeOffset': startTimeOffset!,
@@ -613,7 +612,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (startTimeOffset != null) 'startTimeOffset': startTimeOffset!,
         if (xy != null) 'xy': xy!.toJson(),
       };
@@ -656,7 +655,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (highBoost != null) 'highBoost': highBoost!,
         if (lowBoost != null) 'lowBoost': lowBoost!,
         if (lufs != null) 'lufs': lufs!,
@@ -690,7 +689,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channels != null)
           'channels': channels!.map((value) => value.toJson()).toList(),
         if (key != null) 'key': key!,
@@ -713,7 +712,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputs != null)
           'inputs': inputs!.map((value) => value.toJson()).toList(),
       };
@@ -759,7 +758,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (channel != null) 'channel': channel!,
         if (gainDb != null) 'gainDb': gainDb!,
         if (key != null) 'key': key!,
@@ -832,7 +831,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bitrateBps != null) 'bitrateBps': bitrateBps!,
         if (channelCount != null) 'channelCount': channelCount!,
         if (channelLayout != null) 'channelLayout': channelLayout!,
@@ -877,7 +876,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (brightness != null) 'brightness': brightness!,
         if (contrast != null) 'contrast': contrast!,
         if (saturation != null) 'saturation': saturation!,
@@ -925,7 +924,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottomPixels != null) 'bottomPixels': bottomPixels!,
         if (leftPixels != null) 'leftPixels': leftPixels!,
         if (rightPixels != null) 'rightPixels': rightPixels!,
@@ -957,7 +956,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (enabled != null) 'enabled': enabled!,
         if (strength != null) 'strength': strength!,
       };
@@ -988,7 +987,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (strength != null) 'strength': strength!,
         if (tune != null) 'tune': tune!,
       };
@@ -1036,7 +1035,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (endTimeOffset != null) 'endTimeOffset': endTimeOffset!,
         if (inputs != null) 'inputs': inputs!,
         if (key != null) 'key': key!,
@@ -1083,7 +1082,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audioStream != null) 'audioStream': audioStream!.toJson(),
         if (key != null) 'key': key!,
         if (textStream != null) 'textStream': textStream!.toJson(),
@@ -1105,7 +1104,7 @@
       // ignore: avoid_unused_constructor_parameters
       core.Map _json);
 
-  core.Map<core.String, core.Object?> toJson() => {};
+  core.Map<core.String, core.dynamic> toJson() => {};
 }
 
 /// Encryption settings.
@@ -1153,7 +1152,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (aes128 != null) 'aes128': aes128!.toJson(),
         if (iv != null) 'iv': iv!,
         if (key != null) 'key': key!,
@@ -1175,7 +1174,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (description != null) 'description': description!,
       };
 }
@@ -1216,7 +1215,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (alpha != null) 'alpha': alpha!,
         if (resolution != null) 'resolution': resolution!.toJson(),
         if (uri != null) 'uri': uri!,
@@ -1255,7 +1254,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (preprocessingConfig != null)
           'preprocessingConfig': preprocessingConfig!.toJson(),
@@ -1421,7 +1420,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (createTime != null) 'createTime': createTime!,
         if (endTime != null) 'endTime': endTime!,
@@ -1540,7 +1539,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (adBreaks != null)
           'adBreaks': adBreaks!.map((value) => value.toJson()).toList(),
         if (editList != null)
@@ -1587,7 +1586,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (config != null) 'config': config!.toJson(),
         if (name != null) 'name': name!,
       };
@@ -1615,7 +1614,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobTemplates != null)
           'jobTemplates': jobTemplates!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
@@ -1644,7 +1643,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (jobs != null) 'jobs': jobs!.map((value) => value.toJson()).toList(),
         if (nextPageToken != null) 'nextPageToken': nextPageToken!,
       };
@@ -1694,7 +1693,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (fileName != null) 'fileName': fileName!,
         if (muxStreams != null) 'muxStreams': muxStreams!,
         if (type != null) 'type': type!,
@@ -1727,7 +1726,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyId != null) 'keyId': keyId!,
         if (scheme != null) 'scheme': scheme!,
       };
@@ -1791,7 +1790,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (container != null) 'container': container!,
         if (elementaryStreams != null) 'elementaryStreams': elementaryStreams!,
         if (encryption != null) 'encryption': encryption!.toJson(),
@@ -1823,7 +1822,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (x != null) 'x': x!,
         if (y != null) 'y': y!,
       };
@@ -1896,7 +1895,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (apiVersion != null) 'apiVersion': apiVersion!,
         if (cancelRequested != null) 'cancelRequested': cancelRequested!,
         if (createTime != null) 'createTime': createTime!,
@@ -1930,7 +1929,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (dash != null) 'dash': dash!,
         if (hls != null) 'hls': hls!,
       };
@@ -1952,7 +1951,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (uri != null) 'uri': uri!,
       };
 }
@@ -1982,7 +1981,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (animations != null)
           'animations': animations!.map((value) => value.toJson()).toList(),
         if (image != null) 'image': image!.toJson(),
@@ -2031,7 +2030,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (bottomPixels != null) 'bottomPixels': bottomPixels!,
         if (leftPixels != null) 'leftPixels': leftPixels!,
         if (rightPixels != null) 'rightPixels': rightPixels!,
@@ -2087,7 +2086,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (audio != null) 'audio': audio!.toJson(),
         if (color != null) 'color': color!.toJson(),
         if (crop != null) 'crop': crop!.toJson(),
@@ -2128,7 +2127,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (analyzed != null) 'analyzed': analyzed!,
         if (encoded != null) 'encoded': encoded!,
         if (notified != null) 'notified': notified!,
@@ -2151,7 +2150,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (topic != null) 'topic': topic!,
       };
 }
@@ -2173,7 +2172,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (keyUri != null) 'keyUri': keyUri!,
       };
 }
@@ -2205,7 +2204,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (individualSegments != null)
           'individualSegments': individualSegments!,
         if (segmentDuration != null) 'segmentDuration': segmentDuration!,
@@ -2319,7 +2318,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (columnCount != null) 'columnCount': columnCount!,
         if (endTimeOffset != null) 'endTimeOffset': endTimeOffset!,
         if (filePrefix != null) 'filePrefix': filePrefix!,
@@ -2362,7 +2361,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (inputs != null)
           'inputs': inputs!.map((value) => value.toJson()).toList(),
         if (key != null) 'key': key!,
@@ -2392,7 +2391,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (key != null) 'key': key!,
         if (track != null) 'track': track!,
       };
@@ -2436,7 +2435,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (codec != null) 'codec': codec!,
         if (languageCode != null) 'languageCode': languageCode!,
         if (mapping != null)
@@ -2661,7 +2660,7 @@
     }
   }
 
-  core.Map<core.String, core.Object?> toJson() => {
+  core.Map<core.String, core.dynamic> toJson() => {
         if (allowOpenGop != null) 'allowOpenGop': allowOpenGop!,
         if (aqStrength != null) 'aqStrength': aqStrength!,
         if (bFrameCount != null) 'bFrameCount': bFrameCount!,
diff --git a/generated/googleapis_beta/test/adexchangebuyer2/v2beta1_test.dart b/generated/googleapis_beta/test/adexchangebuyer2/v2beta1_test.dart
index 7c31d05..f397b51 100644
--- a/generated/googleapis_beta/test/adexchangebuyer2/v2beta1_test.dart
+++ b/generated/googleapis_beta/test/adexchangebuyer2/v2beta1_test.dart
@@ -4456,7 +4456,9 @@
   unittest.group('obj-schema-AbsoluteDateRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAbsoluteDateRange();
-      var od = api.AbsoluteDateRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AbsoluteDateRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAbsoluteDateRange(od as api.AbsoluteDateRange);
     });
   });
@@ -4464,7 +4466,9 @@
   unittest.group('obj-schema-AcceptProposalRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAcceptProposalRequest();
-      var od = api.AcceptProposalRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AcceptProposalRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAcceptProposalRequest(od as api.AcceptProposalRequest);
     });
   });
@@ -4472,7 +4476,9 @@
   unittest.group('obj-schema-AdSize', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdSize();
-      var od = api.AdSize.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdSize.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdSize(od as api.AdSize);
     });
   });
@@ -4480,7 +4486,9 @@
   unittest.group('obj-schema-AdTechnologyProviders', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdTechnologyProviders();
-      var od = api.AdTechnologyProviders.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdTechnologyProviders.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdTechnologyProviders(od as api.AdTechnologyProviders);
     });
   });
@@ -4488,7 +4496,9 @@
   unittest.group('obj-schema-AddDealAssociationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddDealAssociationRequest();
-      var od = api.AddDealAssociationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddDealAssociationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddDealAssociationRequest(od as api.AddDealAssociationRequest);
     });
   });
@@ -4496,7 +4506,9 @@
   unittest.group('obj-schema-AddNoteRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddNoteRequest();
-      var od = api.AddNoteRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddNoteRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddNoteRequest(od as api.AddNoteRequest);
     });
   });
@@ -4504,7 +4516,9 @@
   unittest.group('obj-schema-AppContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppContext();
-      var od = api.AppContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AppContext.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAppContext(od as api.AppContext);
     });
   });
@@ -4512,7 +4526,9 @@
   unittest.group('obj-schema-AuctionContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuctionContext();
-      var od = api.AuctionContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuctionContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuctionContext(od as api.AuctionContext);
     });
   });
@@ -4520,7 +4536,9 @@
   unittest.group('obj-schema-BidMetricsRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBidMetricsRow();
-      var od = api.BidMetricsRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BidMetricsRow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBidMetricsRow(od as api.BidMetricsRow);
     });
   });
@@ -4528,7 +4546,9 @@
   unittest.group('obj-schema-BidResponseWithoutBidsStatusRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBidResponseWithoutBidsStatusRow();
-      var od = api.BidResponseWithoutBidsStatusRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BidResponseWithoutBidsStatusRow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBidResponseWithoutBidsStatusRow(
           od as api.BidResponseWithoutBidsStatusRow);
     });
@@ -4537,7 +4557,8 @@
   unittest.group('obj-schema-Buyer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuyer();
-      var od = api.Buyer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Buyer.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuyer(od as api.Buyer);
     });
   });
@@ -4545,7 +4566,9 @@
   unittest.group('obj-schema-CalloutStatusRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCalloutStatusRow();
-      var od = api.CalloutStatusRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CalloutStatusRow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCalloutStatusRow(od as api.CalloutStatusRow);
     });
   });
@@ -4553,7 +4576,9 @@
   unittest.group('obj-schema-CancelNegotiationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelNegotiationRequest();
-      var od = api.CancelNegotiationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelNegotiationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelNegotiationRequest(od as api.CancelNegotiationRequest);
     });
   });
@@ -4561,7 +4586,9 @@
   unittest.group('obj-schema-Client', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClient();
-      var od = api.Client.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Client.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkClient(od as api.Client);
     });
   });
@@ -4569,7 +4596,9 @@
   unittest.group('obj-schema-ClientUser', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientUser();
-      var od = api.ClientUser.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ClientUser.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkClientUser(od as api.ClientUser);
     });
   });
@@ -4577,7 +4606,9 @@
   unittest.group('obj-schema-ClientUserInvitation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildClientUserInvitation();
-      var od = api.ClientUserInvitation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ClientUserInvitation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkClientUserInvitation(od as api.ClientUserInvitation);
     });
   });
@@ -4585,7 +4616,9 @@
   unittest.group('obj-schema-CompleteSetupRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCompleteSetupRequest();
-      var od = api.CompleteSetupRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CompleteSetupRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCompleteSetupRequest(od as api.CompleteSetupRequest);
     });
   });
@@ -4593,7 +4626,9 @@
   unittest.group('obj-schema-ContactInformation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContactInformation();
-      var od = api.ContactInformation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContactInformation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContactInformation(od as api.ContactInformation);
     });
   });
@@ -4601,7 +4636,9 @@
   unittest.group('obj-schema-Correction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCorrection();
-      var od = api.Correction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Correction.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCorrection(od as api.Correction);
     });
   });
@@ -4609,7 +4646,9 @@
   unittest.group('obj-schema-Creative', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreative();
-      var od = api.Creative.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Creative.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCreative(od as api.Creative);
     });
   });
@@ -4617,7 +4656,9 @@
   unittest.group('obj-schema-CreativeDealAssociation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeDealAssociation();
-      var od = api.CreativeDealAssociation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeDealAssociation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeDealAssociation(od as api.CreativeDealAssociation);
     });
   });
@@ -4625,7 +4666,9 @@
   unittest.group('obj-schema-CreativeRestrictions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeRestrictions();
-      var od = api.CreativeRestrictions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeRestrictions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeRestrictions(od as api.CreativeRestrictions);
     });
   });
@@ -4633,7 +4676,9 @@
   unittest.group('obj-schema-CreativeSize', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeSize();
-      var od = api.CreativeSize.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeSize.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeSize(od as api.CreativeSize);
     });
   });
@@ -4641,7 +4686,9 @@
   unittest.group('obj-schema-CreativeSpecification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeSpecification();
-      var od = api.CreativeSpecification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeSpecification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeSpecification(od as api.CreativeSpecification);
     });
   });
@@ -4649,7 +4696,9 @@
   unittest.group('obj-schema-CreativeStatusRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreativeStatusRow();
-      var od = api.CreativeStatusRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreativeStatusRow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreativeStatusRow(od as api.CreativeStatusRow);
     });
   });
@@ -4657,7 +4706,9 @@
   unittest.group('obj-schema-CriteriaTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCriteriaTargeting();
-      var od = api.CriteriaTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CriteriaTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCriteriaTargeting(od as api.CriteriaTargeting);
     });
   });
@@ -4665,7 +4716,8 @@
   unittest.group('obj-schema-Date', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDate();
-      var od = api.Date.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Date.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDate(od as api.Date);
     });
   });
@@ -4673,7 +4725,9 @@
   unittest.group('obj-schema-DayPart', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDayPart();
-      var od = api.DayPart.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DayPart.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDayPart(od as api.DayPart);
     });
   });
@@ -4681,7 +4735,9 @@
   unittest.group('obj-schema-DayPartTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDayPartTargeting();
-      var od = api.DayPartTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DayPartTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDayPartTargeting(od as api.DayPartTargeting);
     });
   });
@@ -4689,7 +4745,8 @@
   unittest.group('obj-schema-Deal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeal();
-      var od = api.Deal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Deal.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeal(od as api.Deal);
     });
   });
@@ -4697,7 +4754,9 @@
   unittest.group('obj-schema-DealPauseStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealPauseStatus();
-      var od = api.DealPauseStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DealPauseStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDealPauseStatus(od as api.DealPauseStatus);
     });
   });
@@ -4705,7 +4764,9 @@
   unittest.group('obj-schema-DealServingMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealServingMetadata();
-      var od = api.DealServingMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DealServingMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDealServingMetadata(od as api.DealServingMetadata);
     });
   });
@@ -4713,7 +4774,9 @@
   unittest.group('obj-schema-DealTerms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDealTerms();
-      var od = api.DealTerms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DealTerms.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDealTerms(od as api.DealTerms);
     });
   });
@@ -4721,7 +4784,9 @@
   unittest.group('obj-schema-DeliveryControl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeliveryControl();
-      var od = api.DeliveryControl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeliveryControl.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeliveryControl(od as api.DeliveryControl);
     });
   });
@@ -4729,7 +4794,9 @@
   unittest.group('obj-schema-Disapproval', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisapproval();
-      var od = api.Disapproval.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Disapproval.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisapproval(od as api.Disapproval);
     });
   });
@@ -4737,7 +4804,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -4745,7 +4813,9 @@
   unittest.group('obj-schema-FilterSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterSet();
-      var od = api.FilterSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FilterSet.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilterSet(od as api.FilterSet);
     });
   });
@@ -4753,7 +4823,9 @@
   unittest.group('obj-schema-FilteredBidCreativeRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilteredBidCreativeRow();
-      var od = api.FilteredBidCreativeRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilteredBidCreativeRow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilteredBidCreativeRow(od as api.FilteredBidCreativeRow);
     });
   });
@@ -4761,7 +4833,9 @@
   unittest.group('obj-schema-FilteredBidDetailRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilteredBidDetailRow();
-      var od = api.FilteredBidDetailRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilteredBidDetailRow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilteredBidDetailRow(od as api.FilteredBidDetailRow);
     });
   });
@@ -4769,7 +4843,9 @@
   unittest.group('obj-schema-FirstPartyMobileApplicationTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirstPartyMobileApplicationTargeting();
-      var od = api.FirstPartyMobileApplicationTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirstPartyMobileApplicationTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirstPartyMobileApplicationTargeting(
           od as api.FirstPartyMobileApplicationTargeting);
     });
@@ -4778,7 +4854,9 @@
   unittest.group('obj-schema-FrequencyCap', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFrequencyCap();
-      var od = api.FrequencyCap.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FrequencyCap.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFrequencyCap(od as api.FrequencyCap);
     });
   });
@@ -4786,7 +4864,9 @@
   unittest.group('obj-schema-GuaranteedFixedPriceTerms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGuaranteedFixedPriceTerms();
-      var od = api.GuaranteedFixedPriceTerms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GuaranteedFixedPriceTerms.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGuaranteedFixedPriceTerms(od as api.GuaranteedFixedPriceTerms);
     });
   });
@@ -4794,7 +4874,9 @@
   unittest.group('obj-schema-HtmlContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHtmlContent();
-      var od = api.HtmlContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HtmlContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHtmlContent(od as api.HtmlContent);
     });
   });
@@ -4802,7 +4884,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -4810,7 +4893,9 @@
   unittest.group('obj-schema-ImpressionMetricsRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImpressionMetricsRow();
-      var od = api.ImpressionMetricsRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImpressionMetricsRow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImpressionMetricsRow(od as api.ImpressionMetricsRow);
     });
   });
@@ -4818,7 +4903,9 @@
   unittest.group('obj-schema-InventorySizeTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInventorySizeTargeting();
-      var od = api.InventorySizeTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InventorySizeTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInventorySizeTargeting(od as api.InventorySizeTargeting);
     });
   });
@@ -4826,7 +4913,9 @@
   unittest.group('obj-schema-ListBidMetricsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBidMetricsResponse();
-      var od = api.ListBidMetricsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBidMetricsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBidMetricsResponse(od as api.ListBidMetricsResponse);
     });
   });
@@ -4834,7 +4923,9 @@
   unittest.group('obj-schema-ListBidResponseErrorsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBidResponseErrorsResponse();
-      var od = api.ListBidResponseErrorsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBidResponseErrorsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBidResponseErrorsResponse(
           od as api.ListBidResponseErrorsResponse);
     });
@@ -4843,7 +4934,9 @@
   unittest.group('obj-schema-ListBidResponsesWithoutBidsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListBidResponsesWithoutBidsResponse();
-      var od = api.ListBidResponsesWithoutBidsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListBidResponsesWithoutBidsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListBidResponsesWithoutBidsResponse(
           od as api.ListBidResponsesWithoutBidsResponse);
     });
@@ -4852,7 +4945,9 @@
   unittest.group('obj-schema-ListClientUserInvitationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListClientUserInvitationsResponse();
-      var od = api.ListClientUserInvitationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListClientUserInvitationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListClientUserInvitationsResponse(
           od as api.ListClientUserInvitationsResponse);
     });
@@ -4861,7 +4956,9 @@
   unittest.group('obj-schema-ListClientUsersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListClientUsersResponse();
-      var od = api.ListClientUsersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListClientUsersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListClientUsersResponse(od as api.ListClientUsersResponse);
     });
   });
@@ -4869,7 +4966,9 @@
   unittest.group('obj-schema-ListClientsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListClientsResponse();
-      var od = api.ListClientsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListClientsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListClientsResponse(od as api.ListClientsResponse);
     });
   });
@@ -4878,8 +4977,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCreativeStatusBreakdownByCreativeResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ListCreativeStatusBreakdownByCreativeResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCreativeStatusBreakdownByCreativeResponse(
           od as api.ListCreativeStatusBreakdownByCreativeResponse);
     });
@@ -4888,8 +4988,9 @@
   unittest.group('obj-schema-ListCreativeStatusBreakdownByDetailResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCreativeStatusBreakdownByDetailResponse();
-      var od =
-          api.ListCreativeStatusBreakdownByDetailResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCreativeStatusBreakdownByDetailResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCreativeStatusBreakdownByDetailResponse(
           od as api.ListCreativeStatusBreakdownByDetailResponse);
     });
@@ -4898,7 +4999,9 @@
   unittest.group('obj-schema-ListCreativesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCreativesResponse();
-      var od = api.ListCreativesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCreativesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCreativesResponse(od as api.ListCreativesResponse);
     });
   });
@@ -4906,7 +5009,9 @@
   unittest.group('obj-schema-ListDealAssociationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDealAssociationsResponse();
-      var od = api.ListDealAssociationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDealAssociationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDealAssociationsResponse(od as api.ListDealAssociationsResponse);
     });
   });
@@ -4914,7 +5019,9 @@
   unittest.group('obj-schema-ListFilterSetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFilterSetsResponse();
-      var od = api.ListFilterSetsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFilterSetsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFilterSetsResponse(od as api.ListFilterSetsResponse);
     });
   });
@@ -4922,7 +5029,9 @@
   unittest.group('obj-schema-ListFilteredBidRequestsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFilteredBidRequestsResponse();
-      var od = api.ListFilteredBidRequestsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFilteredBidRequestsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFilteredBidRequestsResponse(
           od as api.ListFilteredBidRequestsResponse);
     });
@@ -4931,7 +5040,9 @@
   unittest.group('obj-schema-ListFilteredBidsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFilteredBidsResponse();
-      var od = api.ListFilteredBidsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFilteredBidsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFilteredBidsResponse(od as api.ListFilteredBidsResponse);
     });
   });
@@ -4939,7 +5050,9 @@
   unittest.group('obj-schema-ListImpressionMetricsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListImpressionMetricsResponse();
-      var od = api.ListImpressionMetricsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListImpressionMetricsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListImpressionMetricsResponse(
           od as api.ListImpressionMetricsResponse);
     });
@@ -4948,7 +5061,9 @@
   unittest.group('obj-schema-ListLosingBidsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLosingBidsResponse();
-      var od = api.ListLosingBidsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLosingBidsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLosingBidsResponse(od as api.ListLosingBidsResponse);
     });
   });
@@ -4956,7 +5071,9 @@
   unittest.group('obj-schema-ListNonBillableWinningBidsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNonBillableWinningBidsResponse();
-      var od = api.ListNonBillableWinningBidsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNonBillableWinningBidsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNonBillableWinningBidsResponse(
           od as api.ListNonBillableWinningBidsResponse);
     });
@@ -4965,7 +5082,9 @@
   unittest.group('obj-schema-ListProductsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListProductsResponse();
-      var od = api.ListProductsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListProductsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListProductsResponse(od as api.ListProductsResponse);
     });
   });
@@ -4973,7 +5092,9 @@
   unittest.group('obj-schema-ListProposalsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListProposalsResponse();
-      var od = api.ListProposalsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListProposalsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListProposalsResponse(od as api.ListProposalsResponse);
     });
   });
@@ -4981,7 +5102,9 @@
   unittest.group('obj-schema-ListPublisherProfilesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPublisherProfilesResponse();
-      var od = api.ListPublisherProfilesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPublisherProfilesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPublisherProfilesResponse(
           od as api.ListPublisherProfilesResponse);
     });
@@ -4990,7 +5113,9 @@
   unittest.group('obj-schema-LocationContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationContext();
-      var od = api.LocationContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationContext(od as api.LocationContext);
     });
   });
@@ -4998,7 +5123,9 @@
   unittest.group('obj-schema-MarketplaceTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMarketplaceTargeting();
-      var od = api.MarketplaceTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MarketplaceTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMarketplaceTargeting(od as api.MarketplaceTargeting);
     });
   });
@@ -5006,7 +5133,9 @@
   unittest.group('obj-schema-MetricValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricValue();
-      var od = api.MetricValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricValue(od as api.MetricValue);
     });
   });
@@ -5014,7 +5143,9 @@
   unittest.group('obj-schema-MobileApplicationTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMobileApplicationTargeting();
-      var od = api.MobileApplicationTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MobileApplicationTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMobileApplicationTargeting(od as api.MobileApplicationTargeting);
     });
   });
@@ -5022,7 +5153,8 @@
   unittest.group('obj-schema-Money', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoney();
-      var od = api.Money.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Money.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMoney(od as api.Money);
     });
   });
@@ -5030,7 +5162,9 @@
   unittest.group('obj-schema-NativeContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNativeContent();
-      var od = api.NativeContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NativeContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNativeContent(od as api.NativeContent);
     });
   });
@@ -5038,7 +5172,9 @@
   unittest.group('obj-schema-NonBillableWinningBidStatusRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNonBillableWinningBidStatusRow();
-      var od = api.NonBillableWinningBidStatusRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NonBillableWinningBidStatusRow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNonBillableWinningBidStatusRow(
           od as api.NonBillableWinningBidStatusRow);
     });
@@ -5047,7 +5183,9 @@
   unittest.group('obj-schema-NonGuaranteedAuctionTerms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNonGuaranteedAuctionTerms();
-      var od = api.NonGuaranteedAuctionTerms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NonGuaranteedAuctionTerms.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNonGuaranteedAuctionTerms(od as api.NonGuaranteedAuctionTerms);
     });
   });
@@ -5055,7 +5193,9 @@
   unittest.group('obj-schema-NonGuaranteedFixedPriceTerms', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNonGuaranteedFixedPriceTerms();
-      var od = api.NonGuaranteedFixedPriceTerms.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NonGuaranteedFixedPriceTerms.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNonGuaranteedFixedPriceTerms(od as api.NonGuaranteedFixedPriceTerms);
     });
   });
@@ -5063,7 +5203,8 @@
   unittest.group('obj-schema-Note', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNote();
-      var od = api.Note.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Note.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNote(od as api.Note);
     });
   });
@@ -5071,7 +5212,9 @@
   unittest.group('obj-schema-OperatingSystemTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperatingSystemTargeting();
-      var od = api.OperatingSystemTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperatingSystemTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperatingSystemTargeting(od as api.OperatingSystemTargeting);
     });
   });
@@ -5079,7 +5222,9 @@
   unittest.group('obj-schema-PauseProposalRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPauseProposalRequest();
-      var od = api.PauseProposalRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PauseProposalRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPauseProposalRequest(od as api.PauseProposalRequest);
     });
   });
@@ -5087,7 +5232,9 @@
   unittest.group('obj-schema-PlacementTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlacementTargeting();
-      var od = api.PlacementTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlacementTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlacementTargeting(od as api.PlacementTargeting);
     });
   });
@@ -5095,7 +5242,9 @@
   unittest.group('obj-schema-PlatformContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPlatformContext();
-      var od = api.PlatformContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PlatformContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPlatformContext(od as api.PlatformContext);
     });
   });
@@ -5103,7 +5252,8 @@
   unittest.group('obj-schema-Price', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrice();
-      var od = api.Price.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Price.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPrice(od as api.Price);
     });
   });
@@ -5111,7 +5261,9 @@
   unittest.group('obj-schema-PricePerBuyer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPricePerBuyer();
-      var od = api.PricePerBuyer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PricePerBuyer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPricePerBuyer(od as api.PricePerBuyer);
     });
   });
@@ -5119,7 +5271,9 @@
   unittest.group('obj-schema-PrivateData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrivateData();
-      var od = api.PrivateData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PrivateData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPrivateData(od as api.PrivateData);
     });
   });
@@ -5127,7 +5281,9 @@
   unittest.group('obj-schema-Product', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProduct();
-      var od = api.Product.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Product.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProduct(od as api.Product);
     });
   });
@@ -5135,7 +5291,9 @@
   unittest.group('obj-schema-Proposal', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProposal();
-      var od = api.Proposal.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Proposal.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProposal(od as api.Proposal);
     });
   });
@@ -5143,7 +5301,9 @@
   unittest.group('obj-schema-PublisherProfile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublisherProfile();
-      var od = api.PublisherProfile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublisherProfile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublisherProfile(od as api.PublisherProfile);
     });
   });
@@ -5151,7 +5311,9 @@
   unittest.group('obj-schema-PublisherProfileMobileApplication', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublisherProfileMobileApplication();
-      var od = api.PublisherProfileMobileApplication.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublisherProfileMobileApplication.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublisherProfileMobileApplication(
           od as api.PublisherProfileMobileApplication);
     });
@@ -5160,7 +5322,9 @@
   unittest.group('obj-schema-RealtimeTimeRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRealtimeTimeRange();
-      var od = api.RealtimeTimeRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RealtimeTimeRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRealtimeTimeRange(od as api.RealtimeTimeRange);
     });
   });
@@ -5168,7 +5332,9 @@
   unittest.group('obj-schema-RelativeDateRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelativeDateRange();
-      var od = api.RelativeDateRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RelativeDateRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRelativeDateRange(od as api.RelativeDateRange);
     });
   });
@@ -5176,7 +5342,9 @@
   unittest.group('obj-schema-RemoveDealAssociationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveDealAssociationRequest();
-      var od = api.RemoveDealAssociationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveDealAssociationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveDealAssociationRequest(od as api.RemoveDealAssociationRequest);
     });
   });
@@ -5184,7 +5352,9 @@
   unittest.group('obj-schema-ResumeProposalRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResumeProposalRequest();
-      var od = api.ResumeProposalRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResumeProposalRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResumeProposalRequest(od as api.ResumeProposalRequest);
     });
   });
@@ -5192,7 +5362,9 @@
   unittest.group('obj-schema-RowDimensions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRowDimensions();
-      var od = api.RowDimensions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RowDimensions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRowDimensions(od as api.RowDimensions);
     });
   });
@@ -5200,7 +5372,9 @@
   unittest.group('obj-schema-SecurityContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecurityContext();
-      var od = api.SecurityContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SecurityContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSecurityContext(od as api.SecurityContext);
     });
   });
@@ -5208,7 +5382,9 @@
   unittest.group('obj-schema-Seller', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeller();
-      var od = api.Seller.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Seller.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSeller(od as api.Seller);
     });
   });
@@ -5216,7 +5392,9 @@
   unittest.group('obj-schema-ServingContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServingContext();
-      var od = api.ServingContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServingContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServingContext(od as api.ServingContext);
     });
   });
@@ -5224,7 +5402,9 @@
   unittest.group('obj-schema-ServingRestriction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServingRestriction();
-      var od = api.ServingRestriction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServingRestriction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServingRestriction(od as api.ServingRestriction);
     });
   });
@@ -5232,7 +5412,8 @@
   unittest.group('obj-schema-Size', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSize();
-      var od = api.Size.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Size.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSize(od as api.Size);
     });
   });
@@ -5240,7 +5421,9 @@
   unittest.group('obj-schema-StopWatchingCreativeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStopWatchingCreativeRequest();
-      var od = api.StopWatchingCreativeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StopWatchingCreativeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStopWatchingCreativeRequest(od as api.StopWatchingCreativeRequest);
     });
   });
@@ -5248,7 +5431,9 @@
   unittest.group('obj-schema-TargetingCriteria', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingCriteria();
-      var od = api.TargetingCriteria.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingCriteria.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingCriteria(od as api.TargetingCriteria);
     });
   });
@@ -5256,7 +5441,9 @@
   unittest.group('obj-schema-TargetingValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTargetingValue();
-      var od = api.TargetingValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TargetingValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTargetingValue(od as api.TargetingValue);
     });
   });
@@ -5264,7 +5451,9 @@
   unittest.group('obj-schema-TechnologyTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTechnologyTargeting();
-      var od = api.TechnologyTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TechnologyTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTechnologyTargeting(od as api.TechnologyTargeting);
     });
   });
@@ -5272,7 +5461,9 @@
   unittest.group('obj-schema-TimeInterval', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeInterval();
-      var od = api.TimeInterval.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TimeInterval.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTimeInterval(od as api.TimeInterval);
     });
   });
@@ -5280,7 +5471,9 @@
   unittest.group('obj-schema-TimeOfDay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimeOfDay();
-      var od = api.TimeOfDay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimeOfDay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimeOfDay(od as api.TimeOfDay);
     });
   });
@@ -5288,7 +5481,9 @@
   unittest.group('obj-schema-UrlTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUrlTargeting();
-      var od = api.UrlTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UrlTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUrlTargeting(od as api.UrlTargeting);
     });
   });
@@ -5296,7 +5491,9 @@
   unittest.group('obj-schema-VideoContent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoContent();
-      var od = api.VideoContent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoContent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoContent(od as api.VideoContent);
     });
   });
@@ -5304,7 +5501,9 @@
   unittest.group('obj-schema-VideoTargeting', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoTargeting();
-      var od = api.VideoTargeting.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoTargeting.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoTargeting(od as api.VideoTargeting);
     });
   });
@@ -5312,7 +5511,9 @@
   unittest.group('obj-schema-WatchCreativeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWatchCreativeRequest();
-      var od = api.WatchCreativeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WatchCreativeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWatchCreativeRequest(od as api.WatchCreativeRequest);
     });
   });
diff --git a/generated/googleapis_beta/test/alertcenter/v1beta1_test.dart b/generated/googleapis_beta/test/alertcenter/v1beta1_test.dart
index 1accd0f..6215243 100644
--- a/generated/googleapis_beta/test/alertcenter/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/alertcenter/v1beta1_test.dart
@@ -1895,7 +1895,9 @@
   unittest.group('obj-schema-AccountWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccountWarning();
-      var od = api.AccountWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AccountWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccountWarning(od as api.AccountWarning);
     });
   });
@@ -1903,7 +1905,9 @@
   unittest.group('obj-schema-ActivityRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivityRule();
-      var od = api.ActivityRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivityRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivityRule(od as api.ActivityRule);
     });
   });
@@ -1911,7 +1915,8 @@
   unittest.group('obj-schema-Alert', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAlert();
-      var od = api.Alert.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Alert.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAlert(od as api.Alert);
     });
   });
@@ -1919,7 +1924,9 @@
   unittest.group('obj-schema-AlertFeedback', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAlertFeedback();
-      var od = api.AlertFeedback.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AlertFeedback.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAlertFeedback(od as api.AlertFeedback);
     });
   });
@@ -1927,7 +1934,9 @@
   unittest.group('obj-schema-AlertMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAlertMetadata();
-      var od = api.AlertMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AlertMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAlertMetadata(od as api.AlertMetadata);
     });
   });
@@ -1935,7 +1944,9 @@
   unittest.group('obj-schema-AppMakerSqlSetupNotification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppMakerSqlSetupNotification();
-      var od = api.AppMakerSqlSetupNotification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppMakerSqlSetupNotification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppMakerSqlSetupNotification(od as api.AppMakerSqlSetupNotification);
     });
   });
@@ -1943,7 +1954,9 @@
   unittest.group('obj-schema-Attachment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttachment();
-      var od = api.Attachment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Attachment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAttachment(od as api.Attachment);
     });
   });
@@ -1951,7 +1964,9 @@
   unittest.group('obj-schema-BadWhitelist', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBadWhitelist();
-      var od = api.BadWhitelist.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BadWhitelist.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBadWhitelist(od as api.BadWhitelist);
     });
   });
@@ -1959,7 +1974,9 @@
   unittest.group('obj-schema-BatchDeleteAlertsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchDeleteAlertsRequest();
-      var od = api.BatchDeleteAlertsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchDeleteAlertsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchDeleteAlertsRequest(od as api.BatchDeleteAlertsRequest);
     });
   });
@@ -1967,7 +1984,9 @@
   unittest.group('obj-schema-BatchDeleteAlertsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchDeleteAlertsResponse();
-      var od = api.BatchDeleteAlertsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchDeleteAlertsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchDeleteAlertsResponse(od as api.BatchDeleteAlertsResponse);
     });
   });
@@ -1975,7 +1994,9 @@
   unittest.group('obj-schema-BatchUndeleteAlertsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUndeleteAlertsRequest();
-      var od = api.BatchUndeleteAlertsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUndeleteAlertsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUndeleteAlertsRequest(od as api.BatchUndeleteAlertsRequest);
     });
   });
@@ -1983,7 +2004,9 @@
   unittest.group('obj-schema-BatchUndeleteAlertsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUndeleteAlertsResponse();
-      var od = api.BatchUndeleteAlertsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUndeleteAlertsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUndeleteAlertsResponse(od as api.BatchUndeleteAlertsResponse);
     });
   });
@@ -1991,7 +2014,9 @@
   unittest.group('obj-schema-CloudPubsubTopic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudPubsubTopic();
-      var od = api.CloudPubsubTopic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudPubsubTopic.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudPubsubTopic(od as api.CloudPubsubTopic);
     });
   });
@@ -1999,7 +2024,8 @@
   unittest.group('obj-schema-Csv', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCsv();
-      var od = api.Csv.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Csv.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCsv(od as api.Csv);
     });
   });
@@ -2007,7 +2033,9 @@
   unittest.group('obj-schema-CsvRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCsvRow();
-      var od = api.CsvRow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CsvRow.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCsvRow(od as api.CsvRow);
     });
   });
@@ -2015,7 +2043,9 @@
   unittest.group('obj-schema-DeviceCompromised', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceCompromised();
-      var od = api.DeviceCompromised.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceCompromised.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceCompromised(od as api.DeviceCompromised);
     });
   });
@@ -2023,7 +2053,9 @@
   unittest.group('obj-schema-DeviceCompromisedSecurityDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceCompromisedSecurityDetail();
-      var od = api.DeviceCompromisedSecurityDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceCompromisedSecurityDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceCompromisedSecurityDetail(
           od as api.DeviceCompromisedSecurityDetail);
     });
@@ -2032,7 +2064,9 @@
   unittest.group('obj-schema-DlpRuleViolation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDlpRuleViolation();
-      var od = api.DlpRuleViolation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DlpRuleViolation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDlpRuleViolation(od as api.DlpRuleViolation);
     });
   });
@@ -2040,7 +2074,9 @@
   unittest.group('obj-schema-DomainId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainId();
-      var od = api.DomainId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DomainId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDomainId(od as api.DomainId);
     });
   });
@@ -2048,7 +2084,9 @@
   unittest.group('obj-schema-DomainWideTakeoutInitiated', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDomainWideTakeoutInitiated();
-      var od = api.DomainWideTakeoutInitiated.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DomainWideTakeoutInitiated.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDomainWideTakeoutInitiated(od as api.DomainWideTakeoutInitiated);
     });
   });
@@ -2056,7 +2094,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2064,7 +2103,9 @@
   unittest.group('obj-schema-GmailMessageInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGmailMessageInfo();
-      var od = api.GmailMessageInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GmailMessageInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGmailMessageInfo(od as api.GmailMessageInfo);
     });
   });
@@ -2072,7 +2113,9 @@
   unittest.group('obj-schema-GoogleOperations', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleOperations();
-      var od = api.GoogleOperations.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleOperations.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleOperations(od as api.GoogleOperations);
     });
   });
@@ -2080,7 +2123,9 @@
   unittest.group('obj-schema-ListAlertFeedbackResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAlertFeedbackResponse();
-      var od = api.ListAlertFeedbackResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAlertFeedbackResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAlertFeedbackResponse(od as api.ListAlertFeedbackResponse);
     });
   });
@@ -2088,7 +2133,9 @@
   unittest.group('obj-schema-ListAlertsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAlertsResponse();
-      var od = api.ListAlertsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAlertsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAlertsResponse(od as api.ListAlertsResponse);
     });
   });
@@ -2096,7 +2143,9 @@
   unittest.group('obj-schema-LoginDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLoginDetails();
-      var od = api.LoginDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LoginDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLoginDetails(od as api.LoginDetails);
     });
   });
@@ -2104,7 +2153,9 @@
   unittest.group('obj-schema-MailPhishing', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMailPhishing();
-      var od = api.MailPhishing.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MailPhishing.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMailPhishing(od as api.MailPhishing);
     });
   });
@@ -2112,7 +2163,9 @@
   unittest.group('obj-schema-MaliciousEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaliciousEntity();
-      var od = api.MaliciousEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaliciousEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaliciousEntity(od as api.MaliciousEntity);
     });
   });
@@ -2120,7 +2173,9 @@
   unittest.group('obj-schema-MatchInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMatchInfo();
-      var od = api.MatchInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MatchInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMatchInfo(od as api.MatchInfo);
     });
   });
@@ -2128,7 +2183,9 @@
   unittest.group('obj-schema-Notification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNotification();
-      var od = api.Notification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Notification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNotification(od as api.Notification);
     });
   });
@@ -2136,7 +2193,9 @@
   unittest.group('obj-schema-PhishingSpike', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPhishingSpike();
-      var od = api.PhishingSpike.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PhishingSpike.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPhishingSpike(od as api.PhishingSpike);
     });
   });
@@ -2144,7 +2203,9 @@
   unittest.group('obj-schema-PredefinedDetectorInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPredefinedDetectorInfo();
-      var od = api.PredefinedDetectorInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PredefinedDetectorInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPredefinedDetectorInfo(od as api.PredefinedDetectorInfo);
     });
   });
@@ -2152,7 +2213,9 @@
   unittest.group('obj-schema-RequestInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRequestInfo();
-      var od = api.RequestInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RequestInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRequestInfo(od as api.RequestInfo);
     });
   });
@@ -2160,7 +2223,9 @@
   unittest.group('obj-schema-ResourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceInfo();
-      var od = api.ResourceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceInfo(od as api.ResourceInfo);
     });
   });
@@ -2168,7 +2233,9 @@
   unittest.group('obj-schema-RuleInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRuleInfo();
-      var od = api.RuleInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RuleInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRuleInfo(od as api.RuleInfo);
     });
   });
@@ -2176,7 +2243,9 @@
   unittest.group('obj-schema-RuleViolationInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRuleViolationInfo();
-      var od = api.RuleViolationInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RuleViolationInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRuleViolationInfo(od as api.RuleViolationInfo);
     });
   });
@@ -2184,7 +2253,9 @@
   unittest.group('obj-schema-Settings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettings();
-      var od = api.Settings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Settings.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSettings(od as api.Settings);
     });
   });
@@ -2192,7 +2263,9 @@
   unittest.group('obj-schema-StateSponsoredAttack', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStateSponsoredAttack();
-      var od = api.StateSponsoredAttack.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StateSponsoredAttack.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStateSponsoredAttack(od as api.StateSponsoredAttack);
     });
   });
@@ -2200,7 +2273,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2208,7 +2283,9 @@
   unittest.group('obj-schema-SuspiciousActivity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuspiciousActivity();
-      var od = api.SuspiciousActivity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuspiciousActivity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuspiciousActivity(od as api.SuspiciousActivity);
     });
   });
@@ -2216,7 +2293,9 @@
   unittest.group('obj-schema-SuspiciousActivitySecurityDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuspiciousActivitySecurityDetail();
-      var od = api.SuspiciousActivitySecurityDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuspiciousActivitySecurityDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuspiciousActivitySecurityDetail(
           od as api.SuspiciousActivitySecurityDetail);
     });
@@ -2225,7 +2304,9 @@
   unittest.group('obj-schema-UndeleteAlertRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUndeleteAlertRequest();
-      var od = api.UndeleteAlertRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UndeleteAlertRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUndeleteAlertRequest(od as api.UndeleteAlertRequest);
     });
   });
@@ -2233,7 +2314,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
@@ -2241,7 +2323,9 @@
   unittest.group('obj-schema-UserDefinedDetectorInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUserDefinedDetectorInfo();
-      var od = api.UserDefinedDetectorInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UserDefinedDetectorInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUserDefinedDetectorInfo(od as api.UserDefinedDetectorInfo);
     });
   });
diff --git a/generated/googleapis_beta/test/analyticsadmin/v1alpha_test.dart b/generated/googleapis_beta/test/analyticsadmin/v1alpha_test.dart
index 9805a7e..ea7e3d4 100644
--- a/generated/googleapis_beta/test/analyticsadmin/v1alpha_test.dart
+++ b/generated/googleapis_beta/test/analyticsadmin/v1alpha_test.dart
@@ -1560,7 +1560,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaAccount();
-      var od = api.GoogleAnalyticsAdminV1alphaAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaAccount(
           od as api.GoogleAnalyticsAdminV1alphaAccount);
     });
@@ -1569,8 +1571,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaAccountSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaAccountSummary();
-      var od =
-          api.GoogleAnalyticsAdminV1alphaAccountSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaAccountSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaAccountSummary(
           od as api.GoogleAnalyticsAdminV1alphaAccountSummary);
     });
@@ -1580,8 +1583,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaAndroidAppDataStream();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaAndroidAppDataStream.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaAndroidAppDataStream(
           od as api.GoogleAnalyticsAdminV1alphaAndroidAppDataStream);
     });
@@ -1590,8 +1594,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaAuditUserLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaAuditUserLink();
-      var od =
-          api.GoogleAnalyticsAdminV1alphaAuditUserLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaAuditUserLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaAuditUserLink(
           od as api.GoogleAnalyticsAdminV1alphaAuditUserLink);
     });
@@ -1601,8 +1606,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaAuditUserLinksRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaAuditUserLinksRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaAuditUserLinksRequest(
           od as api.GoogleAnalyticsAdminV1alphaAuditUserLinksRequest);
     });
@@ -1612,8 +1618,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaAuditUserLinksResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaAuditUserLinksResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaAuditUserLinksResponse(
           od as api.GoogleAnalyticsAdminV1alphaAuditUserLinksResponse);
     });
@@ -1623,9 +1630,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaBatchCreateUserLinksRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaBatchCreateUserLinksRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaBatchCreateUserLinksRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaBatchCreateUserLinksRequest(
           od as api.GoogleAnalyticsAdminV1alphaBatchCreateUserLinksRequest);
     });
@@ -1635,9 +1643,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaBatchCreateUserLinksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaBatchCreateUserLinksResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaBatchCreateUserLinksResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaBatchCreateUserLinksResponse(
           od as api.GoogleAnalyticsAdminV1alphaBatchCreateUserLinksResponse);
     });
@@ -1647,9 +1656,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaBatchDeleteUserLinksRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaBatchDeleteUserLinksRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaBatchDeleteUserLinksRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaBatchDeleteUserLinksRequest(
           od as api.GoogleAnalyticsAdminV1alphaBatchDeleteUserLinksRequest);
     });
@@ -1659,9 +1669,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaBatchGetUserLinksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaBatchGetUserLinksResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaBatchGetUserLinksResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaBatchGetUserLinksResponse(
           od as api.GoogleAnalyticsAdminV1alphaBatchGetUserLinksResponse);
     });
@@ -1671,9 +1682,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaBatchUpdateUserLinksRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaBatchUpdateUserLinksRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaBatchUpdateUserLinksRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaBatchUpdateUserLinksRequest(
           od as api.GoogleAnalyticsAdminV1alphaBatchUpdateUserLinksRequest);
     });
@@ -1683,9 +1695,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaBatchUpdateUserLinksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaBatchUpdateUserLinksResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaBatchUpdateUserLinksResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaBatchUpdateUserLinksResponse(
           od as api.GoogleAnalyticsAdminV1alphaBatchUpdateUserLinksResponse);
     });
@@ -1695,8 +1708,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaCreateUserLinkRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaCreateUserLinkRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaCreateUserLinkRequest(
           od as api.GoogleAnalyticsAdminV1alphaCreateUserLinkRequest);
     });
@@ -1706,8 +1720,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaDataSharingSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaDataSharingSettings.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaDataSharingSettings(
           od as api.GoogleAnalyticsAdminV1alphaDataSharingSettings);
     });
@@ -1717,8 +1732,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaDeleteUserLinkRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaDeleteUserLinkRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaDeleteUserLinkRequest(
           od as api.GoogleAnalyticsAdminV1alphaDeleteUserLinkRequest);
     });
@@ -1728,9 +1744,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaEnhancedMeasurementSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaEnhancedMeasurementSettings();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaEnhancedMeasurementSettings.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaEnhancedMeasurementSettings(
           od as api.GoogleAnalyticsAdminV1alphaEnhancedMeasurementSettings);
     });
@@ -1739,7 +1756,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaFirebaseLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaFirebaseLink();
-      var od = api.GoogleAnalyticsAdminV1alphaFirebaseLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaFirebaseLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaFirebaseLink(
           od as api.GoogleAnalyticsAdminV1alphaFirebaseLink);
     });
@@ -1748,8 +1767,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaGlobalSiteTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaGlobalSiteTag();
-      var od =
-          api.GoogleAnalyticsAdminV1alphaGlobalSiteTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaGlobalSiteTag.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaGlobalSiteTag(
           od as api.GoogleAnalyticsAdminV1alphaGlobalSiteTag);
     });
@@ -1758,8 +1778,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaGoogleAdsLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaGoogleAdsLink();
-      var od =
-          api.GoogleAnalyticsAdminV1alphaGoogleAdsLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaGoogleAdsLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaGoogleAdsLink(
           od as api.GoogleAnalyticsAdminV1alphaGoogleAdsLink);
     });
@@ -1768,8 +1789,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaIosAppDataStream', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaIosAppDataStream();
-      var od =
-          api.GoogleAnalyticsAdminV1alphaIosAppDataStream.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaIosAppDataStream.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaIosAppDataStream(
           od as api.GoogleAnalyticsAdminV1alphaIosAppDataStream);
     });
@@ -1779,9 +1801,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaListAccountSummariesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaListAccountSummariesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaListAccountSummariesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaListAccountSummariesResponse(
           od as api.GoogleAnalyticsAdminV1alphaListAccountSummariesResponse);
     });
@@ -1791,8 +1814,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaListAccountsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaListAccountsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaListAccountsResponse(
           od as api.GoogleAnalyticsAdminV1alphaListAccountsResponse);
     });
@@ -1804,8 +1828,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleAnalyticsAdminV1alphaListAndroidAppDataStreamsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaListAndroidAppDataStreamsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaListAndroidAppDataStreamsResponse(od
           as api.GoogleAnalyticsAdminV1alphaListAndroidAppDataStreamsResponse);
     });
@@ -1815,9 +1840,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaListFirebaseLinksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaListFirebaseLinksResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaListFirebaseLinksResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaListFirebaseLinksResponse(
           od as api.GoogleAnalyticsAdminV1alphaListFirebaseLinksResponse);
     });
@@ -1827,9 +1853,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaListGoogleAdsLinksResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaListGoogleAdsLinksResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaListGoogleAdsLinksResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaListGoogleAdsLinksResponse(
           od as api.GoogleAnalyticsAdminV1alphaListGoogleAdsLinksResponse);
     });
@@ -1840,9 +1867,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaListIosAppDataStreamsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaListIosAppDataStreamsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaListIosAppDataStreamsResponse(
           od as api.GoogleAnalyticsAdminV1alphaListIosAppDataStreamsResponse);
     });
@@ -1852,8 +1880,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaListPropertiesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaListPropertiesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaListPropertiesResponse(
           od as api.GoogleAnalyticsAdminV1alphaListPropertiesResponse);
     });
@@ -1863,8 +1892,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaListUserLinksResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaListUserLinksResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaListUserLinksResponse(
           od as api.GoogleAnalyticsAdminV1alphaListUserLinksResponse);
     });
@@ -1874,9 +1904,10 @@
       'obj-schema-GoogleAnalyticsAdminV1alphaListWebDataStreamsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaListWebDataStreamsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaListWebDataStreamsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaListWebDataStreamsResponse(
           od as api.GoogleAnalyticsAdminV1alphaListWebDataStreamsResponse);
     });
@@ -1885,7 +1916,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaProperty();
-      var od = api.GoogleAnalyticsAdminV1alphaProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaProperty(
           od as api.GoogleAnalyticsAdminV1alphaProperty);
     });
@@ -1894,8 +1927,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaPropertySummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaPropertySummary();
-      var od =
-          api.GoogleAnalyticsAdminV1alphaPropertySummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaPropertySummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaPropertySummary(
           od as api.GoogleAnalyticsAdminV1alphaPropertySummary);
     });
@@ -1906,9 +1940,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaProvisionAccountTicketRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleAnalyticsAdminV1alphaProvisionAccountTicketRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaProvisionAccountTicketRequest(
           od as api.GoogleAnalyticsAdminV1alphaProvisionAccountTicketRequest);
     });
@@ -1919,8 +1954,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaProvisionAccountTicketResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaProvisionAccountTicketResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaProvisionAccountTicketResponse(
           od as api.GoogleAnalyticsAdminV1alphaProvisionAccountTicketResponse);
     });
@@ -1930,8 +1966,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaUpdateUserLinkRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleAnalyticsAdminV1alphaUpdateUserLinkRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaUpdateUserLinkRequest(
           od as api.GoogleAnalyticsAdminV1alphaUpdateUserLinkRequest);
     });
@@ -1940,7 +1977,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaUserLink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaUserLink();
-      var od = api.GoogleAnalyticsAdminV1alphaUserLink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaUserLink.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaUserLink(
           od as api.GoogleAnalyticsAdminV1alphaUserLink);
     });
@@ -1949,8 +1988,9 @@
   unittest.group('obj-schema-GoogleAnalyticsAdminV1alphaWebDataStream', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleAnalyticsAdminV1alphaWebDataStream();
-      var od =
-          api.GoogleAnalyticsAdminV1alphaWebDataStream.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleAnalyticsAdminV1alphaWebDataStream.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleAnalyticsAdminV1alphaWebDataStream(
           od as api.GoogleAnalyticsAdminV1alphaWebDataStream);
     });
@@ -1959,7 +1999,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
diff --git a/generated/googleapis_beta/test/analyticsdata/v1alpha_test.dart b/generated/googleapis_beta/test/analyticsdata/v1alpha_test.dart
index 0f9a5b5..b9cd483 100644
--- a/generated/googleapis_beta/test/analyticsdata/v1alpha_test.dart
+++ b/generated/googleapis_beta/test/analyticsdata/v1alpha_test.dart
@@ -2016,7 +2016,9 @@
   unittest.group('obj-schema-BatchRunPivotReportsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchRunPivotReportsRequest();
-      var od = api.BatchRunPivotReportsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchRunPivotReportsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchRunPivotReportsRequest(od as api.BatchRunPivotReportsRequest);
     });
   });
@@ -2024,7 +2026,9 @@
   unittest.group('obj-schema-BatchRunPivotReportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchRunPivotReportsResponse();
-      var od = api.BatchRunPivotReportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchRunPivotReportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchRunPivotReportsResponse(od as api.BatchRunPivotReportsResponse);
     });
   });
@@ -2032,7 +2036,9 @@
   unittest.group('obj-schema-BatchRunReportsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchRunReportsRequest();
-      var od = api.BatchRunReportsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchRunReportsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchRunReportsRequest(od as api.BatchRunReportsRequest);
     });
   });
@@ -2040,7 +2046,9 @@
   unittest.group('obj-schema-BatchRunReportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchRunReportsResponse();
-      var od = api.BatchRunReportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchRunReportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchRunReportsResponse(od as api.BatchRunReportsResponse);
     });
   });
@@ -2048,7 +2056,9 @@
   unittest.group('obj-schema-BetweenFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBetweenFilter();
-      var od = api.BetweenFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BetweenFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBetweenFilter(od as api.BetweenFilter);
     });
   });
@@ -2056,7 +2066,9 @@
   unittest.group('obj-schema-CaseExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCaseExpression();
-      var od = api.CaseExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CaseExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCaseExpression(od as api.CaseExpression);
     });
   });
@@ -2064,7 +2076,9 @@
   unittest.group('obj-schema-Cohort', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCohort();
-      var od = api.Cohort.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Cohort.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCohort(od as api.Cohort);
     });
   });
@@ -2072,7 +2086,9 @@
   unittest.group('obj-schema-CohortReportSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCohortReportSettings();
-      var od = api.CohortReportSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CohortReportSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCohortReportSettings(od as api.CohortReportSettings);
     });
   });
@@ -2080,7 +2096,9 @@
   unittest.group('obj-schema-CohortSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCohortSpec();
-      var od = api.CohortSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CohortSpec.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCohortSpec(od as api.CohortSpec);
     });
   });
@@ -2088,7 +2106,9 @@
   unittest.group('obj-schema-CohortsRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCohortsRange();
-      var od = api.CohortsRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CohortsRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCohortsRange(od as api.CohortsRange);
     });
   });
@@ -2096,7 +2116,9 @@
   unittest.group('obj-schema-ConcatenateExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConcatenateExpression();
-      var od = api.ConcatenateExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConcatenateExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConcatenateExpression(od as api.ConcatenateExpression);
     });
   });
@@ -2104,7 +2126,9 @@
   unittest.group('obj-schema-DateRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDateRange();
-      var od = api.DateRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DateRange.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDateRange(od as api.DateRange);
     });
   });
@@ -2112,7 +2136,9 @@
   unittest.group('obj-schema-Dimension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimension();
-      var od = api.Dimension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Dimension.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDimension(od as api.Dimension);
     });
   });
@@ -2120,7 +2146,9 @@
   unittest.group('obj-schema-DimensionExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionExpression();
-      var od = api.DimensionExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionExpression(od as api.DimensionExpression);
     });
   });
@@ -2128,7 +2156,9 @@
   unittest.group('obj-schema-DimensionHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionHeader();
-      var od = api.DimensionHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionHeader(od as api.DimensionHeader);
     });
   });
@@ -2136,7 +2166,9 @@
   unittest.group('obj-schema-DimensionMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionMetadata();
-      var od = api.DimensionMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionMetadata(od as api.DimensionMetadata);
     });
   });
@@ -2144,7 +2176,9 @@
   unittest.group('obj-schema-DimensionOrderBy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionOrderBy();
-      var od = api.DimensionOrderBy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionOrderBy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionOrderBy(od as api.DimensionOrderBy);
     });
   });
@@ -2152,7 +2186,9 @@
   unittest.group('obj-schema-DimensionValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDimensionValue();
-      var od = api.DimensionValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DimensionValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDimensionValue(od as api.DimensionValue);
     });
   });
@@ -2160,7 +2196,9 @@
   unittest.group('obj-schema-Entity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEntity();
-      var od = api.Entity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Entity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEntity(od as api.Entity);
     });
   });
@@ -2168,7 +2206,9 @@
   unittest.group('obj-schema-Filter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilter();
-      var od = api.Filter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Filter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFilter(od as api.Filter);
     });
   });
@@ -2176,7 +2216,9 @@
   unittest.group('obj-schema-FilterExpression', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterExpression();
-      var od = api.FilterExpression.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterExpression.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterExpression(od as api.FilterExpression);
     });
   });
@@ -2184,7 +2226,9 @@
   unittest.group('obj-schema-FilterExpressionList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFilterExpressionList();
-      var od = api.FilterExpressionList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FilterExpressionList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFilterExpressionList(od as api.FilterExpressionList);
     });
   });
@@ -2192,7 +2236,9 @@
   unittest.group('obj-schema-InListFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInListFilter();
-      var od = api.InListFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InListFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInListFilter(od as api.InListFilter);
     });
   });
@@ -2200,7 +2246,9 @@
   unittest.group('obj-schema-Metadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadata();
-      var od = api.Metadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metadata.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetadata(od as api.Metadata);
     });
   });
@@ -2208,7 +2256,9 @@
   unittest.group('obj-schema-Metric', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetric();
-      var od = api.Metric.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metric.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetric(od as api.Metric);
     });
   });
@@ -2216,7 +2266,9 @@
   unittest.group('obj-schema-MetricHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricHeader();
-      var od = api.MetricHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricHeader(od as api.MetricHeader);
     });
   });
@@ -2224,7 +2276,9 @@
   unittest.group('obj-schema-MetricMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricMetadata();
-      var od = api.MetricMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricMetadata(od as api.MetricMetadata);
     });
   });
@@ -2232,7 +2286,9 @@
   unittest.group('obj-schema-MetricOrderBy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricOrderBy();
-      var od = api.MetricOrderBy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricOrderBy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricOrderBy(od as api.MetricOrderBy);
     });
   });
@@ -2240,7 +2296,9 @@
   unittest.group('obj-schema-MetricValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricValue();
-      var od = api.MetricValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricValue(od as api.MetricValue);
     });
   });
@@ -2248,7 +2306,9 @@
   unittest.group('obj-schema-NumericFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNumericFilter();
-      var od = api.NumericFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NumericFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNumericFilter(od as api.NumericFilter);
     });
   });
@@ -2256,7 +2316,9 @@
   unittest.group('obj-schema-NumericValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNumericValue();
-      var od = api.NumericValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NumericValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNumericValue(od as api.NumericValue);
     });
   });
@@ -2264,7 +2326,9 @@
   unittest.group('obj-schema-OrderBy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOrderBy();
-      var od = api.OrderBy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OrderBy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOrderBy(od as api.OrderBy);
     });
   });
@@ -2272,7 +2336,8 @@
   unittest.group('obj-schema-Pivot', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivot();
-      var od = api.Pivot.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Pivot.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPivot(od as api.Pivot);
     });
   });
@@ -2280,7 +2345,9 @@
   unittest.group('obj-schema-PivotDimensionHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotDimensionHeader();
-      var od = api.PivotDimensionHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotDimensionHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotDimensionHeader(od as api.PivotDimensionHeader);
     });
   });
@@ -2288,7 +2355,9 @@
   unittest.group('obj-schema-PivotHeader', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotHeader();
-      var od = api.PivotHeader.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotHeader.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotHeader(od as api.PivotHeader);
     });
   });
@@ -2296,7 +2365,9 @@
   unittest.group('obj-schema-PivotOrderBy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotOrderBy();
-      var od = api.PivotOrderBy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotOrderBy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotOrderBy(od as api.PivotOrderBy);
     });
   });
@@ -2304,7 +2375,9 @@
   unittest.group('obj-schema-PivotSelection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPivotSelection();
-      var od = api.PivotSelection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PivotSelection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPivotSelection(od as api.PivotSelection);
     });
   });
@@ -2312,7 +2385,9 @@
   unittest.group('obj-schema-PropertyQuota', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPropertyQuota();
-      var od = api.PropertyQuota.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PropertyQuota.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPropertyQuota(od as api.PropertyQuota);
     });
   });
@@ -2320,7 +2395,9 @@
   unittest.group('obj-schema-QuotaStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaStatus();
-      var od = api.QuotaStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QuotaStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQuotaStatus(od as api.QuotaStatus);
     });
   });
@@ -2328,7 +2405,9 @@
   unittest.group('obj-schema-ResponseMetaData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResponseMetaData();
-      var od = api.ResponseMetaData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResponseMetaData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResponseMetaData(od as api.ResponseMetaData);
     });
   });
@@ -2336,7 +2415,8 @@
   unittest.group('obj-schema-Row', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRow();
-      var od = api.Row.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Row.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRow(od as api.Row);
     });
   });
@@ -2344,7 +2424,9 @@
   unittest.group('obj-schema-RunPivotReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunPivotReportRequest();
-      var od = api.RunPivotReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunPivotReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunPivotReportRequest(od as api.RunPivotReportRequest);
     });
   });
@@ -2352,7 +2434,9 @@
   unittest.group('obj-schema-RunPivotReportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunPivotReportResponse();
-      var od = api.RunPivotReportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunPivotReportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunPivotReportResponse(od as api.RunPivotReportResponse);
     });
   });
@@ -2360,7 +2444,9 @@
   unittest.group('obj-schema-RunRealtimeReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunRealtimeReportRequest();
-      var od = api.RunRealtimeReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunRealtimeReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunRealtimeReportRequest(od as api.RunRealtimeReportRequest);
     });
   });
@@ -2368,7 +2454,9 @@
   unittest.group('obj-schema-RunRealtimeReportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunRealtimeReportResponse();
-      var od = api.RunRealtimeReportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunRealtimeReportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunRealtimeReportResponse(od as api.RunRealtimeReportResponse);
     });
   });
@@ -2376,7 +2464,9 @@
   unittest.group('obj-schema-RunReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunReportRequest();
-      var od = api.RunReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunReportRequest(od as api.RunReportRequest);
     });
   });
@@ -2384,7 +2474,9 @@
   unittest.group('obj-schema-RunReportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunReportResponse();
-      var od = api.RunReportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunReportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunReportResponse(od as api.RunReportResponse);
     });
   });
@@ -2392,7 +2484,9 @@
   unittest.group('obj-schema-StringFilter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStringFilter();
-      var od = api.StringFilter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StringFilter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStringFilter(od as api.StringFilter);
     });
   });
diff --git a/generated/googleapis_beta/test/area120tables/v1alpha1_test.dart b/generated/googleapis_beta/test/area120tables/v1alpha1_test.dart
index 0923b1c..48fbf4a 100644
--- a/generated/googleapis_beta/test/area120tables/v1alpha1_test.dart
+++ b/generated/googleapis_beta/test/area120tables/v1alpha1_test.dart
@@ -693,7 +693,9 @@
   unittest.group('obj-schema-BatchCreateRowsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateRowsRequest();
-      var od = api.BatchCreateRowsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateRowsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateRowsRequest(od as api.BatchCreateRowsRequest);
     });
   });
@@ -701,7 +703,9 @@
   unittest.group('obj-schema-BatchCreateRowsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateRowsResponse();
-      var od = api.BatchCreateRowsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateRowsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateRowsResponse(od as api.BatchCreateRowsResponse);
     });
   });
@@ -709,7 +713,9 @@
   unittest.group('obj-schema-BatchDeleteRowsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchDeleteRowsRequest();
-      var od = api.BatchDeleteRowsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchDeleteRowsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchDeleteRowsRequest(od as api.BatchDeleteRowsRequest);
     });
   });
@@ -717,7 +723,9 @@
   unittest.group('obj-schema-BatchUpdateRowsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateRowsRequest();
-      var od = api.BatchUpdateRowsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateRowsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateRowsRequest(od as api.BatchUpdateRowsRequest);
     });
   });
@@ -725,7 +733,9 @@
   unittest.group('obj-schema-BatchUpdateRowsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchUpdateRowsResponse();
-      var od = api.BatchUpdateRowsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchUpdateRowsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchUpdateRowsResponse(od as api.BatchUpdateRowsResponse);
     });
   });
@@ -733,7 +743,9 @@
   unittest.group('obj-schema-ColumnDescription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColumnDescription();
-      var od = api.ColumnDescription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ColumnDescription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkColumnDescription(od as api.ColumnDescription);
     });
   });
@@ -741,7 +753,9 @@
   unittest.group('obj-schema-CreateRowRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateRowRequest();
-      var od = api.CreateRowRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateRowRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateRowRequest(od as api.CreateRowRequest);
     });
   });
@@ -749,7 +763,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -757,7 +772,9 @@
   unittest.group('obj-schema-LabeledItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLabeledItem();
-      var od = api.LabeledItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LabeledItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLabeledItem(od as api.LabeledItem);
     });
   });
@@ -765,7 +782,9 @@
   unittest.group('obj-schema-ListRowsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRowsResponse();
-      var od = api.ListRowsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRowsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRowsResponse(od as api.ListRowsResponse);
     });
   });
@@ -773,7 +792,9 @@
   unittest.group('obj-schema-ListTablesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTablesResponse();
-      var od = api.ListTablesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTablesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTablesResponse(od as api.ListTablesResponse);
     });
   });
@@ -781,7 +802,9 @@
   unittest.group('obj-schema-ListWorkspacesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListWorkspacesResponse();
-      var od = api.ListWorkspacesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListWorkspacesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListWorkspacesResponse(od as api.ListWorkspacesResponse);
     });
   });
@@ -789,7 +812,9 @@
   unittest.group('obj-schema-LookupDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLookupDetails();
-      var od = api.LookupDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LookupDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLookupDetails(od as api.LookupDetails);
     });
   });
@@ -797,7 +822,9 @@
   unittest.group('obj-schema-RelationshipDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelationshipDetails();
-      var od = api.RelationshipDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RelationshipDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRelationshipDetails(od as api.RelationshipDetails);
     });
   });
@@ -805,7 +832,8 @@
   unittest.group('obj-schema-Row', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRow();
-      var od = api.Row.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Row.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRow(od as api.Row);
     });
   });
@@ -813,7 +841,8 @@
   unittest.group('obj-schema-Table', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTable();
-      var od = api.Table.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Table.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTable(od as api.Table);
     });
   });
@@ -821,7 +850,9 @@
   unittest.group('obj-schema-UpdateRowRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpdateRowRequest();
-      var od = api.UpdateRowRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpdateRowRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpdateRowRequest(od as api.UpdateRowRequest);
     });
   });
@@ -829,7 +860,9 @@
   unittest.group('obj-schema-Workspace', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkspace();
-      var od = api.Workspace.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Workspace.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWorkspace(od as api.Workspace);
     });
   });
diff --git a/generated/googleapis_beta/test/bigqueryconnection/v1beta1_test.dart b/generated/googleapis_beta/test/bigqueryconnection/v1beta1_test.dart
index 6b0f1f2..57eb6d3 100644
--- a/generated/googleapis_beta/test/bigqueryconnection/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/bigqueryconnection/v1beta1_test.dart
@@ -569,7 +569,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -577,7 +579,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -585,7 +589,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -593,7 +599,9 @@
   unittest.group('obj-schema-CloudSqlCredential', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudSqlCredential();
-      var od = api.CloudSqlCredential.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudSqlCredential.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudSqlCredential(od as api.CloudSqlCredential);
     });
   });
@@ -601,7 +609,9 @@
   unittest.group('obj-schema-CloudSqlProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudSqlProperties();
-      var od = api.CloudSqlProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudSqlProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudSqlProperties(od as api.CloudSqlProperties);
     });
   });
@@ -609,7 +619,9 @@
   unittest.group('obj-schema-Connection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConnection();
-      var od = api.Connection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Connection.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkConnection(od as api.Connection);
     });
   });
@@ -617,7 +629,9 @@
   unittest.group('obj-schema-ConnectionCredential', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConnectionCredential();
-      var od = api.ConnectionCredential.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConnectionCredential.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConnectionCredential(od as api.ConnectionCredential);
     });
   });
@@ -625,7 +639,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -633,7 +648,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -641,7 +657,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -649,7 +667,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -657,7 +677,9 @@
   unittest.group('obj-schema-ListConnectionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListConnectionsResponse();
-      var od = api.ListConnectionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListConnectionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListConnectionsResponse(od as api.ListConnectionsResponse);
     });
   });
@@ -665,7 +687,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -673,7 +697,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -681,7 +707,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -689,7 +717,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis_beta/test/clouderrorreporting/v1beta1_test.dart b/generated/googleapis_beta/test/clouderrorreporting/v1beta1_test.dart
index a924695..dcc17e2 100644
--- a/generated/googleapis_beta/test/clouderrorreporting/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/clouderrorreporting/v1beta1_test.dart
@@ -582,7 +582,9 @@
   unittest.group('obj-schema-DeleteEventsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteEventsResponse();
-      var od = api.DeleteEventsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteEventsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteEventsResponse(od as api.DeleteEventsResponse);
     });
   });
@@ -590,7 +592,9 @@
   unittest.group('obj-schema-ErrorContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorContext();
-      var od = api.ErrorContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ErrorContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkErrorContext(od as api.ErrorContext);
     });
   });
@@ -598,7 +602,9 @@
   unittest.group('obj-schema-ErrorEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorEvent();
-      var od = api.ErrorEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ErrorEvent.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkErrorEvent(od as api.ErrorEvent);
     });
   });
@@ -606,7 +612,9 @@
   unittest.group('obj-schema-ErrorGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorGroup();
-      var od = api.ErrorGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ErrorGroup.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkErrorGroup(od as api.ErrorGroup);
     });
   });
@@ -614,7 +622,9 @@
   unittest.group('obj-schema-ErrorGroupStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildErrorGroupStats();
-      var od = api.ErrorGroupStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ErrorGroupStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkErrorGroupStats(od as api.ErrorGroupStats);
     });
   });
@@ -622,7 +632,9 @@
   unittest.group('obj-schema-HttpRequestContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRequestContext();
-      var od = api.HttpRequestContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpRequestContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpRequestContext(od as api.HttpRequestContext);
     });
   });
@@ -630,7 +642,9 @@
   unittest.group('obj-schema-ListEventsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListEventsResponse();
-      var od = api.ListEventsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListEventsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListEventsResponse(od as api.ListEventsResponse);
     });
   });
@@ -638,7 +652,9 @@
   unittest.group('obj-schema-ListGroupStatsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListGroupStatsResponse();
-      var od = api.ListGroupStatsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListGroupStatsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListGroupStatsResponse(od as api.ListGroupStatsResponse);
     });
   });
@@ -646,7 +662,9 @@
   unittest.group('obj-schema-ReportErrorEventResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportErrorEventResponse();
-      var od = api.ReportErrorEventResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportErrorEventResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportErrorEventResponse(od as api.ReportErrorEventResponse);
     });
   });
@@ -654,7 +672,9 @@
   unittest.group('obj-schema-ReportedErrorEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportedErrorEvent();
-      var od = api.ReportedErrorEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportedErrorEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportedErrorEvent(od as api.ReportedErrorEvent);
     });
   });
@@ -662,7 +682,9 @@
   unittest.group('obj-schema-ServiceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceContext();
-      var od = api.ServiceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceContext(od as api.ServiceContext);
     });
   });
@@ -670,7 +692,9 @@
   unittest.group('obj-schema-SourceLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceLocation();
-      var od = api.SourceLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceLocation(od as api.SourceLocation);
     });
   });
@@ -678,7 +702,9 @@
   unittest.group('obj-schema-SourceReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceReference();
-      var od = api.SourceReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceReference(od as api.SourceReference);
     });
   });
@@ -686,7 +712,9 @@
   unittest.group('obj-schema-TimedCount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimedCount();
-      var od = api.TimedCount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TimedCount.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimedCount(od as api.TimedCount);
     });
   });
@@ -694,7 +722,9 @@
   unittest.group('obj-schema-TrackingIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTrackingIssue();
-      var od = api.TrackingIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TrackingIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTrackingIssue(od as api.TrackingIssue);
     });
   });
diff --git a/generated/googleapis_beta/test/containeranalysis/v1beta1_test.dart b/generated/googleapis_beta/test/containeranalysis/v1beta1_test.dart
index 53be0fa..7fa52df 100644
--- a/generated/googleapis_beta/test/containeranalysis/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/containeranalysis/v1beta1_test.dart
@@ -3285,7 +3285,9 @@
   unittest.group('obj-schema-AliasContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAliasContext();
-      var od = api.AliasContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AliasContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAliasContext(od as api.AliasContext);
     });
   });
@@ -3293,7 +3295,9 @@
   unittest.group('obj-schema-Artifact', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArtifact();
-      var od = api.Artifact.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Artifact.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkArtifact(od as api.Artifact);
     });
   });
@@ -3301,7 +3305,9 @@
   unittest.group('obj-schema-ArtifactHashes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArtifactHashes();
-      var od = api.ArtifactHashes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ArtifactHashes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkArtifactHashes(od as api.ArtifactHashes);
     });
   });
@@ -3309,7 +3315,9 @@
   unittest.group('obj-schema-ArtifactRule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArtifactRule();
-      var od = api.ArtifactRule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ArtifactRule.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkArtifactRule(od as api.ArtifactRule);
     });
   });
@@ -3317,7 +3325,9 @@
   unittest.group('obj-schema-Attestation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttestation();
-      var od = api.Attestation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Attestation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttestation(od as api.Attestation);
     });
   });
@@ -3325,7 +3335,9 @@
   unittest.group('obj-schema-Authority', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthority();
-      var od = api.Authority.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Authority.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAuthority(od as api.Authority);
     });
   });
@@ -3333,7 +3345,8 @@
   unittest.group('obj-schema-Basis', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasis();
-      var od = api.Basis.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Basis.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBasis(od as api.Basis);
     });
   });
@@ -3341,7 +3354,9 @@
   unittest.group('obj-schema-BatchCreateNotesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateNotesRequest();
-      var od = api.BatchCreateNotesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateNotesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateNotesRequest(od as api.BatchCreateNotesRequest);
     });
   });
@@ -3349,7 +3364,9 @@
   unittest.group('obj-schema-BatchCreateNotesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateNotesResponse();
-      var od = api.BatchCreateNotesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateNotesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateNotesResponse(od as api.BatchCreateNotesResponse);
     });
   });
@@ -3357,7 +3374,9 @@
   unittest.group('obj-schema-BatchCreateOccurrencesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateOccurrencesRequest();
-      var od = api.BatchCreateOccurrencesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateOccurrencesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateOccurrencesRequest(
           od as api.BatchCreateOccurrencesRequest);
     });
@@ -3366,7 +3385,9 @@
   unittest.group('obj-schema-BatchCreateOccurrencesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreateOccurrencesResponse();
-      var od = api.BatchCreateOccurrencesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreateOccurrencesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreateOccurrencesResponse(
           od as api.BatchCreateOccurrencesResponse);
     });
@@ -3375,7 +3396,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -3383,7 +3406,8 @@
   unittest.group('obj-schema-Build', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuild();
-      var od = api.Build.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Build.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBuild(od as api.Build);
     });
   });
@@ -3391,7 +3415,9 @@
   unittest.group('obj-schema-BuildProvenance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildProvenance();
-      var od = api.BuildProvenance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildProvenance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildProvenance(od as api.BuildProvenance);
     });
   });
@@ -3399,7 +3425,9 @@
   unittest.group('obj-schema-BuildSignature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildSignature();
-      var od = api.BuildSignature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildSignature.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildSignature(od as api.BuildSignature);
     });
   });
@@ -3407,7 +3435,9 @@
   unittest.group('obj-schema-ByProducts', () {
     unittest.test('to-json--from-json', () async {
       var o = buildByProducts();
-      var od = api.ByProducts.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ByProducts.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkByProducts(od as api.ByProducts);
     });
   });
@@ -3415,7 +3445,9 @@
   unittest.group('obj-schema-CVSSv3', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCVSSv3();
-      var od = api.CVSSv3.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CVSSv3.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCVSSv3(od as api.CVSSv3);
     });
   });
@@ -3423,7 +3455,9 @@
   unittest.group('obj-schema-CloudRepoSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudRepoSourceContext();
-      var od = api.CloudRepoSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudRepoSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudRepoSourceContext(od as api.CloudRepoSourceContext);
     });
   });
@@ -3431,7 +3465,9 @@
   unittest.group('obj-schema-Command', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommand();
-      var od = api.Command.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Command.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCommand(od as api.Command);
     });
   });
@@ -3439,7 +3475,9 @@
   unittest.group('obj-schema-Deployable', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployable();
-      var od = api.Deployable.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Deployable.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeployable(od as api.Deployable);
     });
   });
@@ -3447,7 +3485,9 @@
   unittest.group('obj-schema-Deployment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeployment();
-      var od = api.Deployment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Deployment.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeployment(od as api.Deployment);
     });
   });
@@ -3455,7 +3495,9 @@
   unittest.group('obj-schema-Derived', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDerived();
-      var od = api.Derived.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Derived.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDerived(od as api.Derived);
     });
   });
@@ -3463,7 +3505,9 @@
   unittest.group('obj-schema-Detail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDetail();
-      var od = api.Detail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Detail.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDetail(od as api.Detail);
     });
   });
@@ -3471,7 +3515,9 @@
   unittest.group('obj-schema-Details', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDetails();
-      var od = api.Details.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Details.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDetails(od as api.Details);
     });
   });
@@ -3479,7 +3525,9 @@
   unittest.group('obj-schema-Discovered', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiscovered();
-      var od = api.Discovered.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Discovered.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDiscovered(od as api.Discovered);
     });
   });
@@ -3487,7 +3535,9 @@
   unittest.group('obj-schema-Discovery', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiscovery();
-      var od = api.Discovery.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Discovery.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDiscovery(od as api.Discovery);
     });
   });
@@ -3495,7 +3545,9 @@
   unittest.group('obj-schema-Distribution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDistribution();
-      var od = api.Distribution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Distribution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDistribution(od as api.Distribution);
     });
   });
@@ -3503,7 +3555,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -3511,7 +3564,9 @@
   unittest.group('obj-schema-Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironment();
-      var od = api.Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironment(od as api.Environment);
     });
   });
@@ -3519,7 +3574,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -3527,7 +3583,9 @@
   unittest.group('obj-schema-FileHashes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileHashes();
-      var od = api.FileHashes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FileHashes.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFileHashes(od as api.FileHashes);
     });
   });
@@ -3535,7 +3593,9 @@
   unittest.group('obj-schema-Fingerprint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFingerprint();
-      var od = api.Fingerprint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Fingerprint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFingerprint(od as api.Fingerprint);
     });
   });
@@ -3543,7 +3603,9 @@
   unittest.group('obj-schema-FixableTotalByDigest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFixableTotalByDigest();
-      var od = api.FixableTotalByDigest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FixableTotalByDigest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFixableTotalByDigest(od as api.FixableTotalByDigest);
     });
   });
@@ -3551,7 +3613,9 @@
   unittest.group('obj-schema-GenericSignedAttestation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenericSignedAttestation();
-      var od = api.GenericSignedAttestation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenericSignedAttestation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenericSignedAttestation(od as api.GenericSignedAttestation);
     });
   });
@@ -3559,7 +3623,9 @@
   unittest.group('obj-schema-GerritSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGerritSourceContext();
-      var od = api.GerritSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GerritSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGerritSourceContext(od as api.GerritSourceContext);
     });
   });
@@ -3567,7 +3633,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -3575,7 +3643,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -3583,7 +3653,9 @@
   unittest.group('obj-schema-GitSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGitSourceContext();
-      var od = api.GitSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GitSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGitSourceContext(od as api.GitSourceContext);
     });
   });
@@ -3593,9 +3665,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDevtoolsContaineranalysisV1alpha1OperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleDevtoolsContaineranalysisV1alpha1OperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDevtoolsContaineranalysisV1alpha1OperationMetadata(
           od as api.GoogleDevtoolsContaineranalysisV1alpha1OperationMetadata);
     });
@@ -3604,7 +3677,9 @@
   unittest.group('obj-schema-GrafeasV1beta1BuildDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGrafeasV1beta1BuildDetails();
-      var od = api.GrafeasV1beta1BuildDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GrafeasV1beta1BuildDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGrafeasV1beta1BuildDetails(od as api.GrafeasV1beta1BuildDetails);
     });
   });
@@ -3612,7 +3687,9 @@
   unittest.group('obj-schema-GrafeasV1beta1DeploymentDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGrafeasV1beta1DeploymentDetails();
-      var od = api.GrafeasV1beta1DeploymentDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GrafeasV1beta1DeploymentDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGrafeasV1beta1DeploymentDetails(
           od as api.GrafeasV1beta1DeploymentDetails);
     });
@@ -3621,7 +3698,9 @@
   unittest.group('obj-schema-GrafeasV1beta1DiscoveryDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGrafeasV1beta1DiscoveryDetails();
-      var od = api.GrafeasV1beta1DiscoveryDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GrafeasV1beta1DiscoveryDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGrafeasV1beta1DiscoveryDetails(
           od as api.GrafeasV1beta1DiscoveryDetails);
     });
@@ -3630,7 +3709,9 @@
   unittest.group('obj-schema-GrafeasV1beta1ImageDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGrafeasV1beta1ImageDetails();
-      var od = api.GrafeasV1beta1ImageDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GrafeasV1beta1ImageDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGrafeasV1beta1ImageDetails(od as api.GrafeasV1beta1ImageDetails);
     });
   });
@@ -3638,7 +3719,9 @@
   unittest.group('obj-schema-GrafeasV1beta1IntotoArtifact', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGrafeasV1beta1IntotoArtifact();
-      var od = api.GrafeasV1beta1IntotoArtifact.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GrafeasV1beta1IntotoArtifact.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGrafeasV1beta1IntotoArtifact(od as api.GrafeasV1beta1IntotoArtifact);
     });
   });
@@ -3646,7 +3729,9 @@
   unittest.group('obj-schema-GrafeasV1beta1IntotoDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGrafeasV1beta1IntotoDetails();
-      var od = api.GrafeasV1beta1IntotoDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GrafeasV1beta1IntotoDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGrafeasV1beta1IntotoDetails(od as api.GrafeasV1beta1IntotoDetails);
     });
   });
@@ -3654,7 +3739,9 @@
   unittest.group('obj-schema-GrafeasV1beta1IntotoSignature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGrafeasV1beta1IntotoSignature();
-      var od = api.GrafeasV1beta1IntotoSignature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GrafeasV1beta1IntotoSignature.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGrafeasV1beta1IntotoSignature(
           od as api.GrafeasV1beta1IntotoSignature);
     });
@@ -3663,7 +3750,9 @@
   unittest.group('obj-schema-GrafeasV1beta1PackageDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGrafeasV1beta1PackageDetails();
-      var od = api.GrafeasV1beta1PackageDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GrafeasV1beta1PackageDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGrafeasV1beta1PackageDetails(od as api.GrafeasV1beta1PackageDetails);
     });
   });
@@ -3671,7 +3760,9 @@
   unittest.group('obj-schema-GrafeasV1beta1VulnerabilityDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGrafeasV1beta1VulnerabilityDetails();
-      var od = api.GrafeasV1beta1VulnerabilityDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GrafeasV1beta1VulnerabilityDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGrafeasV1beta1VulnerabilityDetails(
           od as api.GrafeasV1beta1VulnerabilityDetails);
     });
@@ -3680,7 +3771,8 @@
   unittest.group('obj-schema-Hash', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHash();
-      var od = api.Hash.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Hash.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHash(od as api.Hash);
     });
   });
@@ -3688,7 +3780,8 @@
   unittest.group('obj-schema-Hint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHint();
-      var od = api.Hint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Hint.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHint(od as api.Hint);
     });
   });
@@ -3696,7 +3789,9 @@
   unittest.group('obj-schema-InToto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInToto();
-      var od = api.InToto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.InToto.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInToto(od as api.InToto);
     });
   });
@@ -3704,7 +3799,9 @@
   unittest.group('obj-schema-Installation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstallation();
-      var od = api.Installation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Installation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstallation(od as api.Installation);
     });
   });
@@ -3712,7 +3809,9 @@
   unittest.group('obj-schema-KnowledgeBase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKnowledgeBase();
-      var od = api.KnowledgeBase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KnowledgeBase.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKnowledgeBase(od as api.KnowledgeBase);
     });
   });
@@ -3720,7 +3819,8 @@
   unittest.group('obj-schema-Layer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLayer();
-      var od = api.Layer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Layer.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLayer(od as api.Layer);
     });
   });
@@ -3728,7 +3828,8 @@
   unittest.group('obj-schema-Link', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLink();
-      var od = api.Link.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Link.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLink(od as api.Link);
     });
   });
@@ -3736,7 +3837,9 @@
   unittest.group('obj-schema-ListNoteOccurrencesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNoteOccurrencesResponse();
-      var od = api.ListNoteOccurrencesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNoteOccurrencesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNoteOccurrencesResponse(od as api.ListNoteOccurrencesResponse);
     });
   });
@@ -3744,7 +3847,9 @@
   unittest.group('obj-schema-ListNotesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListNotesResponse();
-      var od = api.ListNotesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListNotesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListNotesResponse(od as api.ListNotesResponse);
     });
   });
@@ -3752,7 +3857,9 @@
   unittest.group('obj-schema-ListOccurrencesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOccurrencesResponse();
-      var od = api.ListOccurrencesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOccurrencesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOccurrencesResponse(od as api.ListOccurrencesResponse);
     });
   });
@@ -3760,7 +3867,9 @@
   unittest.group('obj-schema-ListScanConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListScanConfigsResponse();
-      var od = api.ListScanConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListScanConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListScanConfigsResponse(od as api.ListScanConfigsResponse);
     });
   });
@@ -3768,7 +3877,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -3776,7 +3887,8 @@
   unittest.group('obj-schema-Note', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNote();
-      var od = api.Note.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Note.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNote(od as api.Note);
     });
   });
@@ -3784,7 +3896,9 @@
   unittest.group('obj-schema-Occurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOccurrence();
-      var od = api.Occurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Occurrence.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOccurrence(od as api.Occurrence);
     });
   });
@@ -3792,7 +3906,9 @@
   unittest.group('obj-schema-Package', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPackage();
-      var od = api.Package.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Package.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPackage(od as api.Package);
     });
   });
@@ -3800,7 +3916,9 @@
   unittest.group('obj-schema-PackageIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPackageIssue();
-      var od = api.PackageIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PackageIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPackageIssue(od as api.PackageIssue);
     });
   });
@@ -3808,7 +3926,9 @@
   unittest.group('obj-schema-PgpSignedAttestation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPgpSignedAttestation();
-      var od = api.PgpSignedAttestation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PgpSignedAttestation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPgpSignedAttestation(od as api.PgpSignedAttestation);
     });
   });
@@ -3816,7 +3936,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -3824,7 +3946,9 @@
   unittest.group('obj-schema-ProjectRepoId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectRepoId();
-      var od = api.ProjectRepoId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectRepoId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectRepoId(od as api.ProjectRepoId);
     });
   });
@@ -3832,7 +3956,9 @@
   unittest.group('obj-schema-RelatedUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelatedUrl();
-      var od = api.RelatedUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RelatedUrl.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRelatedUrl(od as api.RelatedUrl);
     });
   });
@@ -3840,7 +3966,9 @@
   unittest.group('obj-schema-RepoId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepoId();
-      var od = api.RepoId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RepoId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRepoId(od as api.RepoId);
     });
   });
@@ -3848,7 +3976,9 @@
   unittest.group('obj-schema-Resource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResource();
-      var od = api.Resource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Resource.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResource(od as api.Resource);
     });
   });
@@ -3856,7 +3986,9 @@
   unittest.group('obj-schema-ScanConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScanConfig();
-      var od = api.ScanConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ScanConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkScanConfig(od as api.ScanConfig);
     });
   });
@@ -3864,7 +3996,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -3872,7 +4006,9 @@
   unittest.group('obj-schema-Signature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignature();
-      var od = api.Signature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Signature.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSignature(od as api.Signature);
     });
   });
@@ -3880,7 +4016,9 @@
   unittest.group('obj-schema-SigningKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSigningKey();
-      var od = api.SigningKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SigningKey.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSigningKey(od as api.SigningKey);
     });
   });
@@ -3888,7 +4026,9 @@
   unittest.group('obj-schema-Source', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSource();
-      var od = api.Source.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Source.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSource(od as api.Source);
     });
   });
@@ -3896,7 +4036,9 @@
   unittest.group('obj-schema-SourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceContext();
-      var od = api.SourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceContext(od as api.SourceContext);
     });
   });
@@ -3904,7 +4046,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -3912,7 +4056,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -3920,7 +4066,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -3928,7 +4076,9 @@
   unittest.group('obj-schema-Version', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVersion();
-      var od = api.Version.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Version.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVersion(od as api.Version);
     });
   });
@@ -3936,7 +4086,9 @@
   unittest.group('obj-schema-Vulnerability', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVulnerability();
-      var od = api.Vulnerability.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Vulnerability.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVulnerability(od as api.Vulnerability);
     });
   });
@@ -3944,7 +4096,9 @@
   unittest.group('obj-schema-VulnerabilityLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVulnerabilityLocation();
-      var od = api.VulnerabilityLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VulnerabilityLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVulnerabilityLocation(od as api.VulnerabilityLocation);
     });
   });
@@ -3952,7 +4106,9 @@
   unittest.group('obj-schema-VulnerabilityOccurrencesSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVulnerabilityOccurrencesSummary();
-      var od = api.VulnerabilityOccurrencesSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VulnerabilityOccurrencesSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVulnerabilityOccurrencesSummary(
           od as api.VulnerabilityOccurrencesSummary);
     });
@@ -3961,7 +4117,9 @@
   unittest.group('obj-schema-WindowsDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWindowsDetail();
-      var od = api.WindowsDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WindowsDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWindowsDetail(od as api.WindowsDetail);
     });
   });
diff --git a/generated/googleapis_beta/test/datacatalog/v1beta1_test.dart b/generated/googleapis_beta/test/datacatalog/v1beta1_test.dart
index 842dfef..e84977b 100644
--- a/generated/googleapis_beta/test/datacatalog/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/datacatalog/v1beta1_test.dart
@@ -1958,7 +1958,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1966,7 +1968,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1974,7 +1977,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1982,7 +1986,9 @@
   unittest.group('obj-schema-GetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetIamPolicyRequest();
-      var od = api.GetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
@@ -1990,7 +1996,9 @@
   unittest.group('obj-schema-GetPolicyOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetPolicyOptions();
-      var od = api.GetPolicyOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetPolicyOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
@@ -1999,9 +2007,10 @@
       'obj-schema-GoogleCloudDatacatalogV1beta1BigQueryDateShardedSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1BigQueryDateShardedSpec();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatacatalogV1beta1BigQueryDateShardedSpec.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1BigQueryDateShardedSpec(
           od as api.GoogleCloudDatacatalogV1beta1BigQueryDateShardedSpec);
     });
@@ -2011,8 +2020,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1BigQueryTableSpec();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1BigQueryTableSpec.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1BigQueryTableSpec(
           od as api.GoogleCloudDatacatalogV1beta1BigQueryTableSpec);
     });
@@ -2021,8 +2031,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1ColumnSchema', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1ColumnSchema();
-      var od =
-          api.GoogleCloudDatacatalogV1beta1ColumnSchema.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1ColumnSchema.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1ColumnSchema(
           od as api.GoogleCloudDatacatalogV1beta1ColumnSchema);
     });
@@ -2031,7 +2042,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1Entry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1Entry();
-      var od = api.GoogleCloudDatacatalogV1beta1Entry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1Entry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1Entry(
           od as api.GoogleCloudDatacatalogV1beta1Entry);
     });
@@ -2040,7 +2053,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1EntryGroup', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1EntryGroup();
-      var od = api.GoogleCloudDatacatalogV1beta1EntryGroup.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1EntryGroup.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1EntryGroup(
           od as api.GoogleCloudDatacatalogV1beta1EntryGroup);
     });
@@ -2050,9 +2065,10 @@
       'obj-schema-GoogleCloudDatacatalogV1beta1ExportTaxonomiesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1ExportTaxonomiesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatacatalogV1beta1ExportTaxonomiesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1ExportTaxonomiesResponse(
           od as api.GoogleCloudDatacatalogV1beta1ExportTaxonomiesResponse);
     });
@@ -2061,7 +2077,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1FieldType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1FieldType();
-      var od = api.GoogleCloudDatacatalogV1beta1FieldType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1FieldType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1FieldType(
           od as api.GoogleCloudDatacatalogV1beta1FieldType);
     });
@@ -2071,8 +2089,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1FieldTypeEnumType();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1FieldTypeEnumType.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1FieldTypeEnumType(
           od as api.GoogleCloudDatacatalogV1beta1FieldTypeEnumType);
     });
@@ -2082,9 +2101,10 @@
       'obj-schema-GoogleCloudDatacatalogV1beta1FieldTypeEnumTypeEnumValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1FieldTypeEnumTypeEnumValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatacatalogV1beta1FieldTypeEnumTypeEnumValue.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1FieldTypeEnumTypeEnumValue(
           od as api.GoogleCloudDatacatalogV1beta1FieldTypeEnumTypeEnumValue);
     });
@@ -2093,8 +2113,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1GcsFileSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1GcsFileSpec();
-      var od =
-          api.GoogleCloudDatacatalogV1beta1GcsFileSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1GcsFileSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1GcsFileSpec(
           od as api.GoogleCloudDatacatalogV1beta1GcsFileSpec);
     });
@@ -2103,8 +2124,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1GcsFilesetSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1GcsFilesetSpec();
-      var od =
-          api.GoogleCloudDatacatalogV1beta1GcsFilesetSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1GcsFilesetSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1GcsFilesetSpec(
           od as api.GoogleCloudDatacatalogV1beta1GcsFilesetSpec);
     });
@@ -2114,9 +2136,10 @@
       'obj-schema-GoogleCloudDatacatalogV1beta1ImportTaxonomiesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1ImportTaxonomiesRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatacatalogV1beta1ImportTaxonomiesRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1ImportTaxonomiesRequest(
           od as api.GoogleCloudDatacatalogV1beta1ImportTaxonomiesRequest);
     });
@@ -2126,9 +2149,10 @@
       'obj-schema-GoogleCloudDatacatalogV1beta1ImportTaxonomiesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1ImportTaxonomiesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatacatalogV1beta1ImportTaxonomiesResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1ImportTaxonomiesResponse(
           od as api.GoogleCloudDatacatalogV1beta1ImportTaxonomiesResponse);
     });
@@ -2137,8 +2161,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1InlineSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1InlineSource();
-      var od =
-          api.GoogleCloudDatacatalogV1beta1InlineSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1InlineSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1InlineSource(
           od as api.GoogleCloudDatacatalogV1beta1InlineSource);
     });
@@ -2148,8 +2173,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1ListEntriesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1ListEntriesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1ListEntriesResponse(
           od as api.GoogleCloudDatacatalogV1beta1ListEntriesResponse);
     });
@@ -2159,9 +2185,10 @@
       'obj-schema-GoogleCloudDatacatalogV1beta1ListEntryGroupsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1ListEntryGroupsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatacatalogV1beta1ListEntryGroupsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1ListEntryGroupsResponse(
           od as api.GoogleCloudDatacatalogV1beta1ListEntryGroupsResponse);
     });
@@ -2171,8 +2198,9 @@
       'obj-schema-GoogleCloudDatacatalogV1beta1ListPolicyTagsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1ListPolicyTagsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1ListPolicyTagsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1ListPolicyTagsResponse(
           od as api.GoogleCloudDatacatalogV1beta1ListPolicyTagsResponse);
     });
@@ -2182,8 +2210,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1ListTagsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1ListTagsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1ListTagsResponse(
           od as api.GoogleCloudDatacatalogV1beta1ListTagsResponse);
     });
@@ -2193,8 +2222,9 @@
       'obj-schema-GoogleCloudDatacatalogV1beta1ListTaxonomiesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1ListTaxonomiesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1ListTaxonomiesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1ListTaxonomiesResponse(
           od as api.GoogleCloudDatacatalogV1beta1ListTaxonomiesResponse);
     });
@@ -2203,7 +2233,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1PolicyTag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1PolicyTag();
-      var od = api.GoogleCloudDatacatalogV1beta1PolicyTag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1PolicyTag.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1PolicyTag(
           od as api.GoogleCloudDatacatalogV1beta1PolicyTag);
     });
@@ -2215,9 +2247,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatacatalogV1beta1RenameTagTemplateFieldEnumValueRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatacatalogV1beta1RenameTagTemplateFieldEnumValueRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1RenameTagTemplateFieldEnumValueRequest(
           od as api
               .GoogleCloudDatacatalogV1beta1RenameTagTemplateFieldEnumValueRequest);
@@ -2229,8 +2262,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1RenameTagTemplateFieldRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1RenameTagTemplateFieldRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1RenameTagTemplateFieldRequest(
           od as api.GoogleCloudDatacatalogV1beta1RenameTagTemplateFieldRequest);
     });
@@ -2239,7 +2273,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1Schema', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1Schema();
-      var od = api.GoogleCloudDatacatalogV1beta1Schema.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1Schema.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1Schema(
           od as api.GoogleCloudDatacatalogV1beta1Schema);
     });
@@ -2249,8 +2285,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1SearchCatalogRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1SearchCatalogRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1SearchCatalogRequest(
           od as api.GoogleCloudDatacatalogV1beta1SearchCatalogRequest);
     });
@@ -2260,9 +2297,10 @@
       'obj-schema-GoogleCloudDatacatalogV1beta1SearchCatalogRequestScope', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1SearchCatalogRequestScope();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatacatalogV1beta1SearchCatalogRequestScope.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1SearchCatalogRequestScope(
           od as api.GoogleCloudDatacatalogV1beta1SearchCatalogRequestScope);
     });
@@ -2272,8 +2310,9 @@
       'obj-schema-GoogleCloudDatacatalogV1beta1SearchCatalogResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1SearchCatalogResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1SearchCatalogResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1SearchCatalogResponse(
           od as api.GoogleCloudDatacatalogV1beta1SearchCatalogResponse);
     });
@@ -2283,8 +2322,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1SearchCatalogResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1SearchCatalogResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1SearchCatalogResult(
           od as api.GoogleCloudDatacatalogV1beta1SearchCatalogResult);
     });
@@ -2294,8 +2334,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1SerializedPolicyTag();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1SerializedPolicyTag.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1SerializedPolicyTag(
           od as api.GoogleCloudDatacatalogV1beta1SerializedPolicyTag);
     });
@@ -2305,8 +2346,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1SerializedTaxonomy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1SerializedTaxonomy.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1SerializedTaxonomy(
           od as api.GoogleCloudDatacatalogV1beta1SerializedTaxonomy);
     });
@@ -2316,8 +2358,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1SystemTimestamps();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1SystemTimestamps.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1SystemTimestamps(
           od as api.GoogleCloudDatacatalogV1beta1SystemTimestamps);
     });
@@ -2326,7 +2369,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1TableSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1TableSpec();
-      var od = api.GoogleCloudDatacatalogV1beta1TableSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1TableSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1TableSpec(
           od as api.GoogleCloudDatacatalogV1beta1TableSpec);
     });
@@ -2335,7 +2380,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1Tag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1Tag();
-      var od = api.GoogleCloudDatacatalogV1beta1Tag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1Tag.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1Tag(
           od as api.GoogleCloudDatacatalogV1beta1Tag);
     });
@@ -2344,7 +2391,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1TagField', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1TagField();
-      var od = api.GoogleCloudDatacatalogV1beta1TagField.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1TagField.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1TagField(
           od as api.GoogleCloudDatacatalogV1beta1TagField);
     });
@@ -2354,8 +2403,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1TagFieldEnumValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1TagFieldEnumValue.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1TagFieldEnumValue(
           od as api.GoogleCloudDatacatalogV1beta1TagFieldEnumValue);
     });
@@ -2364,8 +2414,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1TagTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1TagTemplate();
-      var od =
-          api.GoogleCloudDatacatalogV1beta1TagTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1TagTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1TagTemplate(
           od as api.GoogleCloudDatacatalogV1beta1TagTemplate);
     });
@@ -2375,8 +2426,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1TagTemplateField();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatacatalogV1beta1TagTemplateField.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1TagTemplateField(
           od as api.GoogleCloudDatacatalogV1beta1TagTemplateField);
     });
@@ -2385,7 +2437,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1Taxonomy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1Taxonomy();
-      var od = api.GoogleCloudDatacatalogV1beta1Taxonomy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1Taxonomy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1Taxonomy(
           od as api.GoogleCloudDatacatalogV1beta1Taxonomy);
     });
@@ -2394,7 +2448,9 @@
   unittest.group('obj-schema-GoogleCloudDatacatalogV1beta1ViewSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatacatalogV1beta1ViewSpec();
-      var od = api.GoogleCloudDatacatalogV1beta1ViewSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatacatalogV1beta1ViewSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatacatalogV1beta1ViewSpec(
           od as api.GoogleCloudDatacatalogV1beta1ViewSpec);
     });
@@ -2403,7 +2459,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2411,7 +2469,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -2419,7 +2479,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2427,7 +2489,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis_beta/test/dataflow/v1b3_test.dart b/generated/googleapis_beta/test/dataflow/v1b3_test.dart
index 211339c..8af4b52 100644
--- a/generated/googleapis_beta/test/dataflow/v1b3_test.dart
+++ b/generated/googleapis_beta/test/dataflow/v1b3_test.dart
@@ -8478,7 +8478,9 @@
   unittest.group('obj-schema-ApproximateProgress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApproximateProgress();
-      var od = api.ApproximateProgress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApproximateProgress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApproximateProgress(od as api.ApproximateProgress);
     });
   });
@@ -8486,7 +8488,9 @@
   unittest.group('obj-schema-ApproximateReportedProgress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApproximateReportedProgress();
-      var od = api.ApproximateReportedProgress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApproximateReportedProgress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApproximateReportedProgress(od as api.ApproximateReportedProgress);
     });
   });
@@ -8494,7 +8498,9 @@
   unittest.group('obj-schema-ApproximateSplitRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApproximateSplitRequest();
-      var od = api.ApproximateSplitRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ApproximateSplitRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkApproximateSplitRequest(od as api.ApproximateSplitRequest);
     });
   });
@@ -8502,7 +8508,9 @@
   unittest.group('obj-schema-Artifact', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArtifact();
-      var od = api.Artifact.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Artifact.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkArtifact(od as api.Artifact);
     });
   });
@@ -8510,7 +8518,9 @@
   unittest.group('obj-schema-AutoscalingEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalingEvent();
-      var od = api.AutoscalingEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalingEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalingEvent(od as api.AutoscalingEvent);
     });
   });
@@ -8518,7 +8528,9 @@
   unittest.group('obj-schema-AutoscalingSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAutoscalingSettings();
-      var od = api.AutoscalingSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AutoscalingSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAutoscalingSettings(od as api.AutoscalingSettings);
     });
   });
@@ -8526,7 +8538,9 @@
   unittest.group('obj-schema-BigQueryIODetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigQueryIODetails();
-      var od = api.BigQueryIODetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigQueryIODetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigQueryIODetails(od as api.BigQueryIODetails);
     });
   });
@@ -8534,7 +8548,9 @@
   unittest.group('obj-schema-BigTableIODetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBigTableIODetails();
-      var od = api.BigTableIODetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BigTableIODetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBigTableIODetails(od as api.BigTableIODetails);
     });
   });
@@ -8542,7 +8558,9 @@
   unittest.group('obj-schema-CPUTime', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCPUTime();
-      var od = api.CPUTime.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CPUTime.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCPUTime(od as api.CPUTime);
     });
   });
@@ -8550,7 +8568,9 @@
   unittest.group('obj-schema-CommitTemplateVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommitTemplateVersionRequest();
-      var od = api.CommitTemplateVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CommitTemplateVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCommitTemplateVersionRequest(od as api.CommitTemplateVersionRequest);
     });
   });
@@ -8558,7 +8578,9 @@
   unittest.group('obj-schema-ComponentSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComponentSource();
-      var od = api.ComponentSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComponentSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComponentSource(od as api.ComponentSource);
     });
   });
@@ -8566,7 +8588,9 @@
   unittest.group('obj-schema-ComponentTransform', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComponentTransform();
-      var od = api.ComponentTransform.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComponentTransform.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComponentTransform(od as api.ComponentTransform);
     });
   });
@@ -8574,7 +8598,9 @@
   unittest.group('obj-schema-ComputationTopology', () {
     unittest.test('to-json--from-json', () async {
       var o = buildComputationTopology();
-      var od = api.ComputationTopology.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ComputationTopology.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkComputationTopology(od as api.ComputationTopology);
     });
   });
@@ -8582,7 +8608,9 @@
   unittest.group('obj-schema-ConcatPosition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConcatPosition();
-      var od = api.ConcatPosition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConcatPosition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConcatPosition(od as api.ConcatPosition);
     });
   });
@@ -8590,7 +8618,9 @@
   unittest.group('obj-schema-ContainerSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerSpec();
-      var od = api.ContainerSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerSpec(od as api.ContainerSpec);
     });
   });
@@ -8598,7 +8628,9 @@
   unittest.group('obj-schema-CounterMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCounterMetadata();
-      var od = api.CounterMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CounterMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCounterMetadata(od as api.CounterMetadata);
     });
   });
@@ -8606,7 +8638,9 @@
   unittest.group('obj-schema-CounterStructuredName', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCounterStructuredName();
-      var od = api.CounterStructuredName.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CounterStructuredName.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCounterStructuredName(od as api.CounterStructuredName);
     });
   });
@@ -8614,7 +8648,9 @@
   unittest.group('obj-schema-CounterStructuredNameAndMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCounterStructuredNameAndMetadata();
-      var od = api.CounterStructuredNameAndMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CounterStructuredNameAndMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCounterStructuredNameAndMetadata(
           od as api.CounterStructuredNameAndMetadata);
     });
@@ -8623,7 +8659,9 @@
   unittest.group('obj-schema-CounterUpdate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCounterUpdate();
-      var od = api.CounterUpdate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CounterUpdate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCounterUpdate(od as api.CounterUpdate);
     });
   });
@@ -8631,7 +8669,9 @@
   unittest.group('obj-schema-CreateJobFromTemplateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateJobFromTemplateRequest();
-      var od = api.CreateJobFromTemplateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateJobFromTemplateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateJobFromTemplateRequest(od as api.CreateJobFromTemplateRequest);
     });
   });
@@ -8639,7 +8679,9 @@
   unittest.group('obj-schema-CreateTemplateVersionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCreateTemplateVersionRequest();
-      var od = api.CreateTemplateVersionRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CreateTemplateVersionRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCreateTemplateVersionRequest(od as api.CreateTemplateVersionRequest);
     });
   });
@@ -8647,7 +8689,9 @@
   unittest.group('obj-schema-CustomSourceLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomSourceLocation();
-      var od = api.CustomSourceLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CustomSourceLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCustomSourceLocation(od as api.CustomSourceLocation);
     });
   });
@@ -8655,7 +8699,9 @@
   unittest.group('obj-schema-DataDiskAssignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDataDiskAssignment();
-      var od = api.DataDiskAssignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DataDiskAssignment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDataDiskAssignment(od as api.DataDiskAssignment);
     });
   });
@@ -8663,7 +8709,9 @@
   unittest.group('obj-schema-DatastoreIODetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatastoreIODetails();
-      var od = api.DatastoreIODetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatastoreIODetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatastoreIODetails(od as api.DatastoreIODetails);
     });
   });
@@ -8671,7 +8719,9 @@
   unittest.group('obj-schema-DeleteSnapshotResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeleteSnapshotResponse();
-      var od = api.DeleteSnapshotResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeleteSnapshotResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeleteSnapshotResponse(od as api.DeleteSnapshotResponse);
     });
   });
@@ -8679,7 +8729,9 @@
   unittest.group('obj-schema-DerivedSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDerivedSource();
-      var od = api.DerivedSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DerivedSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDerivedSource(od as api.DerivedSource);
     });
   });
@@ -8687,7 +8739,8 @@
   unittest.group('obj-schema-Disk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisk();
-      var od = api.Disk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Disk.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDisk(od as api.Disk);
     });
   });
@@ -8695,7 +8748,9 @@
   unittest.group('obj-schema-DisplayData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisplayData();
-      var od = api.DisplayData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisplayData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisplayData(od as api.DisplayData);
     });
   });
@@ -8703,7 +8758,9 @@
   unittest.group('obj-schema-DistributionUpdate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDistributionUpdate();
-      var od = api.DistributionUpdate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DistributionUpdate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDistributionUpdate(od as api.DistributionUpdate);
     });
   });
@@ -8711,7 +8768,9 @@
   unittest.group('obj-schema-DynamicSourceSplit', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDynamicSourceSplit();
-      var od = api.DynamicSourceSplit.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DynamicSourceSplit.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDynamicSourceSplit(od as api.DynamicSourceSplit);
     });
   });
@@ -8719,7 +8778,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -8727,7 +8787,9 @@
   unittest.group('obj-schema-Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironment();
-      var od = api.Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironment(od as api.Environment);
     });
   });
@@ -8735,7 +8797,9 @@
   unittest.group('obj-schema-ExecutionStageState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecutionStageState();
-      var od = api.ExecutionStageState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecutionStageState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecutionStageState(od as api.ExecutionStageState);
     });
   });
@@ -8743,7 +8807,9 @@
   unittest.group('obj-schema-ExecutionStageSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecutionStageSummary();
-      var od = api.ExecutionStageSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExecutionStageSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExecutionStageSummary(od as api.ExecutionStageSummary);
     });
   });
@@ -8751,7 +8817,9 @@
   unittest.group('obj-schema-FailedLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFailedLocation();
-      var od = api.FailedLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FailedLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFailedLocation(od as api.FailedLocation);
     });
   });
@@ -8759,7 +8827,9 @@
   unittest.group('obj-schema-FileIODetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileIODetails();
-      var od = api.FileIODetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileIODetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileIODetails(od as api.FileIODetails);
     });
   });
@@ -8767,7 +8837,9 @@
   unittest.group('obj-schema-FlattenInstruction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFlattenInstruction();
-      var od = api.FlattenInstruction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FlattenInstruction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFlattenInstruction(od as api.FlattenInstruction);
     });
   });
@@ -8775,7 +8847,9 @@
   unittest.group('obj-schema-FlexTemplateRuntimeEnvironment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFlexTemplateRuntimeEnvironment();
-      var od = api.FlexTemplateRuntimeEnvironment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FlexTemplateRuntimeEnvironment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFlexTemplateRuntimeEnvironment(
           od as api.FlexTemplateRuntimeEnvironment);
     });
@@ -8784,7 +8858,9 @@
   unittest.group('obj-schema-FloatingPointList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloatingPointList();
-      var od = api.FloatingPointList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloatingPointList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloatingPointList(od as api.FloatingPointList);
     });
   });
@@ -8792,7 +8868,9 @@
   unittest.group('obj-schema-FloatingPointMean', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFloatingPointMean();
-      var od = api.FloatingPointMean.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FloatingPointMean.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFloatingPointMean(od as api.FloatingPointMean);
     });
   });
@@ -8800,7 +8878,9 @@
   unittest.group('obj-schema-GetDebugConfigRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetDebugConfigRequest();
-      var od = api.GetDebugConfigRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetDebugConfigRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetDebugConfigRequest(od as api.GetDebugConfigRequest);
     });
   });
@@ -8808,7 +8888,9 @@
   unittest.group('obj-schema-GetDebugConfigResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetDebugConfigResponse();
-      var od = api.GetDebugConfigResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetDebugConfigResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetDebugConfigResponse(od as api.GetDebugConfigResponse);
     });
   });
@@ -8816,7 +8898,9 @@
   unittest.group('obj-schema-GetTemplateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGetTemplateResponse();
-      var od = api.GetTemplateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GetTemplateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGetTemplateResponse(od as api.GetTemplateResponse);
     });
   });
@@ -8824,7 +8908,9 @@
   unittest.group('obj-schema-Histogram', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistogram();
-      var od = api.Histogram.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Histogram.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHistogram(od as api.Histogram);
     });
   });
@@ -8832,7 +8918,9 @@
   unittest.group('obj-schema-HotKeyDetection', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHotKeyDetection();
-      var od = api.HotKeyDetection.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HotKeyDetection.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHotKeyDetection(od as api.HotKeyDetection);
     });
   });
@@ -8840,7 +8928,9 @@
   unittest.group('obj-schema-InstructionInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstructionInput();
-      var od = api.InstructionInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstructionInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstructionInput(od as api.InstructionInput);
     });
   });
@@ -8848,7 +8938,9 @@
   unittest.group('obj-schema-InstructionOutput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstructionOutput();
-      var od = api.InstructionOutput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstructionOutput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstructionOutput(od as api.InstructionOutput);
     });
   });
@@ -8856,7 +8948,9 @@
   unittest.group('obj-schema-IntegerGauge', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntegerGauge();
-      var od = api.IntegerGauge.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntegerGauge.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntegerGauge(od as api.IntegerGauge);
     });
   });
@@ -8864,7 +8958,9 @@
   unittest.group('obj-schema-IntegerList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntegerList();
-      var od = api.IntegerList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntegerList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntegerList(od as api.IntegerList);
     });
   });
@@ -8872,7 +8968,9 @@
   unittest.group('obj-schema-IntegerMean', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIntegerMean();
-      var od = api.IntegerMean.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IntegerMean.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIntegerMean(od as api.IntegerMean);
     });
   });
@@ -8880,7 +8978,8 @@
   unittest.group('obj-schema-Job', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJob();
-      var od = api.Job.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Job.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJob(od as api.Job);
     });
   });
@@ -8888,7 +8987,9 @@
   unittest.group('obj-schema-JobExecutionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobExecutionDetails();
-      var od = api.JobExecutionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobExecutionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobExecutionDetails(od as api.JobExecutionDetails);
     });
   });
@@ -8896,7 +8997,9 @@
   unittest.group('obj-schema-JobExecutionInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobExecutionInfo();
-      var od = api.JobExecutionInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobExecutionInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobExecutionInfo(od as api.JobExecutionInfo);
     });
   });
@@ -8904,7 +9007,9 @@
   unittest.group('obj-schema-JobExecutionStageInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobExecutionStageInfo();
-      var od = api.JobExecutionStageInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobExecutionStageInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobExecutionStageInfo(od as api.JobExecutionStageInfo);
     });
   });
@@ -8912,7 +9017,9 @@
   unittest.group('obj-schema-JobMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobMessage();
-      var od = api.JobMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobMessage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobMessage(od as api.JobMessage);
     });
   });
@@ -8920,7 +9027,9 @@
   unittest.group('obj-schema-JobMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobMetadata();
-      var od = api.JobMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobMetadata(od as api.JobMetadata);
     });
   });
@@ -8928,7 +9037,9 @@
   unittest.group('obj-schema-JobMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobMetrics();
-      var od = api.JobMetrics.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobMetrics.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobMetrics(od as api.JobMetrics);
     });
   });
@@ -8936,7 +9047,9 @@
   unittest.group('obj-schema-KeyRangeDataDiskAssignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyRangeDataDiskAssignment();
-      var od = api.KeyRangeDataDiskAssignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeyRangeDataDiskAssignment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKeyRangeDataDiskAssignment(od as api.KeyRangeDataDiskAssignment);
     });
   });
@@ -8944,7 +9057,9 @@
   unittest.group('obj-schema-KeyRangeLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyRangeLocation();
-      var od = api.KeyRangeLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeyRangeLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKeyRangeLocation(od as api.KeyRangeLocation);
     });
   });
@@ -8952,7 +9067,9 @@
   unittest.group('obj-schema-LaunchFlexTemplateParameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLaunchFlexTemplateParameter();
-      var od = api.LaunchFlexTemplateParameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LaunchFlexTemplateParameter.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLaunchFlexTemplateParameter(od as api.LaunchFlexTemplateParameter);
     });
   });
@@ -8960,7 +9077,9 @@
   unittest.group('obj-schema-LaunchFlexTemplateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLaunchFlexTemplateRequest();
-      var od = api.LaunchFlexTemplateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LaunchFlexTemplateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLaunchFlexTemplateRequest(od as api.LaunchFlexTemplateRequest);
     });
   });
@@ -8968,7 +9087,9 @@
   unittest.group('obj-schema-LaunchFlexTemplateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLaunchFlexTemplateResponse();
-      var od = api.LaunchFlexTemplateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LaunchFlexTemplateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLaunchFlexTemplateResponse(od as api.LaunchFlexTemplateResponse);
     });
   });
@@ -8976,7 +9097,9 @@
   unittest.group('obj-schema-LaunchTemplateParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLaunchTemplateParameters();
-      var od = api.LaunchTemplateParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LaunchTemplateParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLaunchTemplateParameters(od as api.LaunchTemplateParameters);
     });
   });
@@ -8984,7 +9107,9 @@
   unittest.group('obj-schema-LaunchTemplateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLaunchTemplateResponse();
-      var od = api.LaunchTemplateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LaunchTemplateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLaunchTemplateResponse(od as api.LaunchTemplateResponse);
     });
   });
@@ -8992,7 +9117,9 @@
   unittest.group('obj-schema-LeaseWorkItemRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLeaseWorkItemRequest();
-      var od = api.LeaseWorkItemRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LeaseWorkItemRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLeaseWorkItemRequest(od as api.LeaseWorkItemRequest);
     });
   });
@@ -9000,7 +9127,9 @@
   unittest.group('obj-schema-LeaseWorkItemResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLeaseWorkItemResponse();
-      var od = api.LeaseWorkItemResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LeaseWorkItemResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLeaseWorkItemResponse(od as api.LeaseWorkItemResponse);
     });
   });
@@ -9008,7 +9137,9 @@
   unittest.group('obj-schema-ListJobMessagesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListJobMessagesResponse();
-      var od = api.ListJobMessagesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListJobMessagesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListJobMessagesResponse(od as api.ListJobMessagesResponse);
     });
   });
@@ -9016,7 +9147,9 @@
   unittest.group('obj-schema-ListJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListJobsResponse();
-      var od = api.ListJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
@@ -9024,7 +9157,9 @@
   unittest.group('obj-schema-ListSnapshotsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSnapshotsResponse();
-      var od = api.ListSnapshotsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSnapshotsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSnapshotsResponse(od as api.ListSnapshotsResponse);
     });
   });
@@ -9032,7 +9167,9 @@
   unittest.group('obj-schema-ListTemplateVersionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTemplateVersionsResponse();
-      var od = api.ListTemplateVersionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTemplateVersionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTemplateVersionsResponse(od as api.ListTemplateVersionsResponse);
     });
   });
@@ -9040,7 +9177,9 @@
   unittest.group('obj-schema-MapTask', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMapTask();
-      var od = api.MapTask.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MapTask.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMapTask(od as api.MapTask);
     });
   });
@@ -9048,7 +9187,9 @@
   unittest.group('obj-schema-MemInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMemInfo();
-      var od = api.MemInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MemInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMemInfo(od as api.MemInfo);
     });
   });
@@ -9056,7 +9197,9 @@
   unittest.group('obj-schema-MetricShortId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricShortId();
-      var od = api.MetricShortId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricShortId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricShortId(od as api.MetricShortId);
     });
   });
@@ -9064,7 +9207,9 @@
   unittest.group('obj-schema-MetricStructuredName', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricStructuredName();
-      var od = api.MetricStructuredName.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricStructuredName.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricStructuredName(od as api.MetricStructuredName);
     });
   });
@@ -9072,7 +9217,9 @@
   unittest.group('obj-schema-MetricUpdate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricUpdate();
-      var od = api.MetricUpdate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricUpdate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricUpdate(od as api.MetricUpdate);
     });
   });
@@ -9080,7 +9227,9 @@
   unittest.group('obj-schema-ModifyTemplateVersionLabelRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyTemplateVersionLabelRequest();
-      var od = api.ModifyTemplateVersionLabelRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyTemplateVersionLabelRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyTemplateVersionLabelRequest(
           od as api.ModifyTemplateVersionLabelRequest);
     });
@@ -9089,7 +9238,9 @@
   unittest.group('obj-schema-ModifyTemplateVersionLabelResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyTemplateVersionLabelResponse();
-      var od = api.ModifyTemplateVersionLabelResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyTemplateVersionLabelResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyTemplateVersionLabelResponse(
           od as api.ModifyTemplateVersionLabelResponse);
     });
@@ -9098,7 +9249,9 @@
   unittest.group('obj-schema-ModifyTemplateVersionTagRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyTemplateVersionTagRequest();
-      var od = api.ModifyTemplateVersionTagRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyTemplateVersionTagRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyTemplateVersionTagRequest(
           od as api.ModifyTemplateVersionTagRequest);
     });
@@ -9107,7 +9260,9 @@
   unittest.group('obj-schema-ModifyTemplateVersionTagResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildModifyTemplateVersionTagResponse();
-      var od = api.ModifyTemplateVersionTagResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ModifyTemplateVersionTagResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkModifyTemplateVersionTagResponse(
           od as api.ModifyTemplateVersionTagResponse);
     });
@@ -9116,7 +9271,9 @@
   unittest.group('obj-schema-MountedDataDisk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMountedDataDisk();
-      var od = api.MountedDataDisk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MountedDataDisk.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMountedDataDisk(od as api.MountedDataDisk);
     });
   });
@@ -9124,7 +9281,9 @@
   unittest.group('obj-schema-MultiOutputInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMultiOutputInfo();
-      var od = api.MultiOutputInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MultiOutputInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMultiOutputInfo(od as api.MultiOutputInfo);
     });
   });
@@ -9132,7 +9291,9 @@
   unittest.group('obj-schema-NameAndKind', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNameAndKind();
-      var od = api.NameAndKind.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NameAndKind.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNameAndKind(od as api.NameAndKind);
     });
   });
@@ -9140,7 +9301,9 @@
   unittest.group('obj-schema-Package', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPackage();
-      var od = api.Package.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Package.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPackage(od as api.Package);
     });
   });
@@ -9148,7 +9311,9 @@
   unittest.group('obj-schema-ParDoInstruction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParDoInstruction();
-      var od = api.ParDoInstruction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParDoInstruction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParDoInstruction(od as api.ParDoInstruction);
     });
   });
@@ -9156,7 +9321,9 @@
   unittest.group('obj-schema-ParallelInstruction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParallelInstruction();
-      var od = api.ParallelInstruction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParallelInstruction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParallelInstruction(od as api.ParallelInstruction);
     });
   });
@@ -9164,7 +9331,9 @@
   unittest.group('obj-schema-Parameter', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParameter();
-      var od = api.Parameter.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Parameter.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkParameter(od as api.Parameter);
     });
   });
@@ -9172,7 +9341,9 @@
   unittest.group('obj-schema-ParameterMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildParameterMetadata();
-      var od = api.ParameterMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ParameterMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkParameterMetadata(od as api.ParameterMetadata);
     });
   });
@@ -9180,7 +9351,9 @@
   unittest.group('obj-schema-PartialGroupByKeyInstruction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPartialGroupByKeyInstruction();
-      var od = api.PartialGroupByKeyInstruction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PartialGroupByKeyInstruction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPartialGroupByKeyInstruction(od as api.PartialGroupByKeyInstruction);
     });
   });
@@ -9188,7 +9361,9 @@
   unittest.group('obj-schema-PipelineDescription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPipelineDescription();
-      var od = api.PipelineDescription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PipelineDescription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPipelineDescription(od as api.PipelineDescription);
     });
   });
@@ -9196,7 +9371,8 @@
   unittest.group('obj-schema-Point', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPoint();
-      var od = api.Point.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Point.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPoint(od as api.Point);
     });
   });
@@ -9204,7 +9380,9 @@
   unittest.group('obj-schema-Position', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPosition();
-      var od = api.Position.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Position.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPosition(od as api.Position);
     });
   });
@@ -9212,7 +9390,9 @@
   unittest.group('obj-schema-ProgressTimeseries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProgressTimeseries();
-      var od = api.ProgressTimeseries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProgressTimeseries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProgressTimeseries(od as api.ProgressTimeseries);
     });
   });
@@ -9220,7 +9400,9 @@
   unittest.group('obj-schema-PubSubIODetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubSubIODetails();
-      var od = api.PubSubIODetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PubSubIODetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPubSubIODetails(od as api.PubSubIODetails);
     });
   });
@@ -9228,7 +9410,9 @@
   unittest.group('obj-schema-PubsubLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubsubLocation();
-      var od = api.PubsubLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PubsubLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPubsubLocation(od as api.PubsubLocation);
     });
   });
@@ -9236,7 +9420,9 @@
   unittest.group('obj-schema-PubsubSnapshotMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubsubSnapshotMetadata();
-      var od = api.PubsubSnapshotMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PubsubSnapshotMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPubsubSnapshotMetadata(od as api.PubsubSnapshotMetadata);
     });
   });
@@ -9244,7 +9430,9 @@
   unittest.group('obj-schema-QueryInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQueryInfo();
-      var od = api.QueryInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.QueryInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkQueryInfo(od as api.QueryInfo);
     });
   });
@@ -9252,7 +9440,9 @@
   unittest.group('obj-schema-ReadInstruction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReadInstruction();
-      var od = api.ReadInstruction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReadInstruction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReadInstruction(od as api.ReadInstruction);
     });
   });
@@ -9260,7 +9450,9 @@
   unittest.group('obj-schema-ReportWorkItemStatusRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportWorkItemStatusRequest();
-      var od = api.ReportWorkItemStatusRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportWorkItemStatusRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportWorkItemStatusRequest(od as api.ReportWorkItemStatusRequest);
     });
   });
@@ -9268,7 +9460,9 @@
   unittest.group('obj-schema-ReportWorkItemStatusResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportWorkItemStatusResponse();
-      var od = api.ReportWorkItemStatusResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportWorkItemStatusResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportWorkItemStatusResponse(od as api.ReportWorkItemStatusResponse);
     });
   });
@@ -9276,7 +9470,9 @@
   unittest.group('obj-schema-ReportedParallelism', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportedParallelism();
-      var od = api.ReportedParallelism.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportedParallelism.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportedParallelism(od as api.ReportedParallelism);
     });
   });
@@ -9284,7 +9480,9 @@
   unittest.group('obj-schema-ResourceUtilizationReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceUtilizationReport();
-      var od = api.ResourceUtilizationReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceUtilizationReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceUtilizationReport(od as api.ResourceUtilizationReport);
     });
   });
@@ -9292,7 +9490,9 @@
   unittest.group('obj-schema-ResourceUtilizationReportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceUtilizationReportResponse();
-      var od = api.ResourceUtilizationReportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceUtilizationReportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceUtilizationReportResponse(
           od as api.ResourceUtilizationReportResponse);
     });
@@ -9301,7 +9501,9 @@
   unittest.group('obj-schema-RuntimeEnvironment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRuntimeEnvironment();
-      var od = api.RuntimeEnvironment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RuntimeEnvironment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRuntimeEnvironment(od as api.RuntimeEnvironment);
     });
   });
@@ -9309,7 +9511,9 @@
   unittest.group('obj-schema-RuntimeMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRuntimeMetadata();
-      var od = api.RuntimeMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RuntimeMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRuntimeMetadata(od as api.RuntimeMetadata);
     });
   });
@@ -9317,7 +9521,9 @@
   unittest.group('obj-schema-SDKInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSDKInfo();
-      var od = api.SDKInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SDKInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSDKInfo(od as api.SDKInfo);
     });
   });
@@ -9325,7 +9531,9 @@
   unittest.group('obj-schema-SdkHarnessContainerImage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSdkHarnessContainerImage();
-      var od = api.SdkHarnessContainerImage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SdkHarnessContainerImage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSdkHarnessContainerImage(od as api.SdkHarnessContainerImage);
     });
   });
@@ -9333,7 +9541,9 @@
   unittest.group('obj-schema-SdkVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSdkVersion();
-      var od = api.SdkVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SdkVersion.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSdkVersion(od as api.SdkVersion);
     });
   });
@@ -9341,7 +9551,9 @@
   unittest.group('obj-schema-SendDebugCaptureRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSendDebugCaptureRequest();
-      var od = api.SendDebugCaptureRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SendDebugCaptureRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSendDebugCaptureRequest(od as api.SendDebugCaptureRequest);
     });
   });
@@ -9349,7 +9561,9 @@
   unittest.group('obj-schema-SendDebugCaptureResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSendDebugCaptureResponse();
-      var od = api.SendDebugCaptureResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SendDebugCaptureResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSendDebugCaptureResponse(od as api.SendDebugCaptureResponse);
     });
   });
@@ -9357,7 +9571,9 @@
   unittest.group('obj-schema-SendWorkerMessagesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSendWorkerMessagesRequest();
-      var od = api.SendWorkerMessagesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SendWorkerMessagesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSendWorkerMessagesRequest(od as api.SendWorkerMessagesRequest);
     });
   });
@@ -9365,7 +9581,9 @@
   unittest.group('obj-schema-SendWorkerMessagesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSendWorkerMessagesResponse();
-      var od = api.SendWorkerMessagesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SendWorkerMessagesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSendWorkerMessagesResponse(od as api.SendWorkerMessagesResponse);
     });
   });
@@ -9373,7 +9591,9 @@
   unittest.group('obj-schema-SeqMapTask', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeqMapTask();
-      var od = api.SeqMapTask.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SeqMapTask.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSeqMapTask(od as api.SeqMapTask);
     });
   });
@@ -9381,7 +9601,9 @@
   unittest.group('obj-schema-SeqMapTaskOutputInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSeqMapTaskOutputInfo();
-      var od = api.SeqMapTaskOutputInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SeqMapTaskOutputInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSeqMapTaskOutputInfo(od as api.SeqMapTaskOutputInfo);
     });
   });
@@ -9389,7 +9611,9 @@
   unittest.group('obj-schema-ShellTask', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShellTask();
-      var od = api.ShellTask.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ShellTask.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkShellTask(od as api.ShellTask);
     });
   });
@@ -9397,7 +9621,9 @@
   unittest.group('obj-schema-SideInputInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSideInputInfo();
-      var od = api.SideInputInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SideInputInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSideInputInfo(od as api.SideInputInfo);
     });
   });
@@ -9405,7 +9631,8 @@
   unittest.group('obj-schema-Sink', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSink();
-      var od = api.Sink.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Sink.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSink(od as api.Sink);
     });
   });
@@ -9413,7 +9640,9 @@
   unittest.group('obj-schema-Snapshot', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshot();
-      var od = api.Snapshot.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Snapshot.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSnapshot(od as api.Snapshot);
     });
   });
@@ -9421,7 +9650,9 @@
   unittest.group('obj-schema-SnapshotJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSnapshotJobRequest();
-      var od = api.SnapshotJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SnapshotJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSnapshotJobRequest(od as api.SnapshotJobRequest);
     });
   });
@@ -9429,7 +9660,9 @@
   unittest.group('obj-schema-Source', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSource();
-      var od = api.Source.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Source.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSource(od as api.Source);
     });
   });
@@ -9437,7 +9670,9 @@
   unittest.group('obj-schema-SourceFork', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceFork();
-      var od = api.SourceFork.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SourceFork.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSourceFork(od as api.SourceFork);
     });
   });
@@ -9445,7 +9680,9 @@
   unittest.group('obj-schema-SourceGetMetadataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceGetMetadataRequest();
-      var od = api.SourceGetMetadataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceGetMetadataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceGetMetadataRequest(od as api.SourceGetMetadataRequest);
     });
   });
@@ -9453,7 +9690,9 @@
   unittest.group('obj-schema-SourceGetMetadataResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceGetMetadataResponse();
-      var od = api.SourceGetMetadataResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceGetMetadataResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceGetMetadataResponse(od as api.SourceGetMetadataResponse);
     });
   });
@@ -9461,7 +9700,9 @@
   unittest.group('obj-schema-SourceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceMetadata();
-      var od = api.SourceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceMetadata(od as api.SourceMetadata);
     });
   });
@@ -9469,7 +9710,9 @@
   unittest.group('obj-schema-SourceOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceOperationRequest();
-      var od = api.SourceOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceOperationRequest(od as api.SourceOperationRequest);
     });
   });
@@ -9477,7 +9720,9 @@
   unittest.group('obj-schema-SourceOperationResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceOperationResponse();
-      var od = api.SourceOperationResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceOperationResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceOperationResponse(od as api.SourceOperationResponse);
     });
   });
@@ -9485,7 +9730,9 @@
   unittest.group('obj-schema-SourceSplitOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceSplitOptions();
-      var od = api.SourceSplitOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceSplitOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceSplitOptions(od as api.SourceSplitOptions);
     });
   });
@@ -9493,7 +9740,9 @@
   unittest.group('obj-schema-SourceSplitRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceSplitRequest();
-      var od = api.SourceSplitRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceSplitRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceSplitRequest(od as api.SourceSplitRequest);
     });
   });
@@ -9501,7 +9750,9 @@
   unittest.group('obj-schema-SourceSplitResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceSplitResponse();
-      var od = api.SourceSplitResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceSplitResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceSplitResponse(od as api.SourceSplitResponse);
     });
   });
@@ -9509,7 +9760,9 @@
   unittest.group('obj-schema-SourceSplitShard', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceSplitShard();
-      var od = api.SourceSplitShard.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceSplitShard.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceSplitShard(od as api.SourceSplitShard);
     });
   });
@@ -9517,7 +9770,9 @@
   unittest.group('obj-schema-SpannerIODetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpannerIODetails();
-      var od = api.SpannerIODetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpannerIODetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpannerIODetails(od as api.SpannerIODetails);
     });
   });
@@ -9525,7 +9780,9 @@
   unittest.group('obj-schema-SplitInt64', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSplitInt64();
-      var od = api.SplitInt64.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SplitInt64.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSplitInt64(od as api.SplitInt64);
     });
   });
@@ -9533,7 +9790,9 @@
   unittest.group('obj-schema-StageExecutionDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStageExecutionDetails();
-      var od = api.StageExecutionDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StageExecutionDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStageExecutionDetails(od as api.StageExecutionDetails);
     });
   });
@@ -9541,7 +9800,9 @@
   unittest.group('obj-schema-StageSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStageSource();
-      var od = api.StageSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StageSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStageSource(od as api.StageSource);
     });
   });
@@ -9549,7 +9810,9 @@
   unittest.group('obj-schema-StageSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStageSummary();
-      var od = api.StageSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StageSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStageSummary(od as api.StageSummary);
     });
   });
@@ -9557,7 +9820,9 @@
   unittest.group('obj-schema-StateFamilyConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStateFamilyConfig();
-      var od = api.StateFamilyConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StateFamilyConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStateFamilyConfig(od as api.StateFamilyConfig);
     });
   });
@@ -9565,7 +9830,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -9573,7 +9840,8 @@
   unittest.group('obj-schema-Step', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStep();
-      var od = api.Step.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Step.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStep(od as api.Step);
     });
   });
@@ -9581,7 +9849,9 @@
   unittest.group('obj-schema-StreamLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamLocation();
-      var od = api.StreamLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamLocation(od as api.StreamLocation);
     });
   });
@@ -9589,7 +9859,9 @@
   unittest.group('obj-schema-StreamingApplianceSnapshotConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamingApplianceSnapshotConfig();
-      var od = api.StreamingApplianceSnapshotConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamingApplianceSnapshotConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamingApplianceSnapshotConfig(
           od as api.StreamingApplianceSnapshotConfig);
     });
@@ -9598,7 +9870,9 @@
   unittest.group('obj-schema-StreamingComputationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamingComputationConfig();
-      var od = api.StreamingComputationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamingComputationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamingComputationConfig(od as api.StreamingComputationConfig);
     });
   });
@@ -9606,7 +9880,9 @@
   unittest.group('obj-schema-StreamingComputationRanges', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamingComputationRanges();
-      var od = api.StreamingComputationRanges.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamingComputationRanges.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamingComputationRanges(od as api.StreamingComputationRanges);
     });
   });
@@ -9614,7 +9890,9 @@
   unittest.group('obj-schema-StreamingComputationTask', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamingComputationTask();
-      var od = api.StreamingComputationTask.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamingComputationTask.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamingComputationTask(od as api.StreamingComputationTask);
     });
   });
@@ -9622,7 +9900,9 @@
   unittest.group('obj-schema-StreamingConfigTask', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamingConfigTask();
-      var od = api.StreamingConfigTask.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamingConfigTask.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamingConfigTask(od as api.StreamingConfigTask);
     });
   });
@@ -9630,7 +9910,9 @@
   unittest.group('obj-schema-StreamingSetupTask', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamingSetupTask();
-      var od = api.StreamingSetupTask.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamingSetupTask.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamingSetupTask(od as api.StreamingSetupTask);
     });
   });
@@ -9638,7 +9920,9 @@
   unittest.group('obj-schema-StreamingSideInputLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamingSideInputLocation();
-      var od = api.StreamingSideInputLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamingSideInputLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamingSideInputLocation(od as api.StreamingSideInputLocation);
     });
   });
@@ -9646,7 +9930,9 @@
   unittest.group('obj-schema-StreamingStageLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamingStageLocation();
-      var od = api.StreamingStageLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamingStageLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamingStageLocation(od as api.StreamingStageLocation);
     });
   });
@@ -9654,7 +9940,9 @@
   unittest.group('obj-schema-StringList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStringList();
-      var od = api.StringList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.StringList.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStringList(od as api.StringList);
     });
   });
@@ -9662,7 +9950,9 @@
   unittest.group('obj-schema-StructuredMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStructuredMessage();
-      var od = api.StructuredMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StructuredMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStructuredMessage(od as api.StructuredMessage);
     });
   });
@@ -9670,7 +9960,9 @@
   unittest.group('obj-schema-TaskRunnerSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTaskRunnerSettings();
-      var od = api.TaskRunnerSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TaskRunnerSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTaskRunnerSettings(od as api.TaskRunnerSettings);
     });
   });
@@ -9678,7 +9970,9 @@
   unittest.group('obj-schema-TemplateMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTemplateMetadata();
-      var od = api.TemplateMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TemplateMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTemplateMetadata(od as api.TemplateMetadata);
     });
   });
@@ -9686,7 +9980,9 @@
   unittest.group('obj-schema-TemplateVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTemplateVersion();
-      var od = api.TemplateVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TemplateVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTemplateVersion(od as api.TemplateVersion);
     });
   });
@@ -9694,7 +9990,9 @@
   unittest.group('obj-schema-TopologyConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTopologyConfig();
-      var od = api.TopologyConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TopologyConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTopologyConfig(od as api.TopologyConfig);
     });
   });
@@ -9702,7 +10000,9 @@
   unittest.group('obj-schema-TransformSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTransformSummary();
-      var od = api.TransformSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TransformSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTransformSummary(od as api.TransformSummary);
     });
   });
@@ -9710,7 +10010,9 @@
   unittest.group('obj-schema-ValidateResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildValidateResponse();
-      var od = api.ValidateResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ValidateResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkValidateResponse(od as api.ValidateResponse);
     });
   });
@@ -9718,7 +10020,9 @@
   unittest.group('obj-schema-WorkItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkItem();
-      var od = api.WorkItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WorkItem.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWorkItem(od as api.WorkItem);
     });
   });
@@ -9726,7 +10030,9 @@
   unittest.group('obj-schema-WorkItemDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkItemDetails();
-      var od = api.WorkItemDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkItemDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkItemDetails(od as api.WorkItemDetails);
     });
   });
@@ -9734,7 +10040,9 @@
   unittest.group('obj-schema-WorkItemServiceState', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkItemServiceState();
-      var od = api.WorkItemServiceState.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkItemServiceState.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkItemServiceState(od as api.WorkItemServiceState);
     });
   });
@@ -9742,7 +10050,9 @@
   unittest.group('obj-schema-WorkItemStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkItemStatus();
-      var od = api.WorkItemStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkItemStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkItemStatus(od as api.WorkItemStatus);
     });
   });
@@ -9750,7 +10060,9 @@
   unittest.group('obj-schema-WorkerDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerDetails();
-      var od = api.WorkerDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerDetails(od as api.WorkerDetails);
     });
   });
@@ -9758,7 +10070,9 @@
   unittest.group('obj-schema-WorkerHealthReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerHealthReport();
-      var od = api.WorkerHealthReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerHealthReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerHealthReport(od as api.WorkerHealthReport);
     });
   });
@@ -9766,7 +10080,9 @@
   unittest.group('obj-schema-WorkerHealthReportResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerHealthReportResponse();
-      var od = api.WorkerHealthReportResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerHealthReportResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerHealthReportResponse(od as api.WorkerHealthReportResponse);
     });
   });
@@ -9774,7 +10090,9 @@
   unittest.group('obj-schema-WorkerLifecycleEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerLifecycleEvent();
-      var od = api.WorkerLifecycleEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerLifecycleEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerLifecycleEvent(od as api.WorkerLifecycleEvent);
     });
   });
@@ -9782,7 +10100,9 @@
   unittest.group('obj-schema-WorkerMessage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerMessage();
-      var od = api.WorkerMessage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerMessage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerMessage(od as api.WorkerMessage);
     });
   });
@@ -9790,7 +10110,9 @@
   unittest.group('obj-schema-WorkerMessageCode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerMessageCode();
-      var od = api.WorkerMessageCode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerMessageCode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerMessageCode(od as api.WorkerMessageCode);
     });
   });
@@ -9798,7 +10120,9 @@
   unittest.group('obj-schema-WorkerMessageResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerMessageResponse();
-      var od = api.WorkerMessageResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerMessageResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerMessageResponse(od as api.WorkerMessageResponse);
     });
   });
@@ -9806,7 +10130,9 @@
   unittest.group('obj-schema-WorkerPool', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerPool();
-      var od = api.WorkerPool.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WorkerPool.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWorkerPool(od as api.WorkerPool);
     });
   });
@@ -9814,7 +10140,9 @@
   unittest.group('obj-schema-WorkerSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerSettings();
-      var od = api.WorkerSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerSettings(od as api.WorkerSettings);
     });
   });
@@ -9822,7 +10150,9 @@
   unittest.group('obj-schema-WorkerShutdownNotice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerShutdownNotice();
-      var od = api.WorkerShutdownNotice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerShutdownNotice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerShutdownNotice(od as api.WorkerShutdownNotice);
     });
   });
@@ -9830,7 +10160,9 @@
   unittest.group('obj-schema-WorkerShutdownNoticeResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerShutdownNoticeResponse();
-      var od = api.WorkerShutdownNoticeResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerShutdownNoticeResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerShutdownNoticeResponse(od as api.WorkerShutdownNoticeResponse);
     });
   });
@@ -9838,7 +10170,9 @@
   unittest.group('obj-schema-WriteInstruction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWriteInstruction();
-      var od = api.WriteInstruction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WriteInstruction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWriteInstruction(od as api.WriteInstruction);
     });
   });
diff --git a/generated/googleapis_beta/test/datalabeling/v1beta1_test.dart b/generated/googleapis_beta/test/datalabeling/v1beta1_test.dart
index 17b44b3..3e8f217 100644
--- a/generated/googleapis_beta/test/datalabeling/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/datalabeling/v1beta1_test.dart
@@ -7539,9 +7539,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1CreateInstructionMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1CreateInstructionMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1CreateInstructionMetadata(
           od as api.GoogleCloudDatalabelingV1alpha1CreateInstructionMetadata);
     });
@@ -7552,8 +7553,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1ExportDataOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1alpha1ExportDataOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1ExportDataOperationMetadata(
           od as api.GoogleCloudDatalabelingV1alpha1ExportDataOperationMetadata);
     });
@@ -7564,8 +7566,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1ExportDataOperationResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1alpha1ExportDataOperationResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1ExportDataOperationResponse(
           od as api.GoogleCloudDatalabelingV1alpha1ExportDataOperationResponse);
     });
@@ -7575,8 +7578,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1GcsDestination();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1alpha1GcsDestination.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1GcsDestination(
           od as api.GoogleCloudDatalabelingV1alpha1GcsDestination);
     });
@@ -7586,8 +7590,9 @@
       'obj-schema-GoogleCloudDatalabelingV1alpha1GcsFolderDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1GcsFolderDestination();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1alpha1GcsFolderDestination.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1GcsFolderDestination(
           od as api.GoogleCloudDatalabelingV1alpha1GcsFolderDestination);
     });
@@ -7597,9 +7602,10 @@
       'obj-schema-GoogleCloudDatalabelingV1alpha1HumanAnnotationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1HumanAnnotationConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1HumanAnnotationConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1HumanAnnotationConfig(
           od as api.GoogleCloudDatalabelingV1alpha1HumanAnnotationConfig);
     });
@@ -7610,8 +7616,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1ImportDataOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1alpha1ImportDataOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1ImportDataOperationMetadata(
           od as api.GoogleCloudDatalabelingV1alpha1ImportDataOperationMetadata);
     });
@@ -7622,8 +7629,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1ImportDataOperationResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1alpha1ImportDataOperationResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1ImportDataOperationResponse(
           od as api.GoogleCloudDatalabelingV1alpha1ImportDataOperationResponse);
     });
@@ -7635,9 +7643,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelImageBoundingBoxOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelImageBoundingBoxOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelImageBoundingBoxOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1alpha1LabelImageBoundingBoxOperationMetadata);
@@ -7650,9 +7659,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelImageBoundingPolyOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelImageBoundingPolyOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelImageBoundingPolyOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1alpha1LabelImageBoundingPolyOperationMetadata);
@@ -7665,9 +7675,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelImageClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelImageClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelImageClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1alpha1LabelImageClassificationOperationMetadata);
@@ -7680,9 +7691,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelImageOrientedBoundingBoxOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelImageOrientedBoundingBoxOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelImageOrientedBoundingBoxOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1alpha1LabelImageOrientedBoundingBoxOperationMetadata);
@@ -7695,9 +7707,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelImagePolylineOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelImagePolylineOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelImagePolylineOperationMetadata(od
           as api
               .GoogleCloudDatalabelingV1alpha1LabelImagePolylineOperationMetadata);
@@ -7710,9 +7723,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelImageSegmentationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelImageSegmentationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelImageSegmentationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1alpha1LabelImageSegmentationOperationMetadata);
@@ -7723,9 +7737,10 @@
       'obj-schema-GoogleCloudDatalabelingV1alpha1LabelOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1LabelOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelOperationMetadata(
           od as api.GoogleCloudDatalabelingV1alpha1LabelOperationMetadata);
     });
@@ -7734,8 +7749,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1alpha1LabelStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1LabelStats();
-      var od =
-          api.GoogleCloudDatalabelingV1alpha1LabelStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1alpha1LabelStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelStats(
           od as api.GoogleCloudDatalabelingV1alpha1LabelStats);
     });
@@ -7747,9 +7763,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelTextClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelTextClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelTextClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1alpha1LabelTextClassificationOperationMetadata);
@@ -7762,9 +7779,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelTextEntityExtractionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelTextEntityExtractionOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelTextEntityExtractionOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1alpha1LabelTextEntityExtractionOperationMetadata);
@@ -7777,9 +7795,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelVideoClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelVideoClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelVideoClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1alpha1LabelVideoClassificationOperationMetadata);
@@ -7792,9 +7811,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelVideoEventOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelVideoEventOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelVideoEventOperationMetadata(od
           as api
               .GoogleCloudDatalabelingV1alpha1LabelVideoEventOperationMetadata);
@@ -7807,9 +7827,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelVideoObjectDetectionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelVideoObjectDetectionOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelVideoObjectDetectionOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1alpha1LabelVideoObjectDetectionOperationMetadata);
@@ -7822,9 +7843,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1alpha1LabelVideoObjectTrackingOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1alpha1LabelVideoObjectTrackingOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1LabelVideoObjectTrackingOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1alpha1LabelVideoObjectTrackingOperationMetadata);
@@ -7834,8 +7856,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1alpha1OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1alpha1OutputConfig();
-      var od =
-          api.GoogleCloudDatalabelingV1alpha1OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1alpha1OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1alpha1OutputConfig(
           od as api.GoogleCloudDatalabelingV1alpha1OutputConfig);
     });
@@ -7845,8 +7868,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1AnnotatedDataset();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1AnnotatedDataset.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1AnnotatedDataset(
           od as api.GoogleCloudDatalabelingV1beta1AnnotatedDataset);
     });
@@ -7856,9 +7880,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1AnnotatedDatasetMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1AnnotatedDatasetMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1AnnotatedDatasetMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1AnnotatedDatasetMetadata(
           od as api.GoogleCloudDatalabelingV1beta1AnnotatedDatasetMetadata);
     });
@@ -7867,8 +7892,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1Annotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1Annotation();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1Annotation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1Annotation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1Annotation(
           od as api.GoogleCloudDatalabelingV1beta1Annotation);
     });
@@ -7878,8 +7904,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1AnnotationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1AnnotationMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1AnnotationMetadata(
           od as api.GoogleCloudDatalabelingV1beta1AnnotationMetadata);
     });
@@ -7888,8 +7915,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1AnnotationSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1AnnotationSpec();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1AnnotationSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1AnnotationSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1AnnotationSpec(
           od as api.GoogleCloudDatalabelingV1beta1AnnotationSpec);
     });
@@ -7899,8 +7927,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1AnnotationSpecSet();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1AnnotationSpecSet.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1AnnotationSpecSet(
           od as api.GoogleCloudDatalabelingV1beta1AnnotationSpecSet);
     });
@@ -7910,9 +7939,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1AnnotationSpecSetConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1AnnotationSpecSetConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1AnnotationSpecSetConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1AnnotationSpecSetConfig(
           od as api.GoogleCloudDatalabelingV1beta1AnnotationSpecSetConfig);
     });
@@ -7922,8 +7952,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1AnnotationValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1AnnotationValue.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1AnnotationValue(
           od as api.GoogleCloudDatalabelingV1beta1AnnotationValue);
     });
@@ -7932,7 +7963,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1Attempt', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1Attempt();
-      var od = api.GoogleCloudDatalabelingV1beta1Attempt.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1Attempt.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1Attempt(
           od as api.GoogleCloudDatalabelingV1beta1Attempt);
     });
@@ -7941,8 +7974,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1BigQuerySource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1BigQuerySource();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1BigQuerySource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1BigQuerySource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1BigQuerySource(
           od as api.GoogleCloudDatalabelingV1beta1BigQuerySource);
     });
@@ -7953,8 +7987,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1BoundingBoxEvaluationOptions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1BoundingBoxEvaluationOptions
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1BoundingBoxEvaluationOptions(
           od as api.GoogleCloudDatalabelingV1beta1BoundingBoxEvaluationOptions);
     });
@@ -7963,8 +7998,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1BoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1BoundingPoly();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1BoundingPoly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1BoundingPoly.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1BoundingPoly(
           od as api.GoogleCloudDatalabelingV1beta1BoundingPoly);
     });
@@ -7974,8 +8010,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1BoundingPolyConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1BoundingPolyConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1BoundingPolyConfig(
           od as api.GoogleCloudDatalabelingV1beta1BoundingPolyConfig);
     });
@@ -7985,9 +8022,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ClassificationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ClassificationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1ClassificationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ClassificationMetadata(
           od as api.GoogleCloudDatalabelingV1beta1ClassificationMetadata);
     });
@@ -7997,8 +8035,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ClassificationMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ClassificationMetrics();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ClassificationMetrics.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ClassificationMetrics(
           od as api.GoogleCloudDatalabelingV1beta1ClassificationMetrics);
     });
@@ -8008,9 +8047,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ConfidenceMetricsEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ConfidenceMetricsEntry();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1ConfidenceMetricsEntry.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ConfidenceMetricsEntry(
           od as api.GoogleCloudDatalabelingV1beta1ConfidenceMetricsEntry);
     });
@@ -8020,8 +8060,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ConfusionMatrix();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ConfusionMatrix.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ConfusionMatrix(
           od as api.GoogleCloudDatalabelingV1beta1ConfusionMatrix);
     });
@@ -8031,8 +8072,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ConfusionMatrixEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ConfusionMatrixEntry();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ConfusionMatrixEntry.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ConfusionMatrixEntry(
           od as api.GoogleCloudDatalabelingV1beta1ConfusionMatrixEntry);
     });
@@ -8044,8 +8086,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1CreateAnnotationSpecSetRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1CreateAnnotationSpecSetRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1CreateAnnotationSpecSetRequest(od
           as api.GoogleCloudDatalabelingV1beta1CreateAnnotationSpecSetRequest);
     });
@@ -8055,8 +8098,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1CreateDatasetRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1CreateDatasetRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1CreateDatasetRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1CreateDatasetRequest(
           od as api.GoogleCloudDatalabelingV1beta1CreateDatasetRequest);
     });
@@ -8067,9 +8111,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1CreateEvaluationJobRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1CreateEvaluationJobRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1CreateEvaluationJobRequest(
           od as api.GoogleCloudDatalabelingV1beta1CreateEvaluationJobRequest);
     });
@@ -8079,9 +8124,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1CreateInstructionMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1CreateInstructionMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1CreateInstructionMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1CreateInstructionMetadata(
           od as api.GoogleCloudDatalabelingV1beta1CreateInstructionMetadata);
     });
@@ -8091,9 +8137,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1CreateInstructionRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1CreateInstructionRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1CreateInstructionRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1CreateInstructionRequest(
           od as api.GoogleCloudDatalabelingV1beta1CreateInstructionRequest);
     });
@@ -8102,8 +8149,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1CsvInstruction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1CsvInstruction();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1CsvInstruction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1CsvInstruction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1CsvInstruction(
           od as api.GoogleCloudDatalabelingV1beta1CsvInstruction);
     });
@@ -8112,7 +8160,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1DataItem', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1DataItem();
-      var od = api.GoogleCloudDatalabelingV1beta1DataItem.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1DataItem.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1DataItem(
           od as api.GoogleCloudDatalabelingV1beta1DataItem);
     });
@@ -8121,7 +8171,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1Dataset', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1Dataset();
-      var od = api.GoogleCloudDatalabelingV1beta1Dataset.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1Dataset.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1Dataset(
           od as api.GoogleCloudDatalabelingV1beta1Dataset);
     });
@@ -8130,8 +8182,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1Evaluation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1Evaluation();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1Evaluation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1Evaluation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1Evaluation(
           od as api.GoogleCloudDatalabelingV1beta1Evaluation);
     });
@@ -8141,8 +8194,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1EvaluationConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1EvaluationConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1EvaluationConfig(
           od as api.GoogleCloudDatalabelingV1beta1EvaluationConfig);
     });
@@ -8151,8 +8205,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1EvaluationJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1EvaluationJob();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1EvaluationJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1EvaluationJob.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1EvaluationJob(
           od as api.GoogleCloudDatalabelingV1beta1EvaluationJob);
     });
@@ -8162,9 +8217,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1EvaluationJobAlertConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1EvaluationJobAlertConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1EvaluationJobAlertConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1EvaluationJobAlertConfig(
           od as api.GoogleCloudDatalabelingV1beta1EvaluationJobAlertConfig);
     });
@@ -8174,8 +8230,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1EvaluationJobConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1EvaluationJobConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1EvaluationJobConfig(
           od as api.GoogleCloudDatalabelingV1beta1EvaluationJobConfig);
     });
@@ -8185,8 +8242,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1EvaluationMetrics();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1EvaluationMetrics.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1EvaluationMetrics(
           od as api.GoogleCloudDatalabelingV1beta1EvaluationMetrics);
     });
@@ -8195,8 +8253,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1EventConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1EventConfig();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1EventConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1EventConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1EventConfig(
           od as api.GoogleCloudDatalabelingV1beta1EventConfig);
     });
@@ -8205,7 +8264,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1Example', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1Example();
-      var od = api.GoogleCloudDatalabelingV1beta1Example.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1Example.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1Example(
           od as api.GoogleCloudDatalabelingV1beta1Example);
     });
@@ -8215,8 +8276,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ExampleComparison();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ExampleComparison.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ExampleComparison(
           od as api.GoogleCloudDatalabelingV1beta1ExampleComparison);
     });
@@ -8227,8 +8289,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ExportDataOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ExportDataOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ExportDataOperationMetadata(
           od as api.GoogleCloudDatalabelingV1beta1ExportDataOperationMetadata);
     });
@@ -8239,8 +8302,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ExportDataOperationResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ExportDataOperationResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ExportDataOperationResponse(
           od as api.GoogleCloudDatalabelingV1beta1ExportDataOperationResponse);
     });
@@ -8250,8 +8314,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ExportDataRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ExportDataRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ExportDataRequest(
           od as api.GoogleCloudDatalabelingV1beta1ExportDataRequest);
     });
@@ -8261,8 +8326,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1FeedbackMessage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1FeedbackMessage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1FeedbackMessage(
           od as api.GoogleCloudDatalabelingV1beta1FeedbackMessage);
     });
@@ -8271,8 +8337,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1FeedbackThread', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1FeedbackThread();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1FeedbackThread.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1FeedbackThread.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1FeedbackThread(
           od as api.GoogleCloudDatalabelingV1beta1FeedbackThread);
     });
@@ -8282,9 +8349,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1FeedbackThreadMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1FeedbackThreadMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1FeedbackThreadMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1FeedbackThreadMetadata(
           od as api.GoogleCloudDatalabelingV1beta1FeedbackThreadMetadata);
     });
@@ -8293,8 +8361,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1GcsDestination();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1GcsDestination(
           od as api.GoogleCloudDatalabelingV1beta1GcsDestination);
     });
@@ -8304,8 +8373,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1GcsFolderDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1GcsFolderDestination();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1GcsFolderDestination.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1GcsFolderDestination(
           od as api.GoogleCloudDatalabelingV1beta1GcsFolderDestination);
     });
@@ -8314,7 +8384,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1GcsSource();
-      var od = api.GoogleCloudDatalabelingV1beta1GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1GcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1GcsSource(
           od as api.GoogleCloudDatalabelingV1beta1GcsSource);
     });
@@ -8324,8 +8396,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1HumanAnnotationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1HumanAnnotationConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1HumanAnnotationConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1HumanAnnotationConfig(
           od as api.GoogleCloudDatalabelingV1beta1HumanAnnotationConfig);
     });
@@ -8336,8 +8409,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ImageBoundingPolyAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ImageBoundingPolyAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ImageBoundingPolyAnnotation(
           od as api.GoogleCloudDatalabelingV1beta1ImageBoundingPolyAnnotation);
     });
@@ -8349,8 +8423,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1ImageClassificationAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ImageClassificationAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ImageClassificationAnnotation(od
           as api.GoogleCloudDatalabelingV1beta1ImageClassificationAnnotation);
     });
@@ -8360,9 +8435,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ImageClassificationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ImageClassificationConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1ImageClassificationConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ImageClassificationConfig(
           od as api.GoogleCloudDatalabelingV1beta1ImageClassificationConfig);
     });
@@ -8371,8 +8447,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1ImagePayload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ImagePayload();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1ImagePayload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1ImagePayload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ImagePayload(
           od as api.GoogleCloudDatalabelingV1beta1ImagePayload);
     });
@@ -8382,9 +8459,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ImagePolylineAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ImagePolylineAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1ImagePolylineAnnotation.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ImagePolylineAnnotation(
           od as api.GoogleCloudDatalabelingV1beta1ImagePolylineAnnotation);
     });
@@ -8395,8 +8473,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ImageSegmentationAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ImageSegmentationAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ImageSegmentationAnnotation(
           od as api.GoogleCloudDatalabelingV1beta1ImageSegmentationAnnotation);
     });
@@ -8407,8 +8486,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ImportDataOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ImportDataOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ImportDataOperationMetadata(
           od as api.GoogleCloudDatalabelingV1beta1ImportDataOperationMetadata);
     });
@@ -8419,8 +8499,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ImportDataOperationResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ImportDataOperationResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ImportDataOperationResponse(
           od as api.GoogleCloudDatalabelingV1beta1ImportDataOperationResponse);
     });
@@ -8430,8 +8511,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ImportDataRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ImportDataRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ImportDataRequest(
           od as api.GoogleCloudDatalabelingV1beta1ImportDataRequest);
     });
@@ -8440,8 +8522,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1InputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1InputConfig();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1InputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1InputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1InputConfig(
           od as api.GoogleCloudDatalabelingV1beta1InputConfig);
     });
@@ -8450,8 +8533,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1Instruction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1Instruction();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1Instruction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1Instruction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1Instruction(
           od as api.GoogleCloudDatalabelingV1beta1Instruction);
     });
@@ -8463,9 +8547,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelImageBoundingBoxOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelImageBoundingBoxOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelImageBoundingBoxOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1beta1LabelImageBoundingBoxOperationMetadata);
@@ -8478,9 +8563,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelImageBoundingPolyOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelImageBoundingPolyOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelImageBoundingPolyOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1beta1LabelImageBoundingPolyOperationMetadata);
@@ -8493,9 +8579,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelImageClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelImageClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelImageClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1beta1LabelImageClassificationOperationMetadata);
@@ -8508,9 +8595,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelImageOrientedBoundingBoxOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelImageOrientedBoundingBoxOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelImageOrientedBoundingBoxOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1beta1LabelImageOrientedBoundingBoxOperationMetadata);
@@ -8523,9 +8611,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelImagePolylineOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelImagePolylineOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelImagePolylineOperationMetadata(od
           as api
               .GoogleCloudDatalabelingV1beta1LabelImagePolylineOperationMetadata);
@@ -8536,8 +8625,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1LabelImageRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1LabelImageRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelImageRequest(
           od as api.GoogleCloudDatalabelingV1beta1LabelImageRequest);
     });
@@ -8549,9 +8639,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelImageSegmentationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelImageSegmentationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelImageSegmentationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1beta1LabelImageSegmentationOperationMetadata);
@@ -8562,9 +8653,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1LabelOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1LabelOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelOperationMetadata(
           od as api.GoogleCloudDatalabelingV1beta1LabelOperationMetadata);
     });
@@ -8573,8 +8665,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1LabelStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1LabelStats();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1LabelStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1LabelStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelStats(
           od as api.GoogleCloudDatalabelingV1beta1LabelStats);
     });
@@ -8586,9 +8679,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelTextClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelTextClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelTextClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1beta1LabelTextClassificationOperationMetadata);
@@ -8601,9 +8695,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelTextEntityExtractionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelTextEntityExtractionOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelTextEntityExtractionOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1beta1LabelTextEntityExtractionOperationMetadata);
@@ -8614,8 +8709,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1LabelTextRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1LabelTextRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelTextRequest(
           od as api.GoogleCloudDatalabelingV1beta1LabelTextRequest);
     });
@@ -8627,9 +8723,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelVideoClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelVideoClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelVideoClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1beta1LabelVideoClassificationOperationMetadata);
@@ -8642,9 +8739,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelVideoEventOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelVideoEventOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelVideoEventOperationMetadata(od
           as api
               .GoogleCloudDatalabelingV1beta1LabelVideoEventOperationMetadata);
@@ -8657,9 +8755,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelVideoObjectDetectionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelVideoObjectDetectionOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelVideoObjectDetectionOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1beta1LabelVideoObjectDetectionOperationMetadata);
@@ -8672,9 +8771,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1LabelVideoObjectTrackingOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1LabelVideoObjectTrackingOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelVideoObjectTrackingOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1beta1LabelVideoObjectTrackingOperationMetadata);
@@ -8685,8 +8785,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1LabelVideoRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1LabelVideoRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1LabelVideoRequest(
           od as api.GoogleCloudDatalabelingV1beta1LabelVideoRequest);
     });
@@ -8698,8 +8799,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1ListAnnotatedDatasetsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ListAnnotatedDatasetsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ListAnnotatedDatasetsResponse(od
           as api.GoogleCloudDatalabelingV1beta1ListAnnotatedDatasetsResponse);
     });
@@ -8711,8 +8813,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1ListAnnotationSpecSetsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ListAnnotationSpecSetsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ListAnnotationSpecSetsResponse(od
           as api.GoogleCloudDatalabelingV1beta1ListAnnotationSpecSetsResponse);
     });
@@ -8722,8 +8825,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ListDataItemsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ListDataItemsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ListDataItemsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ListDataItemsResponse(
           od as api.GoogleCloudDatalabelingV1beta1ListDataItemsResponse);
     });
@@ -8733,8 +8837,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ListDatasetsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ListDatasetsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ListDatasetsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ListDatasetsResponse(
           od as api.GoogleCloudDatalabelingV1beta1ListDatasetsResponse);
     });
@@ -8745,9 +8850,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ListEvaluationJobsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1ListEvaluationJobsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ListEvaluationJobsResponse(
           od as api.GoogleCloudDatalabelingV1beta1ListEvaluationJobsResponse);
     });
@@ -8757,8 +8863,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ListExamplesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ListExamplesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ListExamplesResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ListExamplesResponse(
           od as api.GoogleCloudDatalabelingV1beta1ListExamplesResponse);
     });
@@ -8769,8 +8876,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ListFeedbackMessagesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ListFeedbackMessagesResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ListFeedbackMessagesResponse(
           od as api.GoogleCloudDatalabelingV1beta1ListFeedbackMessagesResponse);
     });
@@ -8781,8 +8889,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ListFeedbackThreadsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ListFeedbackThreadsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ListFeedbackThreadsResponse(
           od as api.GoogleCloudDatalabelingV1beta1ListFeedbackThreadsResponse);
     });
@@ -8792,9 +8901,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ListInstructionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ListInstructionsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1ListInstructionsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ListInstructionsResponse(
           od as api.GoogleCloudDatalabelingV1beta1ListInstructionsResponse);
     });
@@ -8804,9 +8914,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1NormalizedBoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1NormalizedBoundingPoly();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1NormalizedBoundingPoly.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1NormalizedBoundingPoly(
           od as api.GoogleCloudDatalabelingV1beta1NormalizedBoundingPoly);
     });
@@ -8816,8 +8927,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1NormalizedPolyline();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1NormalizedPolyline.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1NormalizedPolyline(
           od as api.GoogleCloudDatalabelingV1beta1NormalizedPolyline);
     });
@@ -8827,8 +8939,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1NormalizedVertex();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1NormalizedVertex.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1NormalizedVertex(
           od as api.GoogleCloudDatalabelingV1beta1NormalizedVertex);
     });
@@ -8838,8 +8951,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ObjectDetectionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ObjectDetectionConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ObjectDetectionConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ObjectDetectionConfig(
           od as api.GoogleCloudDatalabelingV1beta1ObjectDetectionConfig);
     });
@@ -8849,9 +8963,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ObjectDetectionMetrics', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ObjectDetectionMetrics();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1ObjectDetectionMetrics.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ObjectDetectionMetrics(
           od as api.GoogleCloudDatalabelingV1beta1ObjectDetectionMetrics);
     });
@@ -8861,8 +8976,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1ObjectTrackingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ObjectTrackingConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ObjectTrackingConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ObjectTrackingConfig(
           od as api.GoogleCloudDatalabelingV1beta1ObjectTrackingConfig);
     });
@@ -8872,8 +8988,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ObjectTrackingFrame();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1ObjectTrackingFrame.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ObjectTrackingFrame(
           od as api.GoogleCloudDatalabelingV1beta1ObjectTrackingFrame);
     });
@@ -8883,9 +9000,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1OperatorFeedbackMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1OperatorFeedbackMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1OperatorFeedbackMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1OperatorFeedbackMetadata(
           od as api.GoogleCloudDatalabelingV1beta1OperatorFeedbackMetadata);
     });
@@ -8895,8 +9013,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1OperatorMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1OperatorMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1OperatorMetadata(
           od as api.GoogleCloudDatalabelingV1beta1OperatorMetadata);
     });
@@ -8905,8 +9024,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1OutputConfig();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1OutputConfig(
           od as api.GoogleCloudDatalabelingV1beta1OutputConfig);
     });
@@ -8916,9 +9036,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1PauseEvaluationJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1PauseEvaluationJobRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1PauseEvaluationJobRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1PauseEvaluationJobRequest(
           od as api.GoogleCloudDatalabelingV1beta1PauseEvaluationJobRequest);
     });
@@ -8927,8 +9048,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1PdfInstruction', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1PdfInstruction();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1PdfInstruction.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1PdfInstruction.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1PdfInstruction(
           od as api.GoogleCloudDatalabelingV1beta1PdfInstruction);
     });
@@ -8937,7 +9059,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1Polyline', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1Polyline();
-      var od = api.GoogleCloudDatalabelingV1beta1Polyline.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1Polyline.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1Polyline(
           od as api.GoogleCloudDatalabelingV1beta1Polyline);
     });
@@ -8946,8 +9070,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1PolylineConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1PolylineConfig();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1PolylineConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1PolylineConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1PolylineConfig(
           od as api.GoogleCloudDatalabelingV1beta1PolylineConfig);
     });
@@ -8956,7 +9081,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1PrCurve', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1PrCurve();
-      var od = api.GoogleCloudDatalabelingV1beta1PrCurve.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1PrCurve.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1PrCurve(
           od as api.GoogleCloudDatalabelingV1beta1PrCurve);
     });
@@ -8966,9 +9093,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1RequesterFeedbackMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1RequesterFeedbackMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1RequesterFeedbackMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1RequesterFeedbackMetadata(
           od as api.GoogleCloudDatalabelingV1beta1RequesterFeedbackMetadata);
     });
@@ -8979,9 +9107,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1ResumeEvaluationJobRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1ResumeEvaluationJobRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1ResumeEvaluationJobRequest(
           od as api.GoogleCloudDatalabelingV1beta1ResumeEvaluationJobRequest);
     });
@@ -8990,7 +9119,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1Row', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1Row();
-      var od = api.GoogleCloudDatalabelingV1beta1Row.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1Row.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1Row(
           od as api.GoogleCloudDatalabelingV1beta1Row);
     });
@@ -9000,9 +9131,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1SearchEvaluationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1SearchEvaluationsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1SearchEvaluationsResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1SearchEvaluationsResponse(
           od as api.GoogleCloudDatalabelingV1beta1SearchEvaluationsResponse);
     });
@@ -9014,8 +9146,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1SearchExampleComparisonsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1SearchExampleComparisonsRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1SearchExampleComparisonsRequest(od
           as api.GoogleCloudDatalabelingV1beta1SearchExampleComparisonsRequest);
     });
@@ -9027,9 +9160,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1SearchExampleComparisonsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1SearchExampleComparisonsResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1SearchExampleComparisonsResponse(od
           as api
               .GoogleCloudDatalabelingV1beta1SearchExampleComparisonsResponse);
@@ -9040,8 +9174,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1SegmentationConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1SegmentationConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1SegmentationConfig(
           od as api.GoogleCloudDatalabelingV1beta1SegmentationConfig);
     });
@@ -9051,8 +9186,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1SentimentConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1SentimentConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1SentimentConfig(
           od as api.GoogleCloudDatalabelingV1beta1SentimentConfig);
     });
@@ -9062,8 +9198,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1SequentialSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1SequentialSegment.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1SequentialSegment(
           od as api.GoogleCloudDatalabelingV1beta1SequentialSegment);
     });
@@ -9074,8 +9211,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1TextClassificationAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1TextClassificationAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1TextClassificationAnnotation(
           od as api.GoogleCloudDatalabelingV1beta1TextClassificationAnnotation);
     });
@@ -9085,9 +9223,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1TextClassificationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1TextClassificationConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1TextClassificationConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1TextClassificationConfig(
           od as api.GoogleCloudDatalabelingV1beta1TextClassificationConfig);
     });
@@ -9099,8 +9238,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1TextEntityExtractionAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1TextEntityExtractionAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1TextEntityExtractionAnnotation(od
           as api.GoogleCloudDatalabelingV1beta1TextEntityExtractionAnnotation);
     });
@@ -9111,9 +9251,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1TextEntityExtractionConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1TextEntityExtractionConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1TextEntityExtractionConfig(
           od as api.GoogleCloudDatalabelingV1beta1TextEntityExtractionConfig);
     });
@@ -9122,8 +9263,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1TextMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1TextMetadata();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1TextMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1TextMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1TextMetadata(
           od as api.GoogleCloudDatalabelingV1beta1TextMetadata);
     });
@@ -9132,8 +9274,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1TextPayload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1TextPayload();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1TextPayload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1TextPayload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1TextPayload(
           od as api.GoogleCloudDatalabelingV1beta1TextPayload);
     });
@@ -9142,8 +9285,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1TimeSegment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1TimeSegment();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1TimeSegment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1TimeSegment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1TimeSegment(
           od as api.GoogleCloudDatalabelingV1beta1TimeSegment);
     });
@@ -9152,7 +9296,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1Vertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1Vertex();
-      var od = api.GoogleCloudDatalabelingV1beta1Vertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1Vertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1Vertex(
           od as api.GoogleCloudDatalabelingV1beta1Vertex);
     });
@@ -9164,8 +9310,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1VideoClassificationAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1VideoClassificationAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1VideoClassificationAnnotation(od
           as api.GoogleCloudDatalabelingV1beta1VideoClassificationAnnotation);
     });
@@ -9175,9 +9322,10 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1VideoClassificationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1VideoClassificationConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1beta1VideoClassificationConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1VideoClassificationConfig(
           od as api.GoogleCloudDatalabelingV1beta1VideoClassificationConfig);
     });
@@ -9187,8 +9335,9 @@
       'obj-schema-GoogleCloudDatalabelingV1beta1VideoEventAnnotation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1VideoEventAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1VideoEventAnnotation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1VideoEventAnnotation(
           od as api.GoogleCloudDatalabelingV1beta1VideoEventAnnotation);
     });
@@ -9200,8 +9349,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1beta1VideoObjectTrackingAnnotation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1beta1VideoObjectTrackingAnnotation
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1VideoObjectTrackingAnnotation(od
           as api.GoogleCloudDatalabelingV1beta1VideoObjectTrackingAnnotation);
     });
@@ -9210,8 +9360,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1VideoPayload', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1VideoPayload();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1VideoPayload.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1VideoPayload.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1VideoPayload(
           od as api.GoogleCloudDatalabelingV1beta1VideoPayload);
     });
@@ -9220,8 +9371,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1beta1VideoThumbnail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1beta1VideoThumbnail();
-      var od =
-          api.GoogleCloudDatalabelingV1beta1VideoThumbnail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1beta1VideoThumbnail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1beta1VideoThumbnail(
           od as api.GoogleCloudDatalabelingV1beta1VideoThumbnail);
     });
@@ -9232,8 +9384,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p1alpha1CreateInstructionMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p1alpha1CreateInstructionMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1CreateInstructionMetadata(
           od as api.GoogleCloudDatalabelingV1p1alpha1CreateInstructionMetadata);
     });
@@ -9245,8 +9398,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1ExportDataOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p1alpha1ExportDataOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1ExportDataOperationMetadata(od
           as api.GoogleCloudDatalabelingV1p1alpha1ExportDataOperationMetadata);
     });
@@ -9258,8 +9412,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1ExportDataOperationResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p1alpha1ExportDataOperationResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1ExportDataOperationResponse(od
           as api.GoogleCloudDatalabelingV1p1alpha1ExportDataOperationResponse);
     });
@@ -9269,8 +9424,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p1alpha1GcsDestination();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p1alpha1GcsDestination.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1GcsDestination(
           od as api.GoogleCloudDatalabelingV1p1alpha1GcsDestination);
     });
@@ -9280,9 +9436,10 @@
       'obj-schema-GoogleCloudDatalabelingV1p1alpha1GcsFolderDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p1alpha1GcsFolderDestination();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1GcsFolderDestination.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1GcsFolderDestination(
           od as api.GoogleCloudDatalabelingV1p1alpha1GcsFolderDestination);
     });
@@ -9294,9 +9451,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1GenerateAnalysisReportOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1GenerateAnalysisReportOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1GenerateAnalysisReportOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1GenerateAnalysisReportOperationMetadata);
@@ -9307,9 +9465,10 @@
       'obj-schema-GoogleCloudDatalabelingV1p1alpha1HumanAnnotationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p1alpha1HumanAnnotationConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1HumanAnnotationConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1HumanAnnotationConfig(
           od as api.GoogleCloudDatalabelingV1p1alpha1HumanAnnotationConfig);
     });
@@ -9321,8 +9480,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1ImportDataOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p1alpha1ImportDataOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1ImportDataOperationMetadata(od
           as api.GoogleCloudDatalabelingV1p1alpha1ImportDataOperationMetadata);
     });
@@ -9334,8 +9494,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1ImportDataOperationResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p1alpha1ImportDataOperationResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1ImportDataOperationResponse(od
           as api.GoogleCloudDatalabelingV1p1alpha1ImportDataOperationResponse);
     });
@@ -9347,9 +9508,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelImageBoundingBoxOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelImageBoundingBoxOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelImageBoundingBoxOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelImageBoundingBoxOperationMetadata);
@@ -9362,9 +9524,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelImageBoundingPolyOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelImageBoundingPolyOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelImageBoundingPolyOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelImageBoundingPolyOperationMetadata);
@@ -9377,9 +9540,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelImageClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelImageClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelImageClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelImageClassificationOperationMetadata);
@@ -9392,9 +9556,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelImageOrientedBoundingBoxOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelImageOrientedBoundingBoxOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelImageOrientedBoundingBoxOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelImageOrientedBoundingBoxOperationMetadata);
@@ -9407,9 +9572,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelImagePolylineOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelImagePolylineOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelImagePolylineOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelImagePolylineOperationMetadata);
@@ -9422,9 +9588,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelImageSegmentationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelImageSegmentationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelImageSegmentationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelImageSegmentationOperationMetadata);
@@ -9435,9 +9602,10 @@
       'obj-schema-GoogleCloudDatalabelingV1p1alpha1LabelOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p1alpha1LabelOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelOperationMetadata(
           od as api.GoogleCloudDatalabelingV1p1alpha1LabelOperationMetadata);
     });
@@ -9446,8 +9614,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1p1alpha1LabelStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p1alpha1LabelStats();
-      var od =
-          api.GoogleCloudDatalabelingV1p1alpha1LabelStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1p1alpha1LabelStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelStats(
           od as api.GoogleCloudDatalabelingV1p1alpha1LabelStats);
     });
@@ -9459,9 +9628,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelTextClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelTextClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelTextClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelTextClassificationOperationMetadata);
@@ -9474,9 +9644,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelTextEntityExtractionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelTextEntityExtractionOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelTextEntityExtractionOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelTextEntityExtractionOperationMetadata);
@@ -9489,9 +9660,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelVideoClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelVideoClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelVideoClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelVideoClassificationOperationMetadata);
@@ -9504,9 +9676,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelVideoEventOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelVideoEventOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelVideoEventOperationMetadata(od
           as api
               .GoogleCloudDatalabelingV1p1alpha1LabelVideoEventOperationMetadata);
@@ -9519,9 +9692,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelVideoObjectDetectionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelVideoObjectDetectionOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelVideoObjectDetectionOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelVideoObjectDetectionOperationMetadata);
@@ -9534,9 +9708,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p1alpha1LabelVideoObjectTrackingOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p1alpha1LabelVideoObjectTrackingOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1LabelVideoObjectTrackingOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p1alpha1LabelVideoObjectTrackingOperationMetadata);
@@ -9547,8 +9722,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p1alpha1OutputConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p1alpha1OutputConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p1alpha1OutputConfig(
           od as api.GoogleCloudDatalabelingV1p1alpha1OutputConfig);
     });
@@ -9559,8 +9735,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p2alpha1CreateInstructionMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p2alpha1CreateInstructionMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1CreateInstructionMetadata(
           od as api.GoogleCloudDatalabelingV1p2alpha1CreateInstructionMetadata);
     });
@@ -9572,8 +9749,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1ExportDataOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p2alpha1ExportDataOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1ExportDataOperationMetadata(od
           as api.GoogleCloudDatalabelingV1p2alpha1ExportDataOperationMetadata);
     });
@@ -9585,8 +9763,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1ExportDataOperationResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p2alpha1ExportDataOperationResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1ExportDataOperationResponse(od
           as api.GoogleCloudDatalabelingV1p2alpha1ExportDataOperationResponse);
     });
@@ -9596,8 +9775,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p2alpha1GcsDestination();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p2alpha1GcsDestination.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1GcsDestination(
           od as api.GoogleCloudDatalabelingV1p2alpha1GcsDestination);
     });
@@ -9607,9 +9787,10 @@
       'obj-schema-GoogleCloudDatalabelingV1p2alpha1GcsFolderDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p2alpha1GcsFolderDestination();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1GcsFolderDestination.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1GcsFolderDestination(
           od as api.GoogleCloudDatalabelingV1p2alpha1GcsFolderDestination);
     });
@@ -9619,9 +9800,10 @@
       'obj-schema-GoogleCloudDatalabelingV1p2alpha1HumanAnnotationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p2alpha1HumanAnnotationConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1HumanAnnotationConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1HumanAnnotationConfig(
           od as api.GoogleCloudDatalabelingV1p2alpha1HumanAnnotationConfig);
     });
@@ -9633,8 +9815,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1ImportDataOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p2alpha1ImportDataOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1ImportDataOperationMetadata(od
           as api.GoogleCloudDatalabelingV1p2alpha1ImportDataOperationMetadata);
     });
@@ -9646,8 +9829,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1ImportDataOperationResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p2alpha1ImportDataOperationResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1ImportDataOperationResponse(od
           as api.GoogleCloudDatalabelingV1p2alpha1ImportDataOperationResponse);
     });
@@ -9659,9 +9843,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelImageBoundingBoxOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelImageBoundingBoxOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelImageBoundingBoxOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelImageBoundingBoxOperationMetadata);
@@ -9674,9 +9859,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelImageBoundingPolyOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelImageBoundingPolyOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelImageBoundingPolyOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelImageBoundingPolyOperationMetadata);
@@ -9689,9 +9875,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelImageClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelImageClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelImageClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelImageClassificationOperationMetadata);
@@ -9704,9 +9891,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelImageOrientedBoundingBoxOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelImageOrientedBoundingBoxOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelImageOrientedBoundingBoxOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelImageOrientedBoundingBoxOperationMetadata);
@@ -9719,9 +9907,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelImagePolylineOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelImagePolylineOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelImagePolylineOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelImagePolylineOperationMetadata);
@@ -9734,9 +9923,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelImageSegmentationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelImageSegmentationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelImageSegmentationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelImageSegmentationOperationMetadata);
@@ -9747,9 +9937,10 @@
       'obj-schema-GoogleCloudDatalabelingV1p2alpha1LabelOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p2alpha1LabelOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelOperationMetadata(
           od as api.GoogleCloudDatalabelingV1p2alpha1LabelOperationMetadata);
     });
@@ -9758,8 +9949,9 @@
   unittest.group('obj-schema-GoogleCloudDatalabelingV1p2alpha1LabelStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p2alpha1LabelStats();
-      var od =
-          api.GoogleCloudDatalabelingV1p2alpha1LabelStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDatalabelingV1p2alpha1LabelStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelStats(
           od as api.GoogleCloudDatalabelingV1p2alpha1LabelStats);
     });
@@ -9771,9 +9963,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelTextClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelTextClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelTextClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelTextClassificationOperationMetadata);
@@ -9786,9 +9979,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelTextEntityExtractionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelTextEntityExtractionOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelTextEntityExtractionOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelTextEntityExtractionOperationMetadata);
@@ -9801,9 +9995,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelVideoClassificationOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelVideoClassificationOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelVideoClassificationOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelVideoClassificationOperationMetadata);
@@ -9816,9 +10011,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelVideoEventOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelVideoEventOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelVideoEventOperationMetadata(od
           as api
               .GoogleCloudDatalabelingV1p2alpha1LabelVideoEventOperationMetadata);
@@ -9831,9 +10027,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelVideoObjectDetectionOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelVideoObjectDetectionOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelVideoObjectDetectionOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelVideoObjectDetectionOperationMetadata);
@@ -9846,9 +10043,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDatalabelingV1p2alpha1LabelVideoObjectTrackingOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDatalabelingV1p2alpha1LabelVideoObjectTrackingOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1LabelVideoObjectTrackingOperationMetadata(
           od as api
               .GoogleCloudDatalabelingV1p2alpha1LabelVideoObjectTrackingOperationMetadata);
@@ -9859,8 +10057,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDatalabelingV1p2alpha1OutputConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDatalabelingV1p2alpha1OutputConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDatalabelingV1p2alpha1OutputConfig(
           od as api.GoogleCloudDatalabelingV1p2alpha1OutputConfig);
     });
@@ -9869,7 +10068,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -9878,7 +10079,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -9886,7 +10089,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -9894,7 +10099,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
diff --git a/generated/googleapis_beta/test/datamigration/v1beta1_test.dart b/generated/googleapis_beta/test/datamigration/v1beta1_test.dart
index 69efd83..89128ff 100644
--- a/generated/googleapis_beta/test/datamigration/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/datamigration/v1beta1_test.dart
@@ -1759,7 +1759,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1767,7 +1769,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1775,7 +1779,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1783,7 +1789,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -1791,7 +1799,9 @@
   unittest.group('obj-schema-CloudSqlConnectionProfile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudSqlConnectionProfile();
-      var od = api.CloudSqlConnectionProfile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudSqlConnectionProfile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudSqlConnectionProfile(od as api.CloudSqlConnectionProfile);
     });
   });
@@ -1799,7 +1809,9 @@
   unittest.group('obj-schema-CloudSqlSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudSqlSettings();
-      var od = api.CloudSqlSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudSqlSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudSqlSettings(od as api.CloudSqlSettings);
     });
   });
@@ -1807,7 +1819,9 @@
   unittest.group('obj-schema-ConnectionProfile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConnectionProfile();
-      var od = api.ConnectionProfile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConnectionProfile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConnectionProfile(od as api.ConnectionProfile);
     });
   });
@@ -1815,7 +1829,9 @@
   unittest.group('obj-schema-DatabaseType', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabaseType();
-      var od = api.DatabaseType.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatabaseType.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatabaseType(od as api.DatabaseType);
     });
   });
@@ -1823,7 +1839,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1831,7 +1848,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1839,7 +1857,9 @@
   unittest.group('obj-schema-GenerateSshScriptRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGenerateSshScriptRequest();
-      var od = api.GenerateSshScriptRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GenerateSshScriptRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGenerateSshScriptRequest(od as api.GenerateSshScriptRequest);
     });
   });
@@ -1847,8 +1867,9 @@
   unittest.group('obj-schema-GoogleCloudClouddmsV1beta1OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudClouddmsV1beta1OperationMetadata();
-      var od =
-          api.GoogleCloudClouddmsV1beta1OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudClouddmsV1beta1OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudClouddmsV1beta1OperationMetadata(
           od as api.GoogleCloudClouddmsV1beta1OperationMetadata);
     });
@@ -1857,7 +1878,9 @@
   unittest.group('obj-schema-ListConnectionProfilesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListConnectionProfilesResponse();
-      var od = api.ListConnectionProfilesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListConnectionProfilesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListConnectionProfilesResponse(
           od as api.ListConnectionProfilesResponse);
     });
@@ -1866,7 +1889,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1874,7 +1899,9 @@
   unittest.group('obj-schema-ListMigrationJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMigrationJobsResponse();
-      var od = api.ListMigrationJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMigrationJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMigrationJobsResponse(od as api.ListMigrationJobsResponse);
     });
   });
@@ -1882,7 +1909,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1890,7 +1919,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1898,7 +1929,9 @@
   unittest.group('obj-schema-MigrationJob', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMigrationJob();
-      var od = api.MigrationJob.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MigrationJob.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMigrationJob(od as api.MigrationJob);
     });
   });
@@ -1906,7 +1939,9 @@
   unittest.group('obj-schema-MigrationJobVerificationError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMigrationJobVerificationError();
-      var od = api.MigrationJobVerificationError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MigrationJobVerificationError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMigrationJobVerificationError(
           od as api.MigrationJobVerificationError);
     });
@@ -1915,7 +1950,9 @@
   unittest.group('obj-schema-MySqlConnectionProfile', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMySqlConnectionProfile();
-      var od = api.MySqlConnectionProfile.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MySqlConnectionProfile.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMySqlConnectionProfile(od as api.MySqlConnectionProfile);
     });
   });
@@ -1923,7 +1960,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1931,7 +1970,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1939,7 +1980,9 @@
   unittest.group('obj-schema-PromoteMigrationJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPromoteMigrationJobRequest();
-      var od = api.PromoteMigrationJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PromoteMigrationJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPromoteMigrationJobRequest(od as api.PromoteMigrationJobRequest);
     });
   });
@@ -1947,7 +1990,9 @@
   unittest.group('obj-schema-RestartMigrationJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestartMigrationJobRequest();
-      var od = api.RestartMigrationJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestartMigrationJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestartMigrationJobRequest(od as api.RestartMigrationJobRequest);
     });
   });
@@ -1955,7 +2000,9 @@
   unittest.group('obj-schema-ResumeMigrationJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResumeMigrationJobRequest();
-      var od = api.ResumeMigrationJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResumeMigrationJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResumeMigrationJobRequest(od as api.ResumeMigrationJobRequest);
     });
   });
@@ -1963,7 +2010,9 @@
   unittest.group('obj-schema-ReverseSshConnectivity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReverseSshConnectivity();
-      var od = api.ReverseSshConnectivity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReverseSshConnectivity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReverseSshConnectivity(od as api.ReverseSshConnectivity);
     });
   });
@@ -1971,7 +2020,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1979,7 +2030,9 @@
   unittest.group('obj-schema-SqlAclEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSqlAclEntry();
-      var od = api.SqlAclEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SqlAclEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSqlAclEntry(od as api.SqlAclEntry);
     });
   });
@@ -1987,7 +2040,9 @@
   unittest.group('obj-schema-SqlIpConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSqlIpConfig();
-      var od = api.SqlIpConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SqlIpConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSqlIpConfig(od as api.SqlIpConfig);
     });
   });
@@ -1995,7 +2050,9 @@
   unittest.group('obj-schema-SshScript', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSshScript();
-      var od = api.SshScript.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SshScript.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSshScript(od as api.SshScript);
     });
   });
@@ -2003,7 +2060,9 @@
   unittest.group('obj-schema-SslConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslConfig();
-      var od = api.SslConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SslConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSslConfig(od as api.SslConfig);
     });
   });
@@ -2011,7 +2070,9 @@
   unittest.group('obj-schema-StartMigrationJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartMigrationJobRequest();
-      var od = api.StartMigrationJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartMigrationJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartMigrationJobRequest(od as api.StartMigrationJobRequest);
     });
   });
@@ -2019,7 +2080,9 @@
   unittest.group('obj-schema-StaticIpConnectivity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStaticIpConnectivity();
-      var od = api.StaticIpConnectivity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StaticIpConnectivity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStaticIpConnectivity(od as api.StaticIpConnectivity);
     });
   });
@@ -2027,7 +2090,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2035,7 +2100,9 @@
   unittest.group('obj-schema-StopMigrationJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStopMigrationJobRequest();
-      var od = api.StopMigrationJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StopMigrationJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStopMigrationJobRequest(od as api.StopMigrationJobRequest);
     });
   });
@@ -2043,7 +2110,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2051,7 +2120,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -2059,7 +2130,9 @@
   unittest.group('obj-schema-VerifyMigrationJobRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVerifyMigrationJobRequest();
-      var od = api.VerifyMigrationJobRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VerifyMigrationJobRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVerifyMigrationJobRequest(od as api.VerifyMigrationJobRequest);
     });
   });
@@ -2067,7 +2140,9 @@
   unittest.group('obj-schema-VmCreationConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVmCreationConfig();
-      var od = api.VmCreationConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VmCreationConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVmCreationConfig(od as api.VmCreationConfig);
     });
   });
@@ -2075,7 +2150,9 @@
   unittest.group('obj-schema-VmSelectionConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVmSelectionConfig();
-      var od = api.VmSelectionConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VmSelectionConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVmSelectionConfig(od as api.VmSelectionConfig);
     });
   });
@@ -2083,7 +2160,9 @@
   unittest.group('obj-schema-VpcPeeringConnectivity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVpcPeeringConnectivity();
-      var od = api.VpcPeeringConnectivity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VpcPeeringConnectivity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVpcPeeringConnectivity(od as api.VpcPeeringConnectivity);
     });
   });
diff --git a/generated/googleapis_beta/test/documentai/v1beta3_test.dart b/generated/googleapis_beta/test/documentai/v1beta3_test.dart
index 22f6dfb..42687b8 100644
--- a/generated/googleapis_beta/test/documentai/v1beta3_test.dart
+++ b/generated/googleapis_beta/test/documentai/v1beta3_test.dart
@@ -8138,9 +8138,10 @@
       'obj-schema-GoogleCloudDocumentaiUiv1beta3CommonOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiUiv1beta3CommonOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3CommonOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3CommonOperationMetadata(
           od as api.GoogleCloudDocumentaiUiv1beta3CommonOperationMetadata);
     });
@@ -8152,9 +8153,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3CreateLabelerPoolOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3CreateLabelerPoolOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3CreateLabelerPoolOperationMetadata(od
           as api
               .GoogleCloudDocumentaiUiv1beta3CreateLabelerPoolOperationMetadata);
@@ -8167,9 +8169,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3DeleteLabelerPoolOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3DeleteLabelerPoolOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3DeleteLabelerPoolOperationMetadata(od
           as api
               .GoogleCloudDocumentaiUiv1beta3DeleteLabelerPoolOperationMetadata);
@@ -8180,9 +8183,10 @@
       'obj-schema-GoogleCloudDocumentaiUiv1beta3DeleteProcessorMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiUiv1beta3DeleteProcessorMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3DeleteProcessorMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3DeleteProcessorMetadata(
           od as api.GoogleCloudDocumentaiUiv1beta3DeleteProcessorMetadata);
     });
@@ -8194,8 +8198,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3DeleteProcessorVersionMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiUiv1beta3DeleteProcessorVersionMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3DeleteProcessorVersionMetadata(od
           as api.GoogleCloudDocumentaiUiv1beta3DeleteProcessorVersionMetadata);
     });
@@ -8207,8 +8212,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3DeployProcessorVersionMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiUiv1beta3DeployProcessorVersionMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3DeployProcessorVersionMetadata(od
           as api.GoogleCloudDocumentaiUiv1beta3DeployProcessorVersionMetadata);
     });
@@ -8220,8 +8226,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3DeployProcessorVersionResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiUiv1beta3DeployProcessorVersionResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3DeployProcessorVersionResponse(od
           as api.GoogleCloudDocumentaiUiv1beta3DeployProcessorVersionResponse);
     });
@@ -8231,9 +8238,10 @@
       'obj-schema-GoogleCloudDocumentaiUiv1beta3DisableProcessorMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiUiv1beta3DisableProcessorMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3DisableProcessorMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3DisableProcessorMetadata(
           od as api.GoogleCloudDocumentaiUiv1beta3DisableProcessorMetadata);
     });
@@ -8243,9 +8251,10 @@
       'obj-schema-GoogleCloudDocumentaiUiv1beta3DisableProcessorResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiUiv1beta3DisableProcessorResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3DisableProcessorResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3DisableProcessorResponse(
           od as api.GoogleCloudDocumentaiUiv1beta3DisableProcessorResponse);
     });
@@ -8255,9 +8264,10 @@
       'obj-schema-GoogleCloudDocumentaiUiv1beta3EnableProcessorMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiUiv1beta3EnableProcessorMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3EnableProcessorMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3EnableProcessorMetadata(
           od as api.GoogleCloudDocumentaiUiv1beta3EnableProcessorMetadata);
     });
@@ -8267,9 +8277,10 @@
       'obj-schema-GoogleCloudDocumentaiUiv1beta3EnableProcessorResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiUiv1beta3EnableProcessorResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3EnableProcessorResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3EnableProcessorResponse(
           od as api.GoogleCloudDocumentaiUiv1beta3EnableProcessorResponse);
     });
@@ -8281,9 +8292,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3EvaluateProcessorVersionMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3EvaluateProcessorVersionMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3EvaluateProcessorVersionMetadata(od
           as api
               .GoogleCloudDocumentaiUiv1beta3EvaluateProcessorVersionMetadata);
@@ -8296,9 +8308,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3EvaluateProcessorVersionResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3EvaluateProcessorVersionResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3EvaluateProcessorVersionResponse(od
           as api
               .GoogleCloudDocumentaiUiv1beta3EvaluateProcessorVersionResponse);
@@ -8311,8 +8324,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3TrainProcessorVersionMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiUiv1beta3TrainProcessorVersionMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3TrainProcessorVersionMetadata(od
           as api.GoogleCloudDocumentaiUiv1beta3TrainProcessorVersionMetadata);
     });
@@ -8324,9 +8338,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3TrainProcessorVersionMetadataDatasetValidation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3TrainProcessorVersionMetadataDatasetValidation
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3TrainProcessorVersionMetadataDatasetValidation(
           od as api
               .GoogleCloudDocumentaiUiv1beta3TrainProcessorVersionMetadataDatasetValidation);
@@ -8339,8 +8354,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3TrainProcessorVersionResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiUiv1beta3TrainProcessorVersionResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3TrainProcessorVersionResponse(od
           as api.GoogleCloudDocumentaiUiv1beta3TrainProcessorVersionResponse);
     });
@@ -8352,9 +8368,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3UndeployProcessorVersionMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3UndeployProcessorVersionMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3UndeployProcessorVersionMetadata(od
           as api
               .GoogleCloudDocumentaiUiv1beta3UndeployProcessorVersionMetadata);
@@ -8367,9 +8384,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3UndeployProcessorVersionResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3UndeployProcessorVersionResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3UndeployProcessorVersionResponse(od
           as api
               .GoogleCloudDocumentaiUiv1beta3UndeployProcessorVersionResponse);
@@ -8382,8 +8400,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3UpdateHumanReviewConfigMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiUiv1beta3UpdateHumanReviewConfigMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3UpdateHumanReviewConfigMetadata(od
           as api.GoogleCloudDocumentaiUiv1beta3UpdateHumanReviewConfigMetadata);
     });
@@ -8395,9 +8414,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiUiv1beta3UpdateLabelerPoolOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiUiv1beta3UpdateLabelerPoolOperationMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiUiv1beta3UpdateLabelerPoolOperationMetadata(od
           as api
               .GoogleCloudDocumentaiUiv1beta3UpdateLabelerPoolOperationMetadata);
@@ -8407,8 +8427,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1BatchProcessMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1BatchProcessMetadata();
-      var od =
-          api.GoogleCloudDocumentaiV1BatchProcessMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1BatchProcessMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1BatchProcessMetadata(
           od as api.GoogleCloudDocumentaiV1BatchProcessMetadata);
     });
@@ -8420,9 +8441,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiV1BatchProcessMetadataIndividualProcessStatus();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1BatchProcessMetadataIndividualProcessStatus
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1BatchProcessMetadataIndividualProcessStatus(od
           as api
               .GoogleCloudDocumentaiV1BatchProcessMetadataIndividualProcessStatus);
@@ -8432,8 +8454,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1BatchProcessResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1BatchProcessResponse();
-      var od =
-          api.GoogleCloudDocumentaiV1BatchProcessResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1BatchProcessResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1BatchProcessResponse(
           od as api.GoogleCloudDocumentaiV1BatchProcessResponse);
     });
@@ -8443,8 +8466,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1CommonOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1CommonOperationMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1CommonOperationMetadata(
           od as api.GoogleCloudDocumentaiV1CommonOperationMetadata);
     });
@@ -8453,8 +8477,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1HumanReviewStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1HumanReviewStatus();
-      var od =
-          api.GoogleCloudDocumentaiV1HumanReviewStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1HumanReviewStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1HumanReviewStatus(
           od as api.GoogleCloudDocumentaiV1HumanReviewStatus);
     });
@@ -8464,9 +8489,10 @@
       'obj-schema-GoogleCloudDocumentaiV1ReviewDocumentOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1ReviewDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1ReviewDocumentOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1ReviewDocumentOperationMetadata(
           od as api.GoogleCloudDocumentaiV1ReviewDocumentOperationMetadata);
     });
@@ -8476,8 +8502,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1ReviewDocumentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1ReviewDocumentResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1ReviewDocumentResponse(
           od as api.GoogleCloudDocumentaiV1ReviewDocumentResponse);
     });
@@ -8488,8 +8515,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1BatchProcessDocumentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1BatchProcessDocumentsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1BatchProcessDocumentsResponse(
           od as api.GoogleCloudDocumentaiV1beta1BatchProcessDocumentsResponse);
     });
@@ -8498,8 +8526,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1BoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1BoundingPoly();
-      var od =
-          api.GoogleCloudDocumentaiV1beta1BoundingPoly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1BoundingPoly.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1BoundingPoly(
           od as api.GoogleCloudDocumentaiV1beta1BoundingPoly);
     });
@@ -8508,7 +8537,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1Document', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1Document();
-      var od = api.GoogleCloudDocumentaiV1beta1Document.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1Document.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1Document(
           od as api.GoogleCloudDocumentaiV1beta1Document);
     });
@@ -8517,8 +8548,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1DocumentEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentEntity();
-      var od =
-          api.GoogleCloudDocumentaiV1beta1DocumentEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1DocumentEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentEntity(
           od as api.GoogleCloudDocumentaiV1beta1DocumentEntity);
     });
@@ -8529,8 +8561,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentEntityNormalizedValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentEntityNormalizedValue
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentEntityNormalizedValue(
           od as api.GoogleCloudDocumentaiV1beta1DocumentEntityNormalizedValue);
     });
@@ -8540,8 +8573,9 @@
       'obj-schema-GoogleCloudDocumentaiV1beta1DocumentEntityRelation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentEntityRelation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentEntityRelation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentEntityRelation(
           od as api.GoogleCloudDocumentaiV1beta1DocumentEntityRelation);
     });
@@ -8550,8 +8584,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1DocumentPage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPage();
-      var od =
-          api.GoogleCloudDocumentaiV1beta1DocumentPage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1DocumentPage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPage(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPage);
     });
@@ -8561,8 +8596,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageAnchor();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageAnchor.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageAnchor(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageAnchor);
     });
@@ -8572,9 +8608,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta1DocumentPageAnchorPageRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageAnchorPageRef();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta1DocumentPageAnchorPageRef.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageAnchorPageRef(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageAnchorPageRef);
     });
@@ -8584,8 +8621,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageBlock();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageBlock.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageBlock(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageBlock);
     });
@@ -8596,9 +8634,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageDetectedLanguage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta1DocumentPageDetectedLanguage.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageDetectedLanguage(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageDetectedLanguage);
     });
@@ -8608,8 +8647,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageDimension();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageDimension.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageDimension(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageDimension);
     });
@@ -8619,8 +8659,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageFormField();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageFormField.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageFormField(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageFormField);
     });
@@ -8630,8 +8671,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageImage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageImage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageImage(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageImage);
     });
@@ -8641,8 +8683,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageLayout();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageLayout.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageLayout(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageLayout);
     });
@@ -8651,8 +8694,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1DocumentPageLine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageLine();
-      var od =
-          api.GoogleCloudDocumentaiV1beta1DocumentPageLine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1DocumentPageLine.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageLine(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageLine);
     });
@@ -8662,8 +8706,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageMatrix();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageMatrix.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageMatrix(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageMatrix);
     });
@@ -8673,8 +8718,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageParagraph();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageParagraph.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageParagraph(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageParagraph);
     });
@@ -8684,8 +8730,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageTable();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageTable.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageTable(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageTable);
     });
@@ -8695,9 +8742,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta1DocumentPageTableTableCell', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageTableTableCell();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta1DocumentPageTableTableCell.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageTableTableCell(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageTableTableCell);
     });
@@ -8707,9 +8755,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta1DocumentPageTableTableRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageTableTableRow();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta1DocumentPageTableTableRow.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageTableTableRow(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageTableTableRow);
     });
@@ -8719,8 +8768,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageToken();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageToken.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageToken(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageToken);
     });
@@ -8731,8 +8781,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageTokenDetectedBreak();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentPageTokenDetectedBreak
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageTokenDetectedBreak(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageTokenDetectedBreak);
     });
@@ -8742,9 +8793,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta1DocumentPageVisualElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentPageVisualElement();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta1DocumentPageVisualElement.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentPageVisualElement(
           od as api.GoogleCloudDocumentaiV1beta1DocumentPageVisualElement);
     });
@@ -8754,8 +8806,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentProvenance();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentProvenance.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentProvenance(
           od as api.GoogleCloudDocumentaiV1beta1DocumentProvenance);
     });
@@ -8765,9 +8818,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta1DocumentProvenanceParent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentProvenanceParent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta1DocumentProvenanceParent.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentProvenanceParent(
           od as api.GoogleCloudDocumentaiV1beta1DocumentProvenanceParent);
     });
@@ -8776,8 +8830,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1DocumentRevision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentRevision();
-      var od =
-          api.GoogleCloudDocumentaiV1beta1DocumentRevision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1DocumentRevision.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentRevision(
           od as api.GoogleCloudDocumentaiV1beta1DocumentRevision);
     });
@@ -8787,9 +8842,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta1DocumentRevisionHumanReview', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentRevisionHumanReview();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta1DocumentRevisionHumanReview.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentRevisionHumanReview(
           od as api.GoogleCloudDocumentaiV1beta1DocumentRevisionHumanReview);
     });
@@ -8799,8 +8855,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentShardInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentShardInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentShardInfo(
           od as api.GoogleCloudDocumentaiV1beta1DocumentShardInfo);
     });
@@ -8809,8 +8866,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1DocumentStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentStyle();
-      var od =
-          api.GoogleCloudDocumentaiV1beta1DocumentStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1DocumentStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentStyle(
           od as api.GoogleCloudDocumentaiV1beta1DocumentStyle);
     });
@@ -8820,8 +8878,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentStyleFontSize();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentStyleFontSize.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentStyleFontSize(
           od as api.GoogleCloudDocumentaiV1beta1DocumentStyleFontSize);
     });
@@ -8831,8 +8890,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentTextAnchor();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentTextAnchor.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentTextAnchor(
           od as api.GoogleCloudDocumentaiV1beta1DocumentTextAnchor);
     });
@@ -8843,8 +8903,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentTextAnchorTextSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentTextAnchorTextSegment
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentTextAnchorTextSegment(
           od as api.GoogleCloudDocumentaiV1beta1DocumentTextAnchorTextSegment);
     });
@@ -8854,8 +8915,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentTextChange();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentTextChange.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentTextChange(
           od as api.GoogleCloudDocumentaiV1beta1DocumentTextChange);
     });
@@ -8865,8 +8927,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1DocumentTranslation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1DocumentTranslation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1DocumentTranslation(
           od as api.GoogleCloudDocumentaiV1beta1DocumentTranslation);
     });
@@ -8875,8 +8938,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1GcsDestination();
-      var od =
-          api.GoogleCloudDocumentaiV1beta1GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1GcsDestination(
           od as api.GoogleCloudDocumentaiV1beta1GcsDestination);
     });
@@ -8885,7 +8949,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1GcsSource();
-      var od = api.GoogleCloudDocumentaiV1beta1GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1GcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1GcsSource(
           od as api.GoogleCloudDocumentaiV1beta1GcsSource);
     });
@@ -8894,7 +8960,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1InputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1InputConfig();
-      var od = api.GoogleCloudDocumentaiV1beta1InputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1InputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1InputConfig(
           od as api.GoogleCloudDocumentaiV1beta1InputConfig);
     });
@@ -8903,8 +8971,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1NormalizedVertex();
-      var od =
-          api.GoogleCloudDocumentaiV1beta1NormalizedVertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1NormalizedVertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1NormalizedVertex(
           od as api.GoogleCloudDocumentaiV1beta1NormalizedVertex);
     });
@@ -8914,8 +8983,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1OperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1OperationMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1OperationMetadata(
           od as api.GoogleCloudDocumentaiV1beta1OperationMetadata);
     });
@@ -8924,8 +8994,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1OutputConfig();
-      var od =
-          api.GoogleCloudDocumentaiV1beta1OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1OutputConfig(
           od as api.GoogleCloudDocumentaiV1beta1OutputConfig);
     });
@@ -8935,8 +9006,9 @@
       'obj-schema-GoogleCloudDocumentaiV1beta1ProcessDocumentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1ProcessDocumentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta1ProcessDocumentResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1ProcessDocumentResponse(
           od as api.GoogleCloudDocumentaiV1beta1ProcessDocumentResponse);
     });
@@ -8945,7 +9017,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta1Vertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta1Vertex();
-      var od = api.GoogleCloudDocumentaiV1beta1Vertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta1Vertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta1Vertex(
           od as api.GoogleCloudDocumentaiV1beta1Vertex);
     });
@@ -8956,8 +9030,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2BatchProcessDocumentsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2BatchProcessDocumentsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2BatchProcessDocumentsResponse(
           od as api.GoogleCloudDocumentaiV1beta2BatchProcessDocumentsResponse);
     });
@@ -8966,8 +9041,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2BoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2BoundingPoly();
-      var od =
-          api.GoogleCloudDocumentaiV1beta2BoundingPoly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2BoundingPoly.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2BoundingPoly(
           od as api.GoogleCloudDocumentaiV1beta2BoundingPoly);
     });
@@ -8976,7 +9052,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2Document', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2Document();
-      var od = api.GoogleCloudDocumentaiV1beta2Document.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2Document.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2Document(
           od as api.GoogleCloudDocumentaiV1beta2Document);
     });
@@ -8985,8 +9063,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2DocumentEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentEntity();
-      var od =
-          api.GoogleCloudDocumentaiV1beta2DocumentEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2DocumentEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentEntity(
           od as api.GoogleCloudDocumentaiV1beta2DocumentEntity);
     });
@@ -8997,8 +9076,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentEntityNormalizedValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentEntityNormalizedValue
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentEntityNormalizedValue(
           od as api.GoogleCloudDocumentaiV1beta2DocumentEntityNormalizedValue);
     });
@@ -9008,8 +9088,9 @@
       'obj-schema-GoogleCloudDocumentaiV1beta2DocumentEntityRelation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentEntityRelation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentEntityRelation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentEntityRelation(
           od as api.GoogleCloudDocumentaiV1beta2DocumentEntityRelation);
     });
@@ -9018,8 +9099,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2DocumentLabel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentLabel();
-      var od =
-          api.GoogleCloudDocumentaiV1beta2DocumentLabel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2DocumentLabel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentLabel(
           od as api.GoogleCloudDocumentaiV1beta2DocumentLabel);
     });
@@ -9028,8 +9110,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2DocumentPage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPage();
-      var od =
-          api.GoogleCloudDocumentaiV1beta2DocumentPage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2DocumentPage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPage(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPage);
     });
@@ -9039,8 +9122,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageAnchor();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageAnchor.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageAnchor(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageAnchor);
     });
@@ -9050,9 +9134,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta2DocumentPageAnchorPageRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageAnchorPageRef();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta2DocumentPageAnchorPageRef.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageAnchorPageRef(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageAnchorPageRef);
     });
@@ -9062,8 +9147,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageBlock();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageBlock.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageBlock(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageBlock);
     });
@@ -9074,9 +9160,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageDetectedLanguage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta2DocumentPageDetectedLanguage.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageDetectedLanguage(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageDetectedLanguage);
     });
@@ -9086,8 +9173,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageDimension();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageDimension.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageDimension(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageDimension);
     });
@@ -9097,8 +9185,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageFormField();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageFormField.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageFormField(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageFormField);
     });
@@ -9108,8 +9197,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageImage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageImage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageImage(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageImage);
     });
@@ -9119,8 +9209,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageLayout();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageLayout.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageLayout(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageLayout);
     });
@@ -9129,8 +9220,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2DocumentPageLine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageLine();
-      var od =
-          api.GoogleCloudDocumentaiV1beta2DocumentPageLine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2DocumentPageLine.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageLine(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageLine);
     });
@@ -9140,8 +9232,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageMatrix();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageMatrix.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageMatrix(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageMatrix);
     });
@@ -9151,8 +9244,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageParagraph();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageParagraph.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageParagraph(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageParagraph);
     });
@@ -9162,8 +9256,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageTable();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageTable.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageTable(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageTable);
     });
@@ -9173,9 +9268,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta2DocumentPageTableTableCell', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageTableTableCell();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta2DocumentPageTableTableCell.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageTableTableCell(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageTableTableCell);
     });
@@ -9185,9 +9281,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta2DocumentPageTableTableRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageTableTableRow();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta2DocumentPageTableTableRow.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageTableTableRow(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageTableTableRow);
     });
@@ -9197,8 +9294,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageToken();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageToken.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageToken(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageToken);
     });
@@ -9209,8 +9307,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageTokenDetectedBreak();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentPageTokenDetectedBreak
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageTokenDetectedBreak(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageTokenDetectedBreak);
     });
@@ -9220,9 +9319,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta2DocumentPageVisualElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentPageVisualElement();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta2DocumentPageVisualElement.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentPageVisualElement(
           od as api.GoogleCloudDocumentaiV1beta2DocumentPageVisualElement);
     });
@@ -9232,8 +9332,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentProvenance();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentProvenance.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentProvenance(
           od as api.GoogleCloudDocumentaiV1beta2DocumentProvenance);
     });
@@ -9243,9 +9344,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta2DocumentProvenanceParent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentProvenanceParent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta2DocumentProvenanceParent.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentProvenanceParent(
           od as api.GoogleCloudDocumentaiV1beta2DocumentProvenanceParent);
     });
@@ -9254,8 +9356,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2DocumentRevision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentRevision();
-      var od =
-          api.GoogleCloudDocumentaiV1beta2DocumentRevision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2DocumentRevision.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentRevision(
           od as api.GoogleCloudDocumentaiV1beta2DocumentRevision);
     });
@@ -9265,9 +9368,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta2DocumentRevisionHumanReview', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentRevisionHumanReview();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta2DocumentRevisionHumanReview.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentRevisionHumanReview(
           od as api.GoogleCloudDocumentaiV1beta2DocumentRevisionHumanReview);
     });
@@ -9277,8 +9381,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentShardInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentShardInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentShardInfo(
           od as api.GoogleCloudDocumentaiV1beta2DocumentShardInfo);
     });
@@ -9287,8 +9392,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2DocumentStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentStyle();
-      var od =
-          api.GoogleCloudDocumentaiV1beta2DocumentStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2DocumentStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentStyle(
           od as api.GoogleCloudDocumentaiV1beta2DocumentStyle);
     });
@@ -9298,8 +9404,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentStyleFontSize();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentStyleFontSize.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentStyleFontSize(
           od as api.GoogleCloudDocumentaiV1beta2DocumentStyleFontSize);
     });
@@ -9309,8 +9416,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentTextAnchor();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentTextAnchor.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentTextAnchor(
           od as api.GoogleCloudDocumentaiV1beta2DocumentTextAnchor);
     });
@@ -9321,8 +9429,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentTextAnchorTextSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentTextAnchorTextSegment
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentTextAnchorTextSegment(
           od as api.GoogleCloudDocumentaiV1beta2DocumentTextAnchorTextSegment);
     });
@@ -9332,8 +9441,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentTextChange();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentTextChange.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentTextChange(
           od as api.GoogleCloudDocumentaiV1beta2DocumentTextChange);
     });
@@ -9343,8 +9453,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2DocumentTranslation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2DocumentTranslation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2DocumentTranslation(
           od as api.GoogleCloudDocumentaiV1beta2DocumentTranslation);
     });
@@ -9353,8 +9464,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2GcsDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2GcsDestination();
-      var od =
-          api.GoogleCloudDocumentaiV1beta2GcsDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2GcsDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2GcsDestination(
           od as api.GoogleCloudDocumentaiV1beta2GcsDestination);
     });
@@ -9363,7 +9475,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2GcsSource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2GcsSource();
-      var od = api.GoogleCloudDocumentaiV1beta2GcsSource.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2GcsSource.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2GcsSource(
           od as api.GoogleCloudDocumentaiV1beta2GcsSource);
     });
@@ -9372,7 +9486,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2InputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2InputConfig();
-      var od = api.GoogleCloudDocumentaiV1beta2InputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2InputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2InputConfig(
           od as api.GoogleCloudDocumentaiV1beta2InputConfig);
     });
@@ -9381,8 +9497,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2NormalizedVertex();
-      var od =
-          api.GoogleCloudDocumentaiV1beta2NormalizedVertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2NormalizedVertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2NormalizedVertex(
           od as api.GoogleCloudDocumentaiV1beta2NormalizedVertex);
     });
@@ -9392,8 +9509,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2OperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2OperationMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2OperationMetadata(
           od as api.GoogleCloudDocumentaiV1beta2OperationMetadata);
     });
@@ -9402,8 +9520,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2OutputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2OutputConfig();
-      var od =
-          api.GoogleCloudDocumentaiV1beta2OutputConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2OutputConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2OutputConfig(
           od as api.GoogleCloudDocumentaiV1beta2OutputConfig);
     });
@@ -9413,8 +9532,9 @@
       'obj-schema-GoogleCloudDocumentaiV1beta2ProcessDocumentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2ProcessDocumentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta2ProcessDocumentResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2ProcessDocumentResponse(
           od as api.GoogleCloudDocumentaiV1beta2ProcessDocumentResponse);
     });
@@ -9423,7 +9543,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta2Vertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta2Vertex();
-      var od = api.GoogleCloudDocumentaiV1beta2Vertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta2Vertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta2Vertex(
           od as api.GoogleCloudDocumentaiV1beta2Vertex);
     });
@@ -9433,9 +9555,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta3BatchDocumentsInputConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3BatchDocumentsInputConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3BatchDocumentsInputConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3BatchDocumentsInputConfig(
           od as api.GoogleCloudDocumentaiV1beta3BatchDocumentsInputConfig);
     });
@@ -9445,8 +9568,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3BatchProcessMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3BatchProcessMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3BatchProcessMetadata(
           od as api.GoogleCloudDocumentaiV1beta3BatchProcessMetadata);
     });
@@ -9458,9 +9582,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiV1beta3BatchProcessMetadataIndividualProcessStatus();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3BatchProcessMetadataIndividualProcessStatus
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3BatchProcessMetadataIndividualProcessStatus(
           od as api
               .GoogleCloudDocumentaiV1beta3BatchProcessMetadataIndividualProcessStatus);
@@ -9471,8 +9596,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3BatchProcessRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3BatchProcessRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3BatchProcessRequest(
           od as api.GoogleCloudDocumentaiV1beta3BatchProcessRequest);
     });
@@ -9484,9 +9610,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiV1beta3BatchProcessRequestBatchInputConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3BatchProcessRequestBatchInputConfig
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3BatchProcessRequestBatchInputConfig(od
           as api
               .GoogleCloudDocumentaiV1beta3BatchProcessRequestBatchInputConfig);
@@ -9499,9 +9626,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiV1beta3BatchProcessRequestBatchOutputConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3BatchProcessRequestBatchOutputConfig
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3BatchProcessRequestBatchOutputConfig(od
           as api
               .GoogleCloudDocumentaiV1beta3BatchProcessRequestBatchOutputConfig);
@@ -9512,8 +9640,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3BatchProcessResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3BatchProcessResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3BatchProcessResponse(
           od as api.GoogleCloudDocumentaiV1beta3BatchProcessResponse);
     });
@@ -9522,8 +9651,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3BoundingPoly', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3BoundingPoly();
-      var od =
-          api.GoogleCloudDocumentaiV1beta3BoundingPoly.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3BoundingPoly.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3BoundingPoly(
           od as api.GoogleCloudDocumentaiV1beta3BoundingPoly);
     });
@@ -9533,8 +9663,9 @@
       'obj-schema-GoogleCloudDocumentaiV1beta3CommonOperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3CommonOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3CommonOperationMetadata.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3CommonOperationMetadata(
           od as api.GoogleCloudDocumentaiV1beta3CommonOperationMetadata);
     });
@@ -9543,7 +9674,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3Document', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3Document();
-      var od = api.GoogleCloudDocumentaiV1beta3Document.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3Document.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3Document(
           od as api.GoogleCloudDocumentaiV1beta3Document);
     });
@@ -9552,8 +9685,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3DocumentEntity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentEntity();
-      var od =
-          api.GoogleCloudDocumentaiV1beta3DocumentEntity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3DocumentEntity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentEntity(
           od as api.GoogleCloudDocumentaiV1beta3DocumentEntity);
     });
@@ -9564,8 +9698,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentEntityNormalizedValue();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentEntityNormalizedValue
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentEntityNormalizedValue(
           od as api.GoogleCloudDocumentaiV1beta3DocumentEntityNormalizedValue);
     });
@@ -9575,8 +9710,9 @@
       'obj-schema-GoogleCloudDocumentaiV1beta3DocumentEntityRelation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentEntityRelation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentEntityRelation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentEntityRelation(
           od as api.GoogleCloudDocumentaiV1beta3DocumentEntityRelation);
     });
@@ -9586,8 +9722,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentOutputConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentOutputConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentOutputConfig(
           od as api.GoogleCloudDocumentaiV1beta3DocumentOutputConfig);
     });
@@ -9599,9 +9736,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiV1beta3DocumentOutputConfigGcsOutputConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3DocumentOutputConfigGcsOutputConfig
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentOutputConfigGcsOutputConfig(od
           as api
               .GoogleCloudDocumentaiV1beta3DocumentOutputConfigGcsOutputConfig);
@@ -9611,8 +9749,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3DocumentPage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPage();
-      var od =
-          api.GoogleCloudDocumentaiV1beta3DocumentPage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3DocumentPage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPage(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPage);
     });
@@ -9622,8 +9761,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageAnchor();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageAnchor.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageAnchor(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageAnchor);
     });
@@ -9633,9 +9773,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta3DocumentPageAnchorPageRef', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageAnchorPageRef();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3DocumentPageAnchorPageRef.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageAnchorPageRef(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageAnchorPageRef);
     });
@@ -9645,8 +9786,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageBlock();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageBlock.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageBlock(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageBlock);
     });
@@ -9657,9 +9799,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageDetectedLanguage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3DocumentPageDetectedLanguage.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageDetectedLanguage(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageDetectedLanguage);
     });
@@ -9669,8 +9812,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageDimension();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageDimension.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageDimension(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageDimension);
     });
@@ -9680,8 +9824,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageFormField();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageFormField.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageFormField(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageFormField);
     });
@@ -9691,8 +9836,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageImage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageImage.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageImage(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageImage);
     });
@@ -9702,8 +9848,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageLayout();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageLayout.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageLayout(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageLayout);
     });
@@ -9712,8 +9859,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3DocumentPageLine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageLine();
-      var od =
-          api.GoogleCloudDocumentaiV1beta3DocumentPageLine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3DocumentPageLine.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageLine(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageLine);
     });
@@ -9723,8 +9871,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageMatrix();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageMatrix.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageMatrix(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageMatrix);
     });
@@ -9734,8 +9883,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageParagraph();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageParagraph.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageParagraph(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageParagraph);
     });
@@ -9745,8 +9895,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageTable();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageTable.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageTable(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageTable);
     });
@@ -9756,9 +9907,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta3DocumentPageTableTableCell', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageTableTableCell();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3DocumentPageTableTableCell.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageTableTableCell(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageTableTableCell);
     });
@@ -9768,9 +9920,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta3DocumentPageTableTableRow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageTableTableRow();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3DocumentPageTableTableRow.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageTableTableRow(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageTableTableRow);
     });
@@ -9780,8 +9933,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageToken();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageToken.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageToken(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageToken);
     });
@@ -9792,8 +9946,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageTokenDetectedBreak();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentPageTokenDetectedBreak
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageTokenDetectedBreak(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageTokenDetectedBreak);
     });
@@ -9803,9 +9958,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta3DocumentPageVisualElement', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentPageVisualElement();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3DocumentPageVisualElement.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentPageVisualElement(
           od as api.GoogleCloudDocumentaiV1beta3DocumentPageVisualElement);
     });
@@ -9815,8 +9971,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentProvenance();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentProvenance.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentProvenance(
           od as api.GoogleCloudDocumentaiV1beta3DocumentProvenance);
     });
@@ -9826,9 +9983,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta3DocumentProvenanceParent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentProvenanceParent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3DocumentProvenanceParent.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentProvenanceParent(
           od as api.GoogleCloudDocumentaiV1beta3DocumentProvenanceParent);
     });
@@ -9837,8 +9995,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3DocumentRevision', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentRevision();
-      var od =
-          api.GoogleCloudDocumentaiV1beta3DocumentRevision.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3DocumentRevision.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentRevision(
           od as api.GoogleCloudDocumentaiV1beta3DocumentRevision);
     });
@@ -9848,9 +10007,10 @@
       'obj-schema-GoogleCloudDocumentaiV1beta3DocumentRevisionHumanReview', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentRevisionHumanReview();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudDocumentaiV1beta3DocumentRevisionHumanReview.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentRevisionHumanReview(
           od as api.GoogleCloudDocumentaiV1beta3DocumentRevisionHumanReview);
     });
@@ -9860,8 +10020,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentShardInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentShardInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentShardInfo(
           od as api.GoogleCloudDocumentaiV1beta3DocumentShardInfo);
     });
@@ -9870,8 +10031,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3DocumentStyle', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentStyle();
-      var od =
-          api.GoogleCloudDocumentaiV1beta3DocumentStyle.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3DocumentStyle.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentStyle(
           od as api.GoogleCloudDocumentaiV1beta3DocumentStyle);
     });
@@ -9881,8 +10043,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentStyleFontSize();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentStyleFontSize.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentStyleFontSize(
           od as api.GoogleCloudDocumentaiV1beta3DocumentStyleFontSize);
     });
@@ -9892,8 +10055,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentTextAnchor();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentTextAnchor.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentTextAnchor(
           od as api.GoogleCloudDocumentaiV1beta3DocumentTextAnchor);
     });
@@ -9904,8 +10068,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentTextAnchorTextSegment();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentTextAnchorTextSegment
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentTextAnchorTextSegment(
           od as api.GoogleCloudDocumentaiV1beta3DocumentTextAnchorTextSegment);
     });
@@ -9915,8 +10080,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentTextChange();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentTextChange.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentTextChange(
           od as api.GoogleCloudDocumentaiV1beta3DocumentTextChange);
     });
@@ -9926,8 +10092,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3DocumentTranslation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3DocumentTranslation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3DocumentTranslation(
           od as api.GoogleCloudDocumentaiV1beta3DocumentTranslation);
     });
@@ -9936,7 +10103,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3GcsDocument', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3GcsDocument();
-      var od = api.GoogleCloudDocumentaiV1beta3GcsDocument.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3GcsDocument.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3GcsDocument(
           od as api.GoogleCloudDocumentaiV1beta3GcsDocument);
     });
@@ -9945,8 +10114,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3GcsDocuments', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3GcsDocuments();
-      var od =
-          api.GoogleCloudDocumentaiV1beta3GcsDocuments.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3GcsDocuments.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3GcsDocuments(
           od as api.GoogleCloudDocumentaiV1beta3GcsDocuments);
     });
@@ -9955,7 +10125,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3GcsPrefix', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3GcsPrefix();
-      var od = api.GoogleCloudDocumentaiV1beta3GcsPrefix.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3GcsPrefix.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3GcsPrefix(
           od as api.GoogleCloudDocumentaiV1beta3GcsPrefix);
     });
@@ -9965,8 +10137,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3HumanReviewStatus();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3HumanReviewStatus.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3HumanReviewStatus(
           od as api.GoogleCloudDocumentaiV1beta3HumanReviewStatus);
     });
@@ -9975,8 +10148,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3NormalizedVertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3NormalizedVertex();
-      var od =
-          api.GoogleCloudDocumentaiV1beta3NormalizedVertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3NormalizedVertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3NormalizedVertex(
           od as api.GoogleCloudDocumentaiV1beta3NormalizedVertex);
     });
@@ -9985,8 +10159,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3ProcessRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3ProcessRequest();
-      var od =
-          api.GoogleCloudDocumentaiV1beta3ProcessRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3ProcessRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3ProcessRequest(
           od as api.GoogleCloudDocumentaiV1beta3ProcessRequest);
     });
@@ -9995,8 +10170,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3ProcessResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3ProcessResponse();
-      var od =
-          api.GoogleCloudDocumentaiV1beta3ProcessResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3ProcessResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3ProcessResponse(
           od as api.GoogleCloudDocumentaiV1beta3ProcessResponse);
     });
@@ -10005,7 +10181,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3RawDocument', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3RawDocument();
-      var od = api.GoogleCloudDocumentaiV1beta3RawDocument.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3RawDocument.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3RawDocument(
           od as api.GoogleCloudDocumentaiV1beta3RawDocument);
     });
@@ -10017,8 +10195,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudDocumentaiV1beta3ReviewDocumentOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3ReviewDocumentOperationMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3ReviewDocumentOperationMetadata(od
           as api.GoogleCloudDocumentaiV1beta3ReviewDocumentOperationMetadata);
     });
@@ -10028,8 +10207,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3ReviewDocumentRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3ReviewDocumentRequest.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3ReviewDocumentRequest(
           od as api.GoogleCloudDocumentaiV1beta3ReviewDocumentRequest);
     });
@@ -10039,8 +10219,9 @@
       'obj-schema-GoogleCloudDocumentaiV1beta3ReviewDocumentResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3ReviewDocumentResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudDocumentaiV1beta3ReviewDocumentResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3ReviewDocumentResponse(
           od as api.GoogleCloudDocumentaiV1beta3ReviewDocumentResponse);
     });
@@ -10049,7 +10230,9 @@
   unittest.group('obj-schema-GoogleCloudDocumentaiV1beta3Vertex', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudDocumentaiV1beta3Vertex();
-      var od = api.GoogleCloudDocumentaiV1beta3Vertex.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudDocumentaiV1beta3Vertex.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudDocumentaiV1beta3Vertex(
           od as api.GoogleCloudDocumentaiV1beta3Vertex);
     });
@@ -10058,8 +10241,9 @@
   unittest.group('obj-schema-GoogleCloudLocationListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudLocationListLocationsResponse();
-      var od =
-          api.GoogleCloudLocationListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudLocationListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudLocationListLocationsResponse(
           od as api.GoogleCloudLocationListLocationsResponse);
     });
@@ -10068,7 +10252,9 @@
   unittest.group('obj-schema-GoogleCloudLocationLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudLocationLocation();
-      var od = api.GoogleCloudLocationLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudLocationLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudLocationLocation(od as api.GoogleCloudLocationLocation);
     });
   });
@@ -10076,7 +10262,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -10084,7 +10272,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -10092,7 +10282,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
@@ -10100,7 +10292,9 @@
   unittest.group('obj-schema-GoogleTypeColor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeColor();
-      var od = api.GoogleTypeColor.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeColor.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeColor(od as api.GoogleTypeColor);
     });
   });
@@ -10108,7 +10302,9 @@
   unittest.group('obj-schema-GoogleTypeDate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeDate();
-      var od = api.GoogleTypeDate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeDate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeDate(od as api.GoogleTypeDate);
     });
   });
@@ -10116,7 +10312,9 @@
   unittest.group('obj-schema-GoogleTypeDateTime', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeDateTime();
-      var od = api.GoogleTypeDateTime.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeDateTime.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeDateTime(od as api.GoogleTypeDateTime);
     });
   });
@@ -10124,7 +10322,9 @@
   unittest.group('obj-schema-GoogleTypeMoney', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeMoney();
-      var od = api.GoogleTypeMoney.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeMoney.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeMoney(od as api.GoogleTypeMoney);
     });
   });
@@ -10132,7 +10332,9 @@
   unittest.group('obj-schema-GoogleTypePostalAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypePostalAddress();
-      var od = api.GoogleTypePostalAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypePostalAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypePostalAddress(od as api.GoogleTypePostalAddress);
     });
   });
@@ -10140,7 +10342,9 @@
   unittest.group('obj-schema-GoogleTypeTimeZone', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeTimeZone();
-      var od = api.GoogleTypeTimeZone.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeTimeZone.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeTimeZone(od as api.GoogleTypeTimeZone);
     });
   });
diff --git a/generated/googleapis_beta/test/domains/v1beta1_test.dart b/generated/googleapis_beta/test/domains/v1beta1_test.dart
index 18e9cdb..80fc365 100644
--- a/generated/googleapis_beta/test/domains/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/domains/v1beta1_test.dart
@@ -1750,7 +1750,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1758,7 +1760,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1766,7 +1770,9 @@
   unittest.group('obj-schema-AuthorizationCode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuthorizationCode();
-      var od = api.AuthorizationCode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuthorizationCode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuthorizationCode(od as api.AuthorizationCode);
     });
   });
@@ -1774,7 +1780,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1782,7 +1790,9 @@
   unittest.group('obj-schema-ConfigureContactSettingsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigureContactSettingsRequest();
-      var od = api.ConfigureContactSettingsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigureContactSettingsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigureContactSettingsRequest(
           od as api.ConfigureContactSettingsRequest);
     });
@@ -1791,7 +1801,9 @@
   unittest.group('obj-schema-ConfigureDnsSettingsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigureDnsSettingsRequest();
-      var od = api.ConfigureDnsSettingsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigureDnsSettingsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigureDnsSettingsRequest(od as api.ConfigureDnsSettingsRequest);
     });
   });
@@ -1799,7 +1811,9 @@
   unittest.group('obj-schema-ConfigureManagementSettingsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildConfigureManagementSettingsRequest();
-      var od = api.ConfigureManagementSettingsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ConfigureManagementSettingsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkConfigureManagementSettingsRequest(
           od as api.ConfigureManagementSettingsRequest);
     });
@@ -1808,7 +1822,9 @@
   unittest.group('obj-schema-Contact', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContact();
-      var od = api.Contact.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Contact.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkContact(od as api.Contact);
     });
   });
@@ -1816,7 +1832,9 @@
   unittest.group('obj-schema-ContactSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContactSettings();
-      var od = api.ContactSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContactSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContactSettings(od as api.ContactSettings);
     });
   });
@@ -1824,7 +1842,9 @@
   unittest.group('obj-schema-CustomDns', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCustomDns();
-      var od = api.CustomDns.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CustomDns.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCustomDns(od as api.CustomDns);
     });
   });
@@ -1832,7 +1852,9 @@
   unittest.group('obj-schema-DnsSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDnsSettings();
-      var od = api.DnsSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DnsSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDnsSettings(od as api.DnsSettings);
     });
   });
@@ -1840,7 +1862,9 @@
   unittest.group('obj-schema-DsRecord', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDsRecord();
-      var od = api.DsRecord.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.DsRecord.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDsRecord(od as api.DsRecord);
     });
   });
@@ -1848,7 +1872,9 @@
   unittest.group('obj-schema-ExportRegistrationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportRegistrationRequest();
-      var od = api.ExportRegistrationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportRegistrationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportRegistrationRequest(od as api.ExportRegistrationRequest);
     });
   });
@@ -1856,7 +1882,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1864,7 +1891,9 @@
   unittest.group('obj-schema-GlueRecord', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGlueRecord();
-      var od = api.GlueRecord.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.GlueRecord.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGlueRecord(od as api.GlueRecord);
     });
   });
@@ -1872,7 +1901,9 @@
   unittest.group('obj-schema-GoogleDomainsDns', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleDomainsDns();
-      var od = api.GoogleDomainsDns.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleDomainsDns.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleDomainsDns(od as api.GoogleDomainsDns);
     });
   });
@@ -1880,7 +1911,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1888,7 +1921,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1896,7 +1931,9 @@
   unittest.group('obj-schema-ListRegistrationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListRegistrationsResponse();
-      var od = api.ListRegistrationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListRegistrationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListRegistrationsResponse(od as api.ListRegistrationsResponse);
     });
   });
@@ -1904,7 +1941,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1912,7 +1951,9 @@
   unittest.group('obj-schema-ManagementSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManagementSettings();
-      var od = api.ManagementSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ManagementSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkManagementSettings(od as api.ManagementSettings);
     });
   });
@@ -1920,7 +1961,8 @@
   unittest.group('obj-schema-Money', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoney();
-      var od = api.Money.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Money.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMoney(od as api.Money);
     });
   });
@@ -1928,7 +1970,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1936,7 +1980,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -1944,7 +1990,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1952,7 +2000,9 @@
   unittest.group('obj-schema-PostalAddress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPostalAddress();
-      var od = api.PostalAddress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PostalAddress.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPostalAddress(od as api.PostalAddress);
     });
   });
@@ -1960,7 +2010,9 @@
   unittest.group('obj-schema-RegisterDomainRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegisterDomainRequest();
-      var od = api.RegisterDomainRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegisterDomainRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegisterDomainRequest(od as api.RegisterDomainRequest);
     });
   });
@@ -1968,7 +2020,9 @@
   unittest.group('obj-schema-RegisterParameters', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegisterParameters();
-      var od = api.RegisterParameters.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegisterParameters.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegisterParameters(od as api.RegisterParameters);
     });
   });
@@ -1976,7 +2030,9 @@
   unittest.group('obj-schema-Registration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegistration();
-      var od = api.Registration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Registration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegistration(od as api.Registration);
     });
   });
@@ -1984,7 +2040,9 @@
   unittest.group('obj-schema-ResetAuthorizationCodeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResetAuthorizationCodeRequest();
-      var od = api.ResetAuthorizationCodeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResetAuthorizationCodeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResetAuthorizationCodeRequest(
           od as api.ResetAuthorizationCodeRequest);
     });
@@ -1993,7 +2051,9 @@
   unittest.group('obj-schema-RetrieveRegisterParametersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRetrieveRegisterParametersResponse();
-      var od = api.RetrieveRegisterParametersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RetrieveRegisterParametersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRetrieveRegisterParametersResponse(
           od as api.RetrieveRegisterParametersResponse);
     });
@@ -2002,7 +2062,9 @@
   unittest.group('obj-schema-SearchDomainsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchDomainsResponse();
-      var od = api.SearchDomainsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchDomainsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchDomainsResponse(od as api.SearchDomainsResponse);
     });
   });
@@ -2010,7 +2072,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -2018,7 +2082,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2026,7 +2092,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2034,7 +2102,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis_beta/test/factchecktools/v1alpha1_test.dart b/generated/googleapis_beta/test/factchecktools/v1alpha1_test.dart
index da5eedf..74bf174 100644
--- a/generated/googleapis_beta/test/factchecktools/v1alpha1_test.dart
+++ b/generated/googleapis_beta/test/factchecktools/v1alpha1_test.dart
@@ -537,8 +537,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFactcheckingFactchecktoolsV1alpha1Claim();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFactcheckingFactchecktoolsV1alpha1Claim.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFactcheckingFactchecktoolsV1alpha1Claim(
           od as api.GoogleFactcheckingFactchecktoolsV1alpha1Claim);
     });
@@ -548,8 +549,9 @@
       'obj-schema-GoogleFactcheckingFactchecktoolsV1alpha1ClaimAuthor', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFactcheckingFactchecktoolsV1alpha1ClaimAuthor();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimAuthor.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFactcheckingFactchecktoolsV1alpha1ClaimAuthor(
           od as api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimAuthor);
     });
@@ -559,8 +561,9 @@
       'obj-schema-GoogleFactcheckingFactchecktoolsV1alpha1ClaimRating', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFactcheckingFactchecktoolsV1alpha1ClaimRating();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimRating.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFactcheckingFactchecktoolsV1alpha1ClaimRating(
           od as api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimRating);
     });
@@ -570,8 +573,9 @@
       'obj-schema-GoogleFactcheckingFactchecktoolsV1alpha1ClaimReview', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFactcheckingFactchecktoolsV1alpha1ClaimReview();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimReview.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFactcheckingFactchecktoolsV1alpha1ClaimReview(
           od as api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimReview);
     });
@@ -582,8 +586,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewAuthor();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewAuthor
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewAuthor(
           od as api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewAuthor);
     });
@@ -594,8 +599,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewMarkup();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewMarkup
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewMarkup(
           od as api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewMarkup);
     });
@@ -607,8 +613,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewMarkupPage();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewMarkupPage
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewMarkupPage(od
           as api.GoogleFactcheckingFactchecktoolsV1alpha1ClaimReviewMarkupPage);
     });
@@ -620,9 +627,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleFactcheckingFactchecktoolsV1alpha1FactCheckedClaimSearchResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleFactcheckingFactchecktoolsV1alpha1FactCheckedClaimSearchResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFactcheckingFactchecktoolsV1alpha1FactCheckedClaimSearchResponse(
           od as api
               .GoogleFactcheckingFactchecktoolsV1alpha1FactCheckedClaimSearchResponse);
@@ -635,9 +643,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleFactcheckingFactchecktoolsV1alpha1ListClaimReviewMarkupPagesResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleFactcheckingFactchecktoolsV1alpha1ListClaimReviewMarkupPagesResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFactcheckingFactchecktoolsV1alpha1ListClaimReviewMarkupPagesResponse(
           od as api
               .GoogleFactcheckingFactchecktoolsV1alpha1ListClaimReviewMarkupPagesResponse);
@@ -648,8 +657,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleFactcheckingFactchecktoolsV1alpha1Publisher();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleFactcheckingFactchecktoolsV1alpha1Publisher.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleFactcheckingFactchecktoolsV1alpha1Publisher(
           od as api.GoogleFactcheckingFactchecktoolsV1alpha1Publisher);
     });
@@ -658,7 +668,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
diff --git a/generated/googleapis_beta/test/firebase/v1beta1_test.dart b/generated/googleapis_beta/test/firebase/v1beta1_test.dart
index 4662f6c..bbd4b7e 100644
--- a/generated/googleapis_beta/test/firebase/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/firebase/v1beta1_test.dart
@@ -1340,7 +1340,9 @@
   unittest.group('obj-schema-AddFirebaseRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddFirebaseRequest();
-      var od = api.AddFirebaseRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddFirebaseRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddFirebaseRequest(od as api.AddFirebaseRequest);
     });
   });
@@ -1348,7 +1350,9 @@
   unittest.group('obj-schema-AddGoogleAnalyticsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAddGoogleAnalyticsRequest();
-      var od = api.AddGoogleAnalyticsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AddGoogleAnalyticsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAddGoogleAnalyticsRequest(od as api.AddGoogleAnalyticsRequest);
     });
   });
@@ -1356,7 +1360,9 @@
   unittest.group('obj-schema-AdminSdkConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdminSdkConfig();
-      var od = api.AdminSdkConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AdminSdkConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAdminSdkConfig(od as api.AdminSdkConfig);
     });
   });
@@ -1364,7 +1370,9 @@
   unittest.group('obj-schema-AnalyticsDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyticsDetails();
-      var od = api.AnalyticsDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyticsDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyticsDetails(od as api.AnalyticsDetails);
     });
   });
@@ -1372,7 +1380,9 @@
   unittest.group('obj-schema-AnalyticsProperty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyticsProperty();
-      var od = api.AnalyticsProperty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyticsProperty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyticsProperty(od as api.AnalyticsProperty);
     });
   });
@@ -1380,7 +1390,9 @@
   unittest.group('obj-schema-AndroidApp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidApp();
-      var od = api.AndroidApp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AndroidApp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAndroidApp(od as api.AndroidApp);
     });
   });
@@ -1388,7 +1400,9 @@
   unittest.group('obj-schema-AndroidAppConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidAppConfig();
-      var od = api.AndroidAppConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidAppConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidAppConfig(od as api.AndroidAppConfig);
     });
   });
@@ -1396,7 +1410,9 @@
   unittest.group('obj-schema-DefaultResources', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDefaultResources();
-      var od = api.DefaultResources.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DefaultResources.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDefaultResources(od as api.DefaultResources);
     });
   });
@@ -1404,7 +1420,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1412,7 +1429,9 @@
   unittest.group('obj-schema-FinalizeDefaultLocationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFinalizeDefaultLocationRequest();
-      var od = api.FinalizeDefaultLocationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FinalizeDefaultLocationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFinalizeDefaultLocationRequest(
           od as api.FinalizeDefaultLocationRequest);
     });
@@ -1421,7 +1440,9 @@
   unittest.group('obj-schema-FirebaseAppInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirebaseAppInfo();
-      var od = api.FirebaseAppInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirebaseAppInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirebaseAppInfo(od as api.FirebaseAppInfo);
     });
   });
@@ -1429,7 +1450,9 @@
   unittest.group('obj-schema-FirebaseProject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFirebaseProject();
-      var od = api.FirebaseProject.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FirebaseProject.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFirebaseProject(od as api.FirebaseProject);
     });
   });
@@ -1437,7 +1460,9 @@
   unittest.group('obj-schema-IosApp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosApp();
-      var od = api.IosApp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IosApp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIosApp(od as api.IosApp);
     });
   });
@@ -1445,7 +1470,9 @@
   unittest.group('obj-schema-IosAppConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosAppConfig();
-      var od = api.IosAppConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IosAppConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIosAppConfig(od as api.IosAppConfig);
     });
   });
@@ -1453,7 +1480,9 @@
   unittest.group('obj-schema-ListAndroidAppsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAndroidAppsResponse();
-      var od = api.ListAndroidAppsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAndroidAppsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAndroidAppsResponse(od as api.ListAndroidAppsResponse);
     });
   });
@@ -1461,7 +1490,9 @@
   unittest.group('obj-schema-ListAvailableLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAvailableLocationsResponse();
-      var od = api.ListAvailableLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAvailableLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAvailableLocationsResponse(
           od as api.ListAvailableLocationsResponse);
     });
@@ -1470,7 +1501,9 @@
   unittest.group('obj-schema-ListAvailableProjectsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListAvailableProjectsResponse();
-      var od = api.ListAvailableProjectsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListAvailableProjectsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListAvailableProjectsResponse(
           od as api.ListAvailableProjectsResponse);
     });
@@ -1479,7 +1512,9 @@
   unittest.group('obj-schema-ListFirebaseProjectsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListFirebaseProjectsResponse();
-      var od = api.ListFirebaseProjectsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListFirebaseProjectsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListFirebaseProjectsResponse(od as api.ListFirebaseProjectsResponse);
     });
   });
@@ -1487,7 +1522,9 @@
   unittest.group('obj-schema-ListIosAppsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListIosAppsResponse();
-      var od = api.ListIosAppsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListIosAppsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListIosAppsResponse(od as api.ListIosAppsResponse);
     });
   });
@@ -1495,7 +1532,9 @@
   unittest.group('obj-schema-ListShaCertificatesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListShaCertificatesResponse();
-      var od = api.ListShaCertificatesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListShaCertificatesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListShaCertificatesResponse(od as api.ListShaCertificatesResponse);
     });
   });
@@ -1503,7 +1542,9 @@
   unittest.group('obj-schema-ListWebAppsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListWebAppsResponse();
-      var od = api.ListWebAppsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListWebAppsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListWebAppsResponse(od as api.ListWebAppsResponse);
     });
   });
@@ -1511,7 +1552,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1519,7 +1562,9 @@
   unittest.group('obj-schema-MessageSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMessageSet();
-      var od = api.MessageSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MessageSet.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMessageSet(od as api.MessageSet);
     });
   });
@@ -1527,7 +1572,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1535,7 +1582,9 @@
   unittest.group('obj-schema-ProjectInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectInfo();
-      var od = api.ProjectInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectInfo(od as api.ProjectInfo);
     });
   });
@@ -1543,7 +1592,9 @@
   unittest.group('obj-schema-RemoveAnalyticsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRemoveAnalyticsRequest();
-      var od = api.RemoveAnalyticsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RemoveAnalyticsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRemoveAnalyticsRequest(od as api.RemoveAnalyticsRequest);
     });
   });
@@ -1551,7 +1602,9 @@
   unittest.group('obj-schema-SearchFirebaseAppsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSearchFirebaseAppsResponse();
-      var od = api.SearchFirebaseAppsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SearchFirebaseAppsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSearchFirebaseAppsResponse(od as api.SearchFirebaseAppsResponse);
     });
   });
@@ -1559,7 +1612,9 @@
   unittest.group('obj-schema-ShaCertificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShaCertificate();
-      var od = api.ShaCertificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShaCertificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShaCertificate(od as api.ShaCertificate);
     });
   });
@@ -1567,7 +1622,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1575,7 +1632,9 @@
   unittest.group('obj-schema-StatusProto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatusProto();
-      var od = api.StatusProto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StatusProto.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStatusProto(od as api.StatusProto);
     });
   });
@@ -1583,7 +1642,9 @@
   unittest.group('obj-schema-StreamMapping', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStreamMapping();
-      var od = api.StreamMapping.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StreamMapping.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStreamMapping(od as api.StreamMapping);
     });
   });
@@ -1591,7 +1652,9 @@
   unittest.group('obj-schema-WebApp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebApp();
-      var od = api.WebApp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.WebApp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkWebApp(od as api.WebApp);
     });
   });
@@ -1599,7 +1662,9 @@
   unittest.group('obj-schema-WebAppConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWebAppConfig();
-      var od = api.WebAppConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WebAppConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWebAppConfig(od as api.WebAppConfig);
     });
   });
diff --git a/generated/googleapis_beta/test/firebasedatabase/v1beta_test.dart b/generated/googleapis_beta/test/firebasedatabase/v1beta_test.dart
index ec72946..182a48f 100644
--- a/generated/googleapis_beta/test/firebasedatabase/v1beta_test.dart
+++ b/generated/googleapis_beta/test/firebasedatabase/v1beta_test.dart
@@ -141,7 +141,9 @@
   unittest.group('obj-schema-DatabaseInstance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabaseInstance();
-      var od = api.DatabaseInstance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatabaseInstance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatabaseInstance(od as api.DatabaseInstance);
     });
   });
@@ -149,7 +151,9 @@
   unittest.group('obj-schema-DisableDatabaseInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisableDatabaseInstanceRequest();
-      var od = api.DisableDatabaseInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisableDatabaseInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisableDatabaseInstanceRequest(
           od as api.DisableDatabaseInstanceRequest);
     });
@@ -158,7 +162,9 @@
   unittest.group('obj-schema-ListDatabaseInstancesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListDatabaseInstancesResponse();
-      var od = api.ListDatabaseInstancesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListDatabaseInstancesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListDatabaseInstancesResponse(
           od as api.ListDatabaseInstancesResponse);
     });
@@ -167,7 +173,9 @@
   unittest.group('obj-schema-ReenableDatabaseInstanceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReenableDatabaseInstanceRequest();
-      var od = api.ReenableDatabaseInstanceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReenableDatabaseInstanceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReenableDatabaseInstanceRequest(
           od as api.ReenableDatabaseInstanceRequest);
     });
diff --git a/generated/googleapis_beta/test/lifesciences/v2beta_test.dart b/generated/googleapis_beta/test/lifesciences/v2beta_test.dart
index bdffacb..270dd2d 100644
--- a/generated/googleapis_beta/test/lifesciences/v2beta_test.dart
+++ b/generated/googleapis_beta/test/lifesciences/v2beta_test.dart
@@ -1650,7 +1650,9 @@
   unittest.group('obj-schema-Accelerator', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccelerator();
-      var od = api.Accelerator.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Accelerator.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAccelerator(od as api.Accelerator);
     });
   });
@@ -1658,7 +1660,9 @@
   unittest.group('obj-schema-Action', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAction();
-      var od = api.Action.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Action.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAction(od as api.Action);
     });
   });
@@ -1666,7 +1670,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -1674,7 +1680,9 @@
   unittest.group('obj-schema-ContainerKilledEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerKilledEvent();
-      var od = api.ContainerKilledEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerKilledEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerKilledEvent(od as api.ContainerKilledEvent);
     });
   });
@@ -1682,7 +1690,9 @@
   unittest.group('obj-schema-ContainerStartedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerStartedEvent();
-      var od = api.ContainerStartedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerStartedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerStartedEvent(od as api.ContainerStartedEvent);
     });
   });
@@ -1690,7 +1700,9 @@
   unittest.group('obj-schema-ContainerStoppedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildContainerStoppedEvent();
-      var od = api.ContainerStoppedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ContainerStoppedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkContainerStoppedEvent(od as api.ContainerStoppedEvent);
     });
   });
@@ -1698,7 +1710,9 @@
   unittest.group('obj-schema-DelayedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDelayedEvent();
-      var od = api.DelayedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DelayedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDelayedEvent(od as api.DelayedEvent);
     });
   });
@@ -1706,7 +1720,8 @@
   unittest.group('obj-schema-Disk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisk();
-      var od = api.Disk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Disk.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDisk(od as api.Disk);
     });
   });
@@ -1714,7 +1729,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1722,7 +1738,8 @@
   unittest.group('obj-schema-Event', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEvent();
-      var od = api.Event.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Event.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEvent(od as api.Event);
     });
   });
@@ -1730,7 +1747,9 @@
   unittest.group('obj-schema-ExistingDisk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExistingDisk();
-      var od = api.ExistingDisk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExistingDisk.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExistingDisk(od as api.ExistingDisk);
     });
   });
@@ -1738,7 +1757,9 @@
   unittest.group('obj-schema-FailedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFailedEvent();
-      var od = api.FailedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FailedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFailedEvent(od as api.FailedEvent);
     });
   });
@@ -1746,7 +1767,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1754,7 +1777,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1762,7 +1787,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1770,7 +1797,9 @@
   unittest.group('obj-schema-Metadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadata();
-      var od = api.Metadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Metadata.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMetadata(od as api.Metadata);
     });
   });
@@ -1778,7 +1807,8 @@
   unittest.group('obj-schema-Mount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMount();
-      var od = api.Mount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Mount.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMount(od as api.Mount);
     });
   });
@@ -1786,7 +1816,9 @@
   unittest.group('obj-schema-NFSMount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNFSMount();
-      var od = api.NFSMount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NFSMount.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNFSMount(od as api.NFSMount);
     });
   });
@@ -1794,7 +1826,9 @@
   unittest.group('obj-schema-Network', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNetwork();
-      var od = api.Network.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Network.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNetwork(od as api.Network);
     });
   });
@@ -1802,7 +1836,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1810,7 +1846,9 @@
   unittest.group('obj-schema-PersistentDisk', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPersistentDisk();
-      var od = api.PersistentDisk.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PersistentDisk.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPersistentDisk(od as api.PersistentDisk);
     });
   });
@@ -1818,7 +1856,9 @@
   unittest.group('obj-schema-Pipeline', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPipeline();
-      var od = api.Pipeline.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Pipeline.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPipeline(od as api.Pipeline);
     });
   });
@@ -1826,7 +1866,9 @@
   unittest.group('obj-schema-PullStartedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPullStartedEvent();
-      var od = api.PullStartedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PullStartedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPullStartedEvent(od as api.PullStartedEvent);
     });
   });
@@ -1834,7 +1876,9 @@
   unittest.group('obj-schema-PullStoppedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPullStoppedEvent();
-      var od = api.PullStoppedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PullStoppedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPullStoppedEvent(od as api.PullStoppedEvent);
     });
   });
@@ -1842,7 +1886,9 @@
   unittest.group('obj-schema-Resources', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResources();
-      var od = api.Resources.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Resources.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkResources(od as api.Resources);
     });
   });
@@ -1850,7 +1896,9 @@
   unittest.group('obj-schema-RunPipelineRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunPipelineRequest();
-      var od = api.RunPipelineRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunPipelineRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunPipelineRequest(od as api.RunPipelineRequest);
     });
   });
@@ -1858,7 +1906,9 @@
   unittest.group('obj-schema-RunPipelineResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRunPipelineResponse();
-      var od = api.RunPipelineResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RunPipelineResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRunPipelineResponse(od as api.RunPipelineResponse);
     });
   });
@@ -1866,7 +1916,9 @@
   unittest.group('obj-schema-Secret', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecret();
-      var od = api.Secret.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Secret.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSecret(od as api.Secret);
     });
   });
@@ -1874,7 +1926,9 @@
   unittest.group('obj-schema-ServiceAccount', () {
     unittest.test('to-json--from-json', () async {
       var o = buildServiceAccount();
-      var od = api.ServiceAccount.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ServiceAccount.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkServiceAccount(od as api.ServiceAccount);
     });
   });
@@ -1882,7 +1936,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1890,7 +1946,9 @@
   unittest.group('obj-schema-UnexpectedExitStatusEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnexpectedExitStatusEvent();
-      var od = api.UnexpectedExitStatusEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnexpectedExitStatusEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnexpectedExitStatusEvent(od as api.UnexpectedExitStatusEvent);
     });
   });
@@ -1898,7 +1956,9 @@
   unittest.group('obj-schema-VirtualMachine', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVirtualMachine();
-      var od = api.VirtualMachine.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VirtualMachine.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVirtualMachine(od as api.VirtualMachine);
     });
   });
@@ -1906,7 +1966,9 @@
   unittest.group('obj-schema-Volume', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVolume();
-      var od = api.Volume.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Volume.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVolume(od as api.Volume);
     });
   });
@@ -1914,7 +1976,9 @@
   unittest.group('obj-schema-WorkerAssignedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerAssignedEvent();
-      var od = api.WorkerAssignedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerAssignedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerAssignedEvent(od as api.WorkerAssignedEvent);
     });
   });
@@ -1922,7 +1986,9 @@
   unittest.group('obj-schema-WorkerReleasedEvent', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWorkerReleasedEvent();
-      var od = api.WorkerReleasedEvent.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WorkerReleasedEvent.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWorkerReleasedEvent(od as api.WorkerReleasedEvent);
     });
   });
diff --git a/generated/googleapis_beta/test/metastore/v1beta_test.dart b/generated/googleapis_beta/test/metastore/v1beta_test.dart
index 7ec617b..4e01af8 100644
--- a/generated/googleapis_beta/test/metastore/v1beta_test.dart
+++ b/generated/googleapis_beta/test/metastore/v1beta_test.dart
@@ -1395,7 +1395,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -1403,7 +1405,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -1411,7 +1415,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -1419,7 +1425,9 @@
   unittest.group('obj-schema-DatabaseDump', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabaseDump();
-      var od = api.DatabaseDump.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatabaseDump.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatabaseDump(od as api.DatabaseDump);
     });
   });
@@ -1427,7 +1435,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1435,7 +1444,9 @@
   unittest.group('obj-schema-ExportMetadataRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportMetadataRequest();
-      var od = api.ExportMetadataRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportMetadataRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportMetadataRequest(od as api.ExportMetadataRequest);
     });
   });
@@ -1443,7 +1454,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -1451,7 +1463,9 @@
   unittest.group('obj-schema-HiveMetastoreConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHiveMetastoreConfig();
-      var od = api.HiveMetastoreConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HiveMetastoreConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHiveMetastoreConfig(od as api.HiveMetastoreConfig);
     });
   });
@@ -1459,7 +1473,9 @@
   unittest.group('obj-schema-HiveMetastoreVersion', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHiveMetastoreVersion();
-      var od = api.HiveMetastoreVersion.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HiveMetastoreVersion.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHiveMetastoreVersion(od as api.HiveMetastoreVersion);
     });
   });
@@ -1467,7 +1483,9 @@
   unittest.group('obj-schema-KerberosConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKerberosConfig();
-      var od = api.KerberosConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KerberosConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKerberosConfig(od as api.KerberosConfig);
     });
   });
@@ -1475,7 +1493,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -1483,7 +1503,9 @@
   unittest.group('obj-schema-ListMetadataImportsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListMetadataImportsResponse();
-      var od = api.ListMetadataImportsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListMetadataImportsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListMetadataImportsResponse(od as api.ListMetadataImportsResponse);
     });
   });
@@ -1491,7 +1513,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -1499,7 +1523,9 @@
   unittest.group('obj-schema-ListServicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListServicesResponse();
-      var od = api.ListServicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListServicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
@@ -1507,7 +1533,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -1515,7 +1543,9 @@
   unittest.group('obj-schema-LocationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationMetadata();
-      var od = api.LocationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationMetadata(od as api.LocationMetadata);
     });
   });
@@ -1523,7 +1553,9 @@
   unittest.group('obj-schema-MaintenanceWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenanceWindow();
-      var od = api.MaintenanceWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenanceWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenanceWindow(od as api.MaintenanceWindow);
     });
   });
@@ -1531,7 +1563,9 @@
   unittest.group('obj-schema-MetadataExport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadataExport();
-      var od = api.MetadataExport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetadataExport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetadataExport(od as api.MetadataExport);
     });
   });
@@ -1539,7 +1573,9 @@
   unittest.group('obj-schema-MetadataImport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadataImport();
-      var od = api.MetadataImport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetadataImport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetadataImport(od as api.MetadataImport);
     });
   });
@@ -1547,7 +1583,9 @@
   unittest.group('obj-schema-MetadataIntegration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadataIntegration();
-      var od = api.MetadataIntegration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetadataIntegration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetadataIntegration(od as api.MetadataIntegration);
     });
   });
@@ -1555,7 +1593,9 @@
   unittest.group('obj-schema-MetadataManagementActivity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetadataManagementActivity();
-      var od = api.MetadataManagementActivity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetadataManagementActivity.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetadataManagementActivity(od as api.MetadataManagementActivity);
     });
   });
@@ -1563,7 +1603,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -1571,7 +1613,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -1579,7 +1623,9 @@
   unittest.group('obj-schema-Restore', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestore();
-      var od = api.Restore.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Restore.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRestore(od as api.Restore);
     });
   });
@@ -1587,7 +1633,9 @@
   unittest.group('obj-schema-Secret', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSecret();
-      var od = api.Secret.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Secret.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSecret(od as api.Secret);
     });
   });
@@ -1595,7 +1643,9 @@
   unittest.group('obj-schema-Service', () {
     unittest.test('to-json--from-json', () async {
       var o = buildService();
-      var od = api.Service.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Service.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkService(od as api.Service);
     });
   });
@@ -1603,7 +1653,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -1611,7 +1663,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -1619,7 +1673,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -1627,7 +1683,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
diff --git a/generated/googleapis_beta/test/networkconnectivity/v1alpha1_test.dart b/generated/googleapis_beta/test/networkconnectivity/v1alpha1_test.dart
index 6ab7f48..dc70a44 100644
--- a/generated/googleapis_beta/test/networkconnectivity/v1alpha1_test.dart
+++ b/generated/googleapis_beta/test/networkconnectivity/v1alpha1_test.dart
@@ -2412,7 +2412,9 @@
   unittest.group('obj-schema-AttributeValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttributeValue();
-      var od = api.AttributeValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttributeValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttributeValue(od as api.AttributeValue);
     });
   });
@@ -2420,7 +2422,9 @@
   unittest.group('obj-schema-Attributes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttributes();
-      var od = api.Attributes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Attributes.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAttributes(od as api.Attributes);
     });
   });
@@ -2428,7 +2432,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -2436,7 +2442,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -2444,7 +2452,9 @@
   unittest.group('obj-schema-BillingView', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingView();
-      var od = api.BillingView.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingView.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingView(od as api.BillingView);
     });
   });
@@ -2452,7 +2462,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -2460,7 +2472,9 @@
   unittest.group('obj-schema-Distribution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDistribution();
-      var od = api.Distribution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Distribution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDistribution(od as api.Distribution);
     });
   });
@@ -2468,7 +2482,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2476,7 +2491,9 @@
   unittest.group('obj-schema-Exemplar', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExemplar();
-      var od = api.Exemplar.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Exemplar.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExemplar(od as api.Exemplar);
     });
   });
@@ -2484,7 +2501,9 @@
   unittest.group('obj-schema-ExplicitBuckets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExplicitBuckets();
-      var od = api.ExplicitBuckets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExplicitBuckets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExplicitBuckets(od as api.ExplicitBuckets);
     });
   });
@@ -2492,7 +2511,9 @@
   unittest.group('obj-schema-ExponentialBuckets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExponentialBuckets();
-      var od = api.ExponentialBuckets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExponentialBuckets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExponentialBuckets(od as api.ExponentialBuckets);
     });
   });
@@ -2500,7 +2521,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -2508,7 +2530,9 @@
   unittest.group('obj-schema-GoogleLongrunningCancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningCancelOperationRequest();
-      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningCancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningCancelOperationRequest(
           od as api.GoogleLongrunningCancelOperationRequest);
     });
@@ -2517,7 +2541,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -2526,7 +2552,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -2534,7 +2562,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
@@ -2542,7 +2572,9 @@
   unittest.group('obj-schema-HttpRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHttpRequest();
-      var od = api.HttpRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.HttpRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkHttpRequest(od as api.HttpRequest);
     });
   });
@@ -2550,7 +2582,8 @@
   unittest.group('obj-schema-Hub', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHub();
-      var od = api.Hub.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Hub.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHub(od as api.Hub);
     });
   });
@@ -2558,7 +2591,9 @@
   unittest.group('obj-schema-LinearBuckets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLinearBuckets();
-      var od = api.LinearBuckets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LinearBuckets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLinearBuckets(od as api.LinearBuckets);
     });
   });
@@ -2566,7 +2601,9 @@
   unittest.group('obj-schema-ListHubsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListHubsResponse();
-      var od = api.ListHubsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListHubsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListHubsResponse(od as api.ListHubsResponse);
     });
   });
@@ -2574,7 +2611,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -2582,7 +2621,9 @@
   unittest.group('obj-schema-ListSpokesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListSpokesResponse();
-      var od = api.ListSpokesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListSpokesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListSpokesResponse(od as api.ListSpokesResponse);
     });
   });
@@ -2590,7 +2631,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2598,7 +2641,9 @@
   unittest.group('obj-schema-LogEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogEntry();
-      var od = api.LogEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.LogEntry.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLogEntry(od as api.LogEntry);
     });
   });
@@ -2606,7 +2651,9 @@
   unittest.group('obj-schema-LogEntryOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogEntryOperation();
-      var od = api.LogEntryOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogEntryOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogEntryOperation(od as api.LogEntryOperation);
     });
   });
@@ -2614,7 +2661,9 @@
   unittest.group('obj-schema-LogEntrySourceLocation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogEntrySourceLocation();
-      var od = api.LogEntrySourceLocation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogEntrySourceLocation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogEntrySourceLocation(od as api.LogEntrySourceLocation);
     });
   });
@@ -2622,7 +2671,9 @@
   unittest.group('obj-schema-MetricValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricValue();
-      var od = api.MetricValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricValue(od as api.MetricValue);
     });
   });
@@ -2630,7 +2681,9 @@
   unittest.group('obj-schema-MetricValueSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMetricValueSet();
-      var od = api.MetricValueSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MetricValueSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMetricValueSet(od as api.MetricValueSet);
     });
   });
@@ -2638,7 +2691,8 @@
   unittest.group('obj-schema-Money', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoney();
-      var od = api.Money.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Money.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMoney(od as api.Money);
     });
   });
@@ -2646,7 +2700,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2654,7 +2710,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -2662,7 +2720,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -2670,7 +2730,9 @@
   unittest.group('obj-schema-QuotaProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildQuotaProperties();
-      var od = api.QuotaProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.QuotaProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkQuotaProperties(od as api.QuotaProperties);
     });
   });
@@ -2678,7 +2740,9 @@
   unittest.group('obj-schema-ReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReportRequest();
-      var od = api.ReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReportRequest(od as api.ReportRequest);
     });
   });
@@ -2686,7 +2750,9 @@
   unittest.group('obj-schema-ResourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResourceInfo();
-      var od = api.ResourceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResourceInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResourceInfo(od as api.ResourceInfo);
     });
   });
@@ -2694,7 +2760,9 @@
   unittest.group('obj-schema-RouterApplianceInstance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRouterApplianceInstance();
-      var od = api.RouterApplianceInstance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RouterApplianceInstance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRouterApplianceInstance(od as api.RouterApplianceInstance);
     });
   });
@@ -2702,7 +2770,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -2710,7 +2780,8 @@
   unittest.group('obj-schema-Spoke', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpoke();
-      var od = api.Spoke.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Spoke.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSpoke(od as api.Spoke);
     });
   });
@@ -2718,7 +2789,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -2726,7 +2799,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -2734,7 +2809,9 @@
   unittest.group('obj-schema-TraceSpan', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTraceSpan();
-      var od = api.TraceSpan.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TraceSpan.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTraceSpan(od as api.TraceSpan);
     });
   });
@@ -2742,7 +2819,9 @@
   unittest.group('obj-schema-TruncatableString', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTruncatableString();
-      var od = api.TruncatableString.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TruncatableString.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTruncatableString(od as api.TruncatableString);
     });
   });
diff --git a/generated/googleapis_beta/test/ondemandscanning/v1beta1_test.dart b/generated/googleapis_beta/test/ondemandscanning/v1beta1_test.dart
index d8b38a0..a4c1907 100644
--- a/generated/googleapis_beta/test/ondemandscanning/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/ondemandscanning/v1beta1_test.dart
@@ -1930,7 +1930,9 @@
   unittest.group('obj-schema-AliasContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAliasContext();
-      var od = api.AliasContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AliasContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAliasContext(od as api.AliasContext);
     });
   });
@@ -1938,7 +1940,9 @@
   unittest.group('obj-schema-AnalyzePackagesMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzePackagesMetadata();
-      var od = api.AnalyzePackagesMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzePackagesMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzePackagesMetadata(od as api.AnalyzePackagesMetadata);
     });
   });
@@ -1946,7 +1950,9 @@
   unittest.group('obj-schema-AnalyzePackagesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzePackagesRequest();
-      var od = api.AnalyzePackagesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzePackagesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzePackagesRequest(od as api.AnalyzePackagesRequest);
     });
   });
@@ -1954,7 +1960,9 @@
   unittest.group('obj-schema-AnalyzePackagesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnalyzePackagesResponse();
-      var od = api.AnalyzePackagesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnalyzePackagesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnalyzePackagesResponse(od as api.AnalyzePackagesResponse);
     });
   });
@@ -1962,7 +1970,9 @@
   unittest.group('obj-schema-Artifact', () {
     unittest.test('to-json--from-json', () async {
       var o = buildArtifact();
-      var od = api.Artifact.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Artifact.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkArtifact(od as api.Artifact);
     });
   });
@@ -1970,7 +1980,9 @@
   unittest.group('obj-schema-AttestationOccurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAttestationOccurrence();
-      var od = api.AttestationOccurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AttestationOccurrence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAttestationOccurrence(od as api.AttestationOccurrence);
     });
   });
@@ -1978,7 +1990,9 @@
   unittest.group('obj-schema-BuildOccurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildOccurrence();
-      var od = api.BuildOccurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildOccurrence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildOccurrence(od as api.BuildOccurrence);
     });
   });
@@ -1986,7 +2000,9 @@
   unittest.group('obj-schema-BuildProvenance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBuildProvenance();
-      var od = api.BuildProvenance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BuildProvenance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBuildProvenance(od as api.BuildProvenance);
     });
   });
@@ -1994,7 +2010,9 @@
   unittest.group('obj-schema-Category', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCategory();
-      var od = api.Category.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Category.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCategory(od as api.Category);
     });
   });
@@ -2002,7 +2020,9 @@
   unittest.group('obj-schema-CloudRepoSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloudRepoSourceContext();
-      var od = api.CloudRepoSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloudRepoSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloudRepoSourceContext(od as api.CloudRepoSourceContext);
     });
   });
@@ -2010,7 +2030,9 @@
   unittest.group('obj-schema-Command', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCommand();
-      var od = api.Command.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Command.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCommand(od as api.Command);
     });
   });
@@ -2018,7 +2040,9 @@
   unittest.group('obj-schema-DeploymentOccurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeploymentOccurrence();
-      var od = api.DeploymentOccurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeploymentOccurrence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeploymentOccurrence(od as api.DeploymentOccurrence);
     });
   });
@@ -2026,7 +2050,9 @@
   unittest.group('obj-schema-DiscoveryOccurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiscoveryOccurrence();
-      var od = api.DiscoveryOccurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiscoveryOccurrence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiscoveryOccurrence(od as api.DiscoveryOccurrence);
     });
   });
@@ -2034,7 +2060,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -2042,7 +2069,9 @@
   unittest.group('obj-schema-FileHashes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileHashes();
-      var od = api.FileHashes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.FileHashes.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFileHashes(od as api.FileHashes);
     });
   });
@@ -2050,7 +2079,9 @@
   unittest.group('obj-schema-Fingerprint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFingerprint();
-      var od = api.Fingerprint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Fingerprint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFingerprint(od as api.Fingerprint);
     });
   });
@@ -2058,7 +2089,9 @@
   unittest.group('obj-schema-GerritSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGerritSourceContext();
-      var od = api.GerritSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GerritSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGerritSourceContext(od as api.GerritSourceContext);
     });
   });
@@ -2066,7 +2099,9 @@
   unittest.group('obj-schema-GitSourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGitSourceContext();
-      var od = api.GitSourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GitSourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGitSourceContext(od as api.GitSourceContext);
     });
   });
@@ -2074,7 +2109,8 @@
   unittest.group('obj-schema-Hash', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHash();
-      var od = api.Hash.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Hash.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHash(od as api.Hash);
     });
   });
@@ -2082,7 +2118,9 @@
   unittest.group('obj-schema-Identity', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIdentity();
-      var od = api.Identity.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Identity.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIdentity(od as api.Identity);
     });
   });
@@ -2090,7 +2128,9 @@
   unittest.group('obj-schema-ImageOccurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImageOccurrence();
-      var od = api.ImageOccurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImageOccurrence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImageOccurrence(od as api.ImageOccurrence);
     });
   });
@@ -2098,7 +2138,8 @@
   unittest.group('obj-schema-Jwt', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJwt();
-      var od = api.Jwt.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Jwt.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJwt(od as api.Jwt);
     });
   });
@@ -2106,7 +2147,8 @@
   unittest.group('obj-schema-Layer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLayer();
-      var od = api.Layer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Layer.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLayer(od as api.Layer);
     });
   });
@@ -2114,7 +2156,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -2122,7 +2166,9 @@
   unittest.group('obj-schema-ListVulnerabilitiesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListVulnerabilitiesResponse();
-      var od = api.ListVulnerabilitiesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListVulnerabilitiesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListVulnerabilitiesResponse(od as api.ListVulnerabilitiesResponse);
     });
   });
@@ -2130,7 +2176,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -2138,7 +2186,9 @@
   unittest.group('obj-schema-Occurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOccurrence();
-      var od = api.Occurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Occurrence.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOccurrence(od as api.Occurrence);
     });
   });
@@ -2146,7 +2196,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -2154,7 +2206,9 @@
   unittest.group('obj-schema-PackageData', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPackageData();
-      var od = api.PackageData.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PackageData.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPackageData(od as api.PackageData);
     });
   });
@@ -2162,7 +2216,9 @@
   unittest.group('obj-schema-PackageIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPackageIssue();
-      var od = api.PackageIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PackageIssue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPackageIssue(od as api.PackageIssue);
     });
   });
@@ -2170,7 +2226,9 @@
   unittest.group('obj-schema-PackageOccurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPackageOccurrence();
-      var od = api.PackageOccurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PackageOccurrence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPackageOccurrence(od as api.PackageOccurrence);
     });
   });
@@ -2178,7 +2236,9 @@
   unittest.group('obj-schema-ProjectRepoId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectRepoId();
-      var od = api.ProjectRepoId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectRepoId.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectRepoId(od as api.ProjectRepoId);
     });
   });
@@ -2186,7 +2246,9 @@
   unittest.group('obj-schema-RelatedUrl', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRelatedUrl();
-      var od = api.RelatedUrl.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RelatedUrl.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRelatedUrl(od as api.RelatedUrl);
     });
   });
@@ -2194,7 +2256,9 @@
   unittest.group('obj-schema-RepoId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRepoId();
-      var od = api.RepoId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.RepoId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkRepoId(od as api.RepoId);
     });
   });
@@ -2202,7 +2266,9 @@
   unittest.group('obj-schema-Signature', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSignature();
-      var od = api.Signature.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Signature.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSignature(od as api.Signature);
     });
   });
@@ -2210,7 +2276,9 @@
   unittest.group('obj-schema-Source', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSource();
-      var od = api.Source.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Source.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSource(od as api.Source);
     });
   });
@@ -2218,7 +2286,9 @@
   unittest.group('obj-schema-SourceContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSourceContext();
-      var od = api.SourceContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SourceContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSourceContext(od as api.SourceContext);
     });
   });
@@ -2226,7 +2296,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -2234,7 +2306,9 @@
   unittest.group('obj-schema-UpgradeDistribution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpgradeDistribution();
-      var od = api.UpgradeDistribution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpgradeDistribution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpgradeDistribution(od as api.UpgradeDistribution);
     });
   });
@@ -2242,7 +2316,9 @@
   unittest.group('obj-schema-UpgradeOccurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpgradeOccurrence();
-      var od = api.UpgradeOccurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpgradeOccurrence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpgradeOccurrence(od as api.UpgradeOccurrence);
     });
   });
@@ -2250,7 +2326,9 @@
   unittest.group('obj-schema-Version', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVersion();
-      var od = api.Version.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Version.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkVersion(od as api.Version);
     });
   });
@@ -2258,7 +2336,9 @@
   unittest.group('obj-schema-VulnerabilityOccurrence', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVulnerabilityOccurrence();
-      var od = api.VulnerabilityOccurrence.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VulnerabilityOccurrence.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVulnerabilityOccurrence(od as api.VulnerabilityOccurrence);
     });
   });
@@ -2266,7 +2346,9 @@
   unittest.group('obj-schema-WindowsUpdate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildWindowsUpdate();
-      var od = api.WindowsUpdate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.WindowsUpdate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkWindowsUpdate(od as api.WindowsUpdate);
     });
   });
diff --git a/generated/googleapis_beta/test/policysimulator/v1beta1_test.dart b/generated/googleapis_beta/test/policysimulator/v1beta1_test.dart
index 3c270e1..c7d6c1a 100644
--- a/generated/googleapis_beta/test/policysimulator/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/policysimulator/v1beta1_test.dart
@@ -1072,8 +1072,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1AccessStateDiff();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudPolicysimulatorV1beta1AccessStateDiff.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1AccessStateDiff(
           od as api.GoogleCloudPolicysimulatorV1beta1AccessStateDiff);
     });
@@ -1082,8 +1083,9 @@
   unittest.group('obj-schema-GoogleCloudPolicysimulatorV1beta1AccessTuple', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1AccessTuple();
-      var od =
-          api.GoogleCloudPolicysimulatorV1beta1AccessTuple.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudPolicysimulatorV1beta1AccessTuple.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1AccessTuple(
           od as api.GoogleCloudPolicysimulatorV1beta1AccessTuple);
     });
@@ -1093,8 +1095,9 @@
       'obj-schema-GoogleCloudPolicysimulatorV1beta1BindingExplanation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1BindingExplanation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudPolicysimulatorV1beta1BindingExplanation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1BindingExplanation(
           od as api.GoogleCloudPolicysimulatorV1beta1BindingExplanation);
     });
@@ -1106,9 +1109,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudPolicysimulatorV1beta1BindingExplanationAnnotatedMembership();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudPolicysimulatorV1beta1BindingExplanationAnnotatedMembership
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1BindingExplanationAnnotatedMembership(
           od as api
               .GoogleCloudPolicysimulatorV1beta1BindingExplanationAnnotatedMembership);
@@ -1119,8 +1123,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1ExplainedAccess();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudPolicysimulatorV1beta1ExplainedAccess.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1ExplainedAccess(
           od as api.GoogleCloudPolicysimulatorV1beta1ExplainedAccess);
     });
@@ -1130,8 +1135,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1ExplainedPolicy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudPolicysimulatorV1beta1ExplainedPolicy.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1ExplainedPolicy(
           od as api.GoogleCloudPolicysimulatorV1beta1ExplainedPolicy);
     });
@@ -1142,8 +1148,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1ListReplayResultsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudPolicysimulatorV1beta1ListReplayResultsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1ListReplayResultsResponse(
           od as api.GoogleCloudPolicysimulatorV1beta1ListReplayResultsResponse);
     });
@@ -1152,7 +1159,9 @@
   unittest.group('obj-schema-GoogleCloudPolicysimulatorV1beta1Replay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1Replay();
-      var od = api.GoogleCloudPolicysimulatorV1beta1Replay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudPolicysimulatorV1beta1Replay.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1Replay(
           od as api.GoogleCloudPolicysimulatorV1beta1Replay);
     });
@@ -1162,8 +1171,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1ReplayConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudPolicysimulatorV1beta1ReplayConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1ReplayConfig(
           od as api.GoogleCloudPolicysimulatorV1beta1ReplayConfig);
     });
@@ -1172,8 +1182,9 @@
   unittest.group('obj-schema-GoogleCloudPolicysimulatorV1beta1ReplayDiff', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1ReplayDiff();
-      var od =
-          api.GoogleCloudPolicysimulatorV1beta1ReplayDiff.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudPolicysimulatorV1beta1ReplayDiff.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1ReplayDiff(
           od as api.GoogleCloudPolicysimulatorV1beta1ReplayDiff);
     });
@@ -1184,9 +1195,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1ReplayOperationMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudPolicysimulatorV1beta1ReplayOperationMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1ReplayOperationMetadata(
           od as api.GoogleCloudPolicysimulatorV1beta1ReplayOperationMetadata);
     });
@@ -1196,8 +1208,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1ReplayResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudPolicysimulatorV1beta1ReplayResult.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1ReplayResult(
           od as api.GoogleCloudPolicysimulatorV1beta1ReplayResult);
     });
@@ -1207,9 +1220,10 @@
       'obj-schema-GoogleCloudPolicysimulatorV1beta1ReplayResultsSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudPolicysimulatorV1beta1ReplayResultsSummary();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudPolicysimulatorV1beta1ReplayResultsSummary.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudPolicysimulatorV1beta1ReplayResultsSummary(
           od as api.GoogleCloudPolicysimulatorV1beta1ReplayResultsSummary);
     });
@@ -1218,7 +1232,9 @@
   unittest.group('obj-schema-GoogleIamV1AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1AuditConfig();
-      var od = api.GoogleIamV1AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1AuditConfig(od as api.GoogleIamV1AuditConfig);
     });
   });
@@ -1226,7 +1242,9 @@
   unittest.group('obj-schema-GoogleIamV1AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1AuditLogConfig();
-      var od = api.GoogleIamV1AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1AuditLogConfig(od as api.GoogleIamV1AuditLogConfig);
     });
   });
@@ -1234,7 +1252,9 @@
   unittest.group('obj-schema-GoogleIamV1Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1Binding();
-      var od = api.GoogleIamV1Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1Binding.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1Binding(od as api.GoogleIamV1Binding);
     });
   });
@@ -1242,7 +1262,9 @@
   unittest.group('obj-schema-GoogleIamV1Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleIamV1Policy();
-      var od = api.GoogleIamV1Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleIamV1Policy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleIamV1Policy(od as api.GoogleIamV1Policy);
     });
   });
@@ -1250,7 +1272,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -1259,7 +1283,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -1267,7 +1293,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
@@ -1275,7 +1303,9 @@
   unittest.group('obj-schema-GoogleTypeDate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeDate();
-      var od = api.GoogleTypeDate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeDate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeDate(od as api.GoogleTypeDate);
     });
   });
@@ -1283,7 +1313,9 @@
   unittest.group('obj-schema-GoogleTypeExpr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleTypeExpr();
-      var od = api.GoogleTypeExpr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleTypeExpr.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleTypeExpr(od as api.GoogleTypeExpr);
     });
   });
diff --git a/generated/googleapis_beta/test/privateca/v1beta1_test.dart b/generated/googleapis_beta/test/privateca/v1beta1_test.dart
index acd2807..efaa44d 100644
--- a/generated/googleapis_beta/test/privateca/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/privateca/v1beta1_test.dart
@@ -4010,7 +4010,9 @@
   unittest.group('obj-schema-AccessUrls', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAccessUrls();
-      var od = api.AccessUrls.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AccessUrls.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAccessUrls(od as api.AccessUrls);
     });
   });
@@ -4018,7 +4020,9 @@
   unittest.group('obj-schema-ActivateCertificateAuthorityRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildActivateCertificateAuthorityRequest();
-      var od = api.ActivateCertificateAuthorityRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ActivateCertificateAuthorityRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkActivateCertificateAuthorityRequest(
           od as api.ActivateCertificateAuthorityRequest);
     });
@@ -4027,7 +4031,9 @@
   unittest.group('obj-schema-AllowedConfigList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAllowedConfigList();
-      var od = api.AllowedConfigList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AllowedConfigList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAllowedConfigList(od as api.AllowedConfigList);
     });
   });
@@ -4035,7 +4041,9 @@
   unittest.group('obj-schema-AllowedSubjectAltNames', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAllowedSubjectAltNames();
-      var od = api.AllowedSubjectAltNames.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AllowedSubjectAltNames.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAllowedSubjectAltNames(od as api.AllowedSubjectAltNames);
     });
   });
@@ -4043,7 +4051,9 @@
   unittest.group('obj-schema-AuditConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditConfig();
-      var od = api.AuditConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditConfig(od as api.AuditConfig);
     });
   });
@@ -4051,7 +4061,9 @@
   unittest.group('obj-schema-AuditLogConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAuditLogConfig();
-      var od = api.AuditLogConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AuditLogConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
@@ -4059,7 +4071,9 @@
   unittest.group('obj-schema-BillingView', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBillingView();
-      var od = api.BillingView.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BillingView.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBillingView(od as api.BillingView);
     });
   });
@@ -4067,7 +4081,9 @@
   unittest.group('obj-schema-Binding', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinding();
-      var od = api.Binding.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Binding.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBinding(od as api.Binding);
     });
   });
@@ -4075,7 +4091,9 @@
   unittest.group('obj-schema-CaOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCaOptions();
-      var od = api.CaOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CaOptions.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCaOptions(od as api.CaOptions);
     });
   });
@@ -4083,7 +4101,9 @@
   unittest.group('obj-schema-CancelOperationRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCancelOperationRequest();
-      var od = api.CancelOperationRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CancelOperationRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
@@ -4091,7 +4111,9 @@
   unittest.group('obj-schema-Certificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCertificate();
-      var od = api.Certificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Certificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCertificate(od as api.Certificate);
     });
   });
@@ -4099,7 +4121,9 @@
   unittest.group('obj-schema-CertificateAuthority', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCertificateAuthority();
-      var od = api.CertificateAuthority.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CertificateAuthority.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCertificateAuthority(od as api.CertificateAuthority);
     });
   });
@@ -4107,7 +4131,9 @@
   unittest.group('obj-schema-CertificateAuthorityPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCertificateAuthorityPolicy();
-      var od = api.CertificateAuthorityPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CertificateAuthorityPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCertificateAuthorityPolicy(od as api.CertificateAuthorityPolicy);
     });
   });
@@ -4115,7 +4141,9 @@
   unittest.group('obj-schema-CertificateConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCertificateConfig();
-      var od = api.CertificateConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CertificateConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCertificateConfig(od as api.CertificateConfig);
     });
   });
@@ -4123,7 +4151,9 @@
   unittest.group('obj-schema-CertificateDescription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCertificateDescription();
-      var od = api.CertificateDescription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CertificateDescription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCertificateDescription(od as api.CertificateDescription);
     });
   });
@@ -4131,7 +4161,9 @@
   unittest.group('obj-schema-CertificateFingerprint', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCertificateFingerprint();
-      var od = api.CertificateFingerprint.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CertificateFingerprint.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCertificateFingerprint(od as api.CertificateFingerprint);
     });
   });
@@ -4139,7 +4171,9 @@
   unittest.group('obj-schema-CertificateRevocationList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCertificateRevocationList();
-      var od = api.CertificateRevocationList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CertificateRevocationList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCertificateRevocationList(od as api.CertificateRevocationList);
     });
   });
@@ -4147,7 +4181,9 @@
   unittest.group('obj-schema-DisableCertificateAuthorityRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDisableCertificateAuthorityRequest();
-      var od = api.DisableCertificateAuthorityRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DisableCertificateAuthorityRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDisableCertificateAuthorityRequest(
           od as api.DisableCertificateAuthorityRequest);
     });
@@ -4156,7 +4192,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -4164,7 +4201,9 @@
   unittest.group('obj-schema-EnableCertificateAuthorityRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnableCertificateAuthorityRequest();
-      var od = api.EnableCertificateAuthorityRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnableCertificateAuthorityRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnableCertificateAuthorityRequest(
           od as api.EnableCertificateAuthorityRequest);
     });
@@ -4173,7 +4212,9 @@
   unittest.group('obj-schema-Exemplar', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExemplar();
-      var od = api.Exemplar.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Exemplar.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExemplar(od as api.Exemplar);
     });
   });
@@ -4181,7 +4222,8 @@
   unittest.group('obj-schema-Expr', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExpr();
-      var od = api.Expr.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Expr.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExpr(od as api.Expr);
     });
   });
@@ -4189,7 +4231,9 @@
   unittest.group('obj-schema-ExtendedKeyUsageOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExtendedKeyUsageOptions();
-      var od = api.ExtendedKeyUsageOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExtendedKeyUsageOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExtendedKeyUsageOptions(od as api.ExtendedKeyUsageOptions);
     });
   });
@@ -4197,7 +4241,9 @@
   unittest.group('obj-schema-FetchCertificateAuthorityCsrResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFetchCertificateAuthorityCsrResponse();
-      var od = api.FetchCertificateAuthorityCsrResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FetchCertificateAuthorityCsrResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFetchCertificateAuthorityCsrResponse(
           od as api.FetchCertificateAuthorityCsrResponse);
     });
@@ -4206,7 +4252,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1AttributeValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1AttributeValue();
-      var od = api.GoogleApiServicecontrolV1AttributeValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1AttributeValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1AttributeValue(
           od as api.GoogleApiServicecontrolV1AttributeValue);
     });
@@ -4215,7 +4263,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1Attributes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1Attributes();
-      var od = api.GoogleApiServicecontrolV1Attributes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1Attributes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1Attributes(
           od as api.GoogleApiServicecontrolV1Attributes);
     });
@@ -4224,7 +4274,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1Distribution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1Distribution();
-      var od = api.GoogleApiServicecontrolV1Distribution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1Distribution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1Distribution(
           od as api.GoogleApiServicecontrolV1Distribution);
     });
@@ -4233,8 +4285,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1ExplicitBuckets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1ExplicitBuckets();
-      var od =
-          api.GoogleApiServicecontrolV1ExplicitBuckets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1ExplicitBuckets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1ExplicitBuckets(
           od as api.GoogleApiServicecontrolV1ExplicitBuckets);
     });
@@ -4243,8 +4296,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1ExponentialBuckets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1ExponentialBuckets();
-      var od =
-          api.GoogleApiServicecontrolV1ExponentialBuckets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1ExponentialBuckets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1ExponentialBuckets(
           od as api.GoogleApiServicecontrolV1ExponentialBuckets);
     });
@@ -4253,7 +4307,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1HttpRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1HttpRequest();
-      var od = api.GoogleApiServicecontrolV1HttpRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1HttpRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1HttpRequest(
           od as api.GoogleApiServicecontrolV1HttpRequest);
     });
@@ -4262,7 +4318,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1LinearBuckets', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1LinearBuckets();
-      var od = api.GoogleApiServicecontrolV1LinearBuckets.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1LinearBuckets.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1LinearBuckets(
           od as api.GoogleApiServicecontrolV1LinearBuckets);
     });
@@ -4271,7 +4329,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1LogEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1LogEntry();
-      var od = api.GoogleApiServicecontrolV1LogEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1LogEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1LogEntry(
           od as api.GoogleApiServicecontrolV1LogEntry);
     });
@@ -4280,8 +4340,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1LogEntryOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1LogEntryOperation();
-      var od =
-          api.GoogleApiServicecontrolV1LogEntryOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1LogEntryOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1LogEntryOperation(
           od as api.GoogleApiServicecontrolV1LogEntryOperation);
     });
@@ -4291,8 +4352,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1LogEntrySourceLocation();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleApiServicecontrolV1LogEntrySourceLocation.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1LogEntrySourceLocation(
           od as api.GoogleApiServicecontrolV1LogEntrySourceLocation);
     });
@@ -4301,7 +4363,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1MetricValue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1MetricValue();
-      var od = api.GoogleApiServicecontrolV1MetricValue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1MetricValue.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1MetricValue(
           od as api.GoogleApiServicecontrolV1MetricValue);
     });
@@ -4310,7 +4374,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1MetricValueSet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1MetricValueSet();
-      var od = api.GoogleApiServicecontrolV1MetricValueSet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1MetricValueSet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1MetricValueSet(
           od as api.GoogleApiServicecontrolV1MetricValueSet);
     });
@@ -4319,7 +4385,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1Operation();
-      var od = api.GoogleApiServicecontrolV1Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1Operation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1Operation(
           od as api.GoogleApiServicecontrolV1Operation);
     });
@@ -4328,8 +4396,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1QuotaProperties', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1QuotaProperties();
-      var od =
-          api.GoogleApiServicecontrolV1QuotaProperties.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1QuotaProperties.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1QuotaProperties(
           od as api.GoogleApiServicecontrolV1QuotaProperties);
     });
@@ -4338,7 +4407,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1ReportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1ReportRequest();
-      var od = api.GoogleApiServicecontrolV1ReportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1ReportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1ReportRequest(
           od as api.GoogleApiServicecontrolV1ReportRequest);
     });
@@ -4347,7 +4418,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1ResourceInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1ResourceInfo();
-      var od = api.GoogleApiServicecontrolV1ResourceInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1ResourceInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1ResourceInfo(
           od as api.GoogleApiServicecontrolV1ResourceInfo);
     });
@@ -4356,7 +4429,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1TraceSpan', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1TraceSpan();
-      var od = api.GoogleApiServicecontrolV1TraceSpan.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1TraceSpan.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1TraceSpan(
           od as api.GoogleApiServicecontrolV1TraceSpan);
     });
@@ -4365,8 +4440,9 @@
   unittest.group('obj-schema-GoogleApiServicecontrolV1TruncatableString', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiServicecontrolV1TruncatableString();
-      var od =
-          api.GoogleApiServicecontrolV1TruncatableString.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiServicecontrolV1TruncatableString.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiServicecontrolV1TruncatableString(
           od as api.GoogleApiServicecontrolV1TruncatableString);
     });
@@ -4375,7 +4451,9 @@
   unittest.group('obj-schema-IssuanceModes', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIssuanceModes();
-      var od = api.IssuanceModes.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IssuanceModes.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIssuanceModes(od as api.IssuanceModes);
     });
   });
@@ -4383,7 +4461,9 @@
   unittest.group('obj-schema-IssuingOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIssuingOptions();
-      var od = api.IssuingOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IssuingOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIssuingOptions(od as api.IssuingOptions);
     });
   });
@@ -4391,7 +4471,8 @@
   unittest.group('obj-schema-KeyId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyId();
-      var od = api.KeyId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeyId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKeyId(od as api.KeyId);
     });
   });
@@ -4399,7 +4480,9 @@
   unittest.group('obj-schema-KeyUsage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyUsage();
-      var od = api.KeyUsage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.KeyUsage.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkKeyUsage(od as api.KeyUsage);
     });
   });
@@ -4407,7 +4490,9 @@
   unittest.group('obj-schema-KeyUsageOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyUsageOptions();
-      var od = api.KeyUsageOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeyUsageOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKeyUsageOptions(od as api.KeyUsageOptions);
     });
   });
@@ -4415,7 +4500,9 @@
   unittest.group('obj-schema-KeyVersionSpec', () {
     unittest.test('to-json--from-json', () async {
       var o = buildKeyVersionSpec();
-      var od = api.KeyVersionSpec.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.KeyVersionSpec.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkKeyVersionSpec(od as api.KeyVersionSpec);
     });
   });
@@ -4423,7 +4510,9 @@
   unittest.group('obj-schema-ListCertificateAuthoritiesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCertificateAuthoritiesResponse();
-      var od = api.ListCertificateAuthoritiesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCertificateAuthoritiesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCertificateAuthoritiesResponse(
           od as api.ListCertificateAuthoritiesResponse);
     });
@@ -4432,7 +4521,9 @@
   unittest.group('obj-schema-ListCertificateRevocationListsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCertificateRevocationListsResponse();
-      var od = api.ListCertificateRevocationListsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCertificateRevocationListsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCertificateRevocationListsResponse(
           od as api.ListCertificateRevocationListsResponse);
     });
@@ -4441,7 +4532,9 @@
   unittest.group('obj-schema-ListCertificatesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListCertificatesResponse();
-      var od = api.ListCertificatesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListCertificatesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListCertificatesResponse(od as api.ListCertificatesResponse);
     });
   });
@@ -4449,7 +4542,9 @@
   unittest.group('obj-schema-ListLocationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListLocationsResponse();
-      var od = api.ListLocationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListLocationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
@@ -4457,7 +4552,9 @@
   unittest.group('obj-schema-ListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListOperationsResponse();
-      var od = api.ListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
@@ -4465,7 +4562,9 @@
   unittest.group('obj-schema-ListReusableConfigsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListReusableConfigsResponse();
-      var od = api.ListReusableConfigsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListReusableConfigsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListReusableConfigsResponse(od as api.ListReusableConfigsResponse);
     });
   });
@@ -4473,7 +4572,9 @@
   unittest.group('obj-schema-Location', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocation();
-      var od = api.Location.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Location.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkLocation(od as api.Location);
     });
   });
@@ -4481,7 +4582,8 @@
   unittest.group('obj-schema-Money', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMoney();
-      var od = api.Money.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Money.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMoney(od as api.Money);
     });
   });
@@ -4489,7 +4591,9 @@
   unittest.group('obj-schema-ObjectId', () {
     unittest.test('to-json--from-json', () async {
       var o = buildObjectId();
-      var od = api.ObjectId.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ObjectId.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkObjectId(od as api.ObjectId);
     });
   });
@@ -4497,7 +4601,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -4505,7 +4611,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -4513,7 +4621,9 @@
   unittest.group('obj-schema-Policy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPolicy();
-      var od = api.Policy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Policy.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPolicy(od as api.Policy);
     });
   });
@@ -4521,7 +4631,9 @@
   unittest.group('obj-schema-PublicKey', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublicKey();
-      var od = api.PublicKey.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PublicKey.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPublicKey(od as api.PublicKey);
     });
   });
@@ -4529,7 +4641,9 @@
   unittest.group('obj-schema-RestoreCertificateAuthorityRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreCertificateAuthorityRequest();
-      var od = api.RestoreCertificateAuthorityRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreCertificateAuthorityRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreCertificateAuthorityRequest(
           od as api.RestoreCertificateAuthorityRequest);
     });
@@ -4538,7 +4652,9 @@
   unittest.group('obj-schema-ReusableConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReusableConfig();
-      var od = api.ReusableConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReusableConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReusableConfig(od as api.ReusableConfig);
     });
   });
@@ -4546,7 +4662,9 @@
   unittest.group('obj-schema-ReusableConfigValues', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReusableConfigValues();
-      var od = api.ReusableConfigValues.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReusableConfigValues.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReusableConfigValues(od as api.ReusableConfigValues);
     });
   });
@@ -4554,7 +4672,9 @@
   unittest.group('obj-schema-ReusableConfigWrapper', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReusableConfigWrapper();
-      var od = api.ReusableConfigWrapper.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReusableConfigWrapper.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReusableConfigWrapper(od as api.ReusableConfigWrapper);
     });
   });
@@ -4562,7 +4682,9 @@
   unittest.group('obj-schema-RevocationDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevocationDetails();
-      var od = api.RevocationDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevocationDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevocationDetails(od as api.RevocationDetails);
     });
   });
@@ -4570,7 +4692,9 @@
   unittest.group('obj-schema-RevokeCertificateRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevokeCertificateRequest();
-      var od = api.RevokeCertificateRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevokeCertificateRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevokeCertificateRequest(od as api.RevokeCertificateRequest);
     });
   });
@@ -4578,7 +4702,9 @@
   unittest.group('obj-schema-RevokedCertificate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRevokedCertificate();
-      var od = api.RevokedCertificate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RevokedCertificate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRevokedCertificate(od as api.RevokedCertificate);
     });
   });
@@ -4586,8 +4712,9 @@
   unittest.group('obj-schema-ScheduleDeleteCertificateAuthorityRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScheduleDeleteCertificateAuthorityRequest();
-      var od =
-          api.ScheduleDeleteCertificateAuthorityRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScheduleDeleteCertificateAuthorityRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScheduleDeleteCertificateAuthorityRequest(
           od as api.ScheduleDeleteCertificateAuthorityRequest);
     });
@@ -4596,7 +4723,9 @@
   unittest.group('obj-schema-SetIamPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSetIamPolicyRequest();
-      var od = api.SetIamPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SetIamPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
@@ -4604,7 +4733,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4612,7 +4743,9 @@
   unittest.group('obj-schema-Subject', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubject();
-      var od = api.Subject.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Subject.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSubject(od as api.Subject);
     });
   });
@@ -4620,7 +4753,9 @@
   unittest.group('obj-schema-SubjectAltNames', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubjectAltNames();
-      var od = api.SubjectAltNames.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubjectAltNames.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubjectAltNames(od as api.SubjectAltNames);
     });
   });
@@ -4628,7 +4763,9 @@
   unittest.group('obj-schema-SubjectConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubjectConfig();
-      var od = api.SubjectConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubjectConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubjectConfig(od as api.SubjectConfig);
     });
   });
@@ -4636,7 +4773,9 @@
   unittest.group('obj-schema-SubjectDescription', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubjectDescription();
-      var od = api.SubjectDescription.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubjectDescription.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubjectDescription(od as api.SubjectDescription);
     });
   });
@@ -4644,7 +4783,9 @@
   unittest.group('obj-schema-SubordinateConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubordinateConfig();
-      var od = api.SubordinateConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubordinateConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubordinateConfig(od as api.SubordinateConfig);
     });
   });
@@ -4652,7 +4793,9 @@
   unittest.group('obj-schema-SubordinateConfigChain', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSubordinateConfigChain();
-      var od = api.SubordinateConfigChain.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SubordinateConfigChain.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSubordinateConfigChain(od as api.SubordinateConfigChain);
     });
   });
@@ -4660,7 +4803,9 @@
   unittest.group('obj-schema-TestIamPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsRequest();
-      var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
@@ -4668,7 +4813,9 @@
   unittest.group('obj-schema-TestIamPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIamPermissionsResponse();
-      var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestIamPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
@@ -4676,7 +4823,9 @@
   unittest.group('obj-schema-X509Extension', () {
     unittest.test('to-json--from-json', () async {
       var o = buildX509Extension();
-      var od = api.X509Extension.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.X509Extension.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkX509Extension(od as api.X509Extension);
     });
   });
diff --git a/generated/googleapis_beta/test/prod_tt_sasportal/v1alpha1_test.dart b/generated/googleapis_beta/test/prod_tt_sasportal/v1alpha1_test.dart
index 595b971..813b7f1 100644
--- a/generated/googleapis_beta/test/prod_tt_sasportal/v1alpha1_test.dart
+++ b/generated/googleapis_beta/test/prod_tt_sasportal/v1alpha1_test.dart
@@ -1468,7 +1468,9 @@
   unittest.group('obj-schema-SasPortalAssignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalAssignment();
-      var od = api.SasPortalAssignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalAssignment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalAssignment(od as api.SasPortalAssignment);
     });
   });
@@ -1476,7 +1478,9 @@
   unittest.group('obj-schema-SasPortalCreateSignedDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalCreateSignedDeviceRequest();
-      var od = api.SasPortalCreateSignedDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalCreateSignedDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalCreateSignedDeviceRequest(
           od as api.SasPortalCreateSignedDeviceRequest);
     });
@@ -1485,7 +1489,9 @@
   unittest.group('obj-schema-SasPortalCustomer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalCustomer();
-      var od = api.SasPortalCustomer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalCustomer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalCustomer(od as api.SasPortalCustomer);
     });
   });
@@ -1493,7 +1499,9 @@
   unittest.group('obj-schema-SasPortalDeployment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeployment();
-      var od = api.SasPortalDeployment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeployment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeployment(od as api.SasPortalDeployment);
     });
   });
@@ -1501,7 +1509,9 @@
   unittest.group('obj-schema-SasPortalDevice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDevice();
-      var od = api.SasPortalDevice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDevice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDevice(od as api.SasPortalDevice);
     });
   });
@@ -1509,7 +1519,9 @@
   unittest.group('obj-schema-SasPortalDeviceAirInterface', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeviceAirInterface();
-      var od = api.SasPortalDeviceAirInterface.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeviceAirInterface.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeviceAirInterface(od as api.SasPortalDeviceAirInterface);
     });
   });
@@ -1517,7 +1529,9 @@
   unittest.group('obj-schema-SasPortalDeviceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeviceConfig();
-      var od = api.SasPortalDeviceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeviceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeviceConfig(od as api.SasPortalDeviceConfig);
     });
   });
@@ -1525,7 +1539,9 @@
   unittest.group('obj-schema-SasPortalDeviceGrant', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeviceGrant();
-      var od = api.SasPortalDeviceGrant.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeviceGrant.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeviceGrant(od as api.SasPortalDeviceGrant);
     });
   });
@@ -1533,7 +1549,9 @@
   unittest.group('obj-schema-SasPortalDeviceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeviceMetadata();
-      var od = api.SasPortalDeviceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeviceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeviceMetadata(od as api.SasPortalDeviceMetadata);
     });
   });
@@ -1541,7 +1559,9 @@
   unittest.group('obj-schema-SasPortalDeviceModel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeviceModel();
-      var od = api.SasPortalDeviceModel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeviceModel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeviceModel(od as api.SasPortalDeviceModel);
     });
   });
@@ -1549,7 +1569,9 @@
   unittest.group('obj-schema-SasPortalDpaMoveList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDpaMoveList();
-      var od = api.SasPortalDpaMoveList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDpaMoveList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDpaMoveList(od as api.SasPortalDpaMoveList);
     });
   });
@@ -1557,7 +1579,9 @@
   unittest.group('obj-schema-SasPortalEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalEmpty();
-      var od = api.SasPortalEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalEmpty(od as api.SasPortalEmpty);
     });
   });
@@ -1565,7 +1589,9 @@
   unittest.group('obj-schema-SasPortalFrequencyRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalFrequencyRange();
-      var od = api.SasPortalFrequencyRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalFrequencyRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalFrequencyRange(od as api.SasPortalFrequencyRange);
     });
   });
@@ -1573,7 +1599,9 @@
   unittest.group('obj-schema-SasPortalGenerateSecretRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalGenerateSecretRequest();
-      var od = api.SasPortalGenerateSecretRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalGenerateSecretRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalGenerateSecretRequest(
           od as api.SasPortalGenerateSecretRequest);
     });
@@ -1582,7 +1610,9 @@
   unittest.group('obj-schema-SasPortalGenerateSecretResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalGenerateSecretResponse();
-      var od = api.SasPortalGenerateSecretResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalGenerateSecretResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalGenerateSecretResponse(
           od as api.SasPortalGenerateSecretResponse);
     });
@@ -1591,7 +1621,9 @@
   unittest.group('obj-schema-SasPortalGetPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalGetPolicyRequest();
-      var od = api.SasPortalGetPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalGetPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalGetPolicyRequest(od as api.SasPortalGetPolicyRequest);
     });
   });
@@ -1599,7 +1631,9 @@
   unittest.group('obj-schema-SasPortalInstallationParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalInstallationParams();
-      var od = api.SasPortalInstallationParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalInstallationParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalInstallationParams(od as api.SasPortalInstallationParams);
     });
   });
@@ -1607,7 +1641,9 @@
   unittest.group('obj-schema-SasPortalListCustomersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalListCustomersResponse();
-      var od = api.SasPortalListCustomersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalListCustomersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalListCustomersResponse(
           od as api.SasPortalListCustomersResponse);
     });
@@ -1616,7 +1652,9 @@
   unittest.group('obj-schema-SasPortalListDeploymentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalListDeploymentsResponse();
-      var od = api.SasPortalListDeploymentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalListDeploymentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalListDeploymentsResponse(
           od as api.SasPortalListDeploymentsResponse);
     });
@@ -1625,7 +1663,9 @@
   unittest.group('obj-schema-SasPortalListDevicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalListDevicesResponse();
-      var od = api.SasPortalListDevicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalListDevicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalListDevicesResponse(od as api.SasPortalListDevicesResponse);
     });
   });
@@ -1633,7 +1673,9 @@
   unittest.group('obj-schema-SasPortalListNodesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalListNodesResponse();
-      var od = api.SasPortalListNodesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalListNodesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalListNodesResponse(od as api.SasPortalListNodesResponse);
     });
   });
@@ -1641,7 +1683,9 @@
   unittest.group('obj-schema-SasPortalMoveDeploymentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalMoveDeploymentRequest();
-      var od = api.SasPortalMoveDeploymentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalMoveDeploymentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalMoveDeploymentRequest(
           od as api.SasPortalMoveDeploymentRequest);
     });
@@ -1650,7 +1694,9 @@
   unittest.group('obj-schema-SasPortalMoveDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalMoveDeviceRequest();
-      var od = api.SasPortalMoveDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalMoveDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalMoveDeviceRequest(od as api.SasPortalMoveDeviceRequest);
     });
   });
@@ -1658,7 +1704,9 @@
   unittest.group('obj-schema-SasPortalMoveNodeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalMoveNodeRequest();
-      var od = api.SasPortalMoveNodeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalMoveNodeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalMoveNodeRequest(od as api.SasPortalMoveNodeRequest);
     });
   });
@@ -1666,7 +1714,9 @@
   unittest.group('obj-schema-SasPortalNode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalNode();
-      var od = api.SasPortalNode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalNode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalNode(od as api.SasPortalNode);
     });
   });
@@ -1674,7 +1724,9 @@
   unittest.group('obj-schema-SasPortalOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalOperation();
-      var od = api.SasPortalOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalOperation(od as api.SasPortalOperation);
     });
   });
@@ -1682,7 +1734,9 @@
   unittest.group('obj-schema-SasPortalPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalPolicy();
-      var od = api.SasPortalPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalPolicy(od as api.SasPortalPolicy);
     });
   });
@@ -1690,7 +1744,9 @@
   unittest.group('obj-schema-SasPortalSetPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalSetPolicyRequest();
-      var od = api.SasPortalSetPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalSetPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalSetPolicyRequest(od as api.SasPortalSetPolicyRequest);
     });
   });
@@ -1698,7 +1754,9 @@
   unittest.group('obj-schema-SasPortalSignDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalSignDeviceRequest();
-      var od = api.SasPortalSignDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalSignDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalSignDeviceRequest(od as api.SasPortalSignDeviceRequest);
     });
   });
@@ -1706,7 +1764,9 @@
   unittest.group('obj-schema-SasPortalStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalStatus();
-      var od = api.SasPortalStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalStatus(od as api.SasPortalStatus);
     });
   });
@@ -1714,7 +1774,9 @@
   unittest.group('obj-schema-SasPortalTestPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalTestPermissionsRequest();
-      var od = api.SasPortalTestPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalTestPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalTestPermissionsRequest(
           od as api.SasPortalTestPermissionsRequest);
     });
@@ -1723,7 +1785,9 @@
   unittest.group('obj-schema-SasPortalTestPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalTestPermissionsResponse();
-      var od = api.SasPortalTestPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalTestPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalTestPermissionsResponse(
           od as api.SasPortalTestPermissionsResponse);
     });
@@ -1732,7 +1796,9 @@
   unittest.group('obj-schema-SasPortalUpdateSignedDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalUpdateSignedDeviceRequest();
-      var od = api.SasPortalUpdateSignedDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalUpdateSignedDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalUpdateSignedDeviceRequest(
           od as api.SasPortalUpdateSignedDeviceRequest);
     });
@@ -1741,7 +1807,9 @@
   unittest.group('obj-schema-SasPortalValidateInstallerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalValidateInstallerRequest();
-      var od = api.SasPortalValidateInstallerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalValidateInstallerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalValidateInstallerRequest(
           od as api.SasPortalValidateInstallerRequest);
     });
@@ -1750,7 +1818,9 @@
   unittest.group('obj-schema-SasPortalValidateInstallerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalValidateInstallerResponse();
-      var od = api.SasPortalValidateInstallerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalValidateInstallerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalValidateInstallerResponse(
           od as api.SasPortalValidateInstallerResponse);
     });
diff --git a/generated/googleapis_beta/test/recommendationengine/v1beta1_test.dart b/generated/googleapis_beta/test/recommendationengine/v1beta1_test.dart
index 2cdd5ad..ea86165 100644
--- a/generated/googleapis_beta/test/recommendationengine/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/recommendationengine/v1beta1_test.dart
@@ -2653,7 +2653,9 @@
   unittest.group('obj-schema-GoogleApiHttpBody', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleApiHttpBody();
-      var od = api.GoogleApiHttpBody.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleApiHttpBody.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleApiHttpBody(od as api.GoogleApiHttpBody);
     });
   });
@@ -2664,8 +2666,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1alphaRejoinCatalogMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1alphaRejoinCatalogMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1alphaRejoinCatalogMetadata(od
           as api.GoogleCloudRecommendationengineV1alphaRejoinCatalogMetadata);
     });
@@ -2677,8 +2680,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1alphaRejoinCatalogResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1alphaRejoinCatalogResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1alphaRejoinCatalogResponse(od
           as api.GoogleCloudRecommendationengineV1alphaRejoinCatalogResponse);
     });
@@ -2688,9 +2692,10 @@
       'obj-schema-GoogleCloudRecommendationengineV1alphaTuningMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1alphaTuningMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1alphaTuningMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1alphaTuningMetadata(
           od as api.GoogleCloudRecommendationengineV1alphaTuningMetadata);
     });
@@ -2700,9 +2705,10 @@
       'obj-schema-GoogleCloudRecommendationengineV1alphaTuningResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1alphaTuningResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1alphaTuningResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1alphaTuningResponse(
           od as api.GoogleCloudRecommendationengineV1alphaTuningResponse);
     });
@@ -2712,9 +2718,10 @@
       'obj-schema-GoogleCloudRecommendationengineV1beta1BigQuerySource', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1BigQuerySource();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1BigQuerySource.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1BigQuerySource(
           od as api.GoogleCloudRecommendationengineV1beta1BigQuerySource);
     });
@@ -2724,8 +2731,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1Catalog();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1Catalog.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1Catalog(
           od as api.GoogleCloudRecommendationengineV1beta1Catalog);
     });
@@ -2736,8 +2744,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1CatalogInlineSource();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1CatalogInlineSource
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1CatalogInlineSource(
           od as api.GoogleCloudRecommendationengineV1beta1CatalogInlineSource);
     });
@@ -2747,8 +2756,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1CatalogItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1CatalogItem.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1CatalogItem(
           od as api.GoogleCloudRecommendationengineV1beta1CatalogItem);
     });
@@ -2760,9 +2770,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1CatalogItemCategoryHierarchy();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1CatalogItemCategoryHierarchy
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1CatalogItemCategoryHierarchy(od
           as api
               .GoogleCloudRecommendationengineV1beta1CatalogItemCategoryHierarchy);
@@ -2775,8 +2786,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1CatalogItemLevelConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1CatalogItemLevelConfig
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1CatalogItemLevelConfig(od
           as api.GoogleCloudRecommendationengineV1beta1CatalogItemLevelConfig);
     });
@@ -2788,9 +2800,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1CreatePredictionApiKeyRegistrationRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1CreatePredictionApiKeyRegistrationRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1CreatePredictionApiKeyRegistrationRequest(
           od as api
               .GoogleCloudRecommendationengineV1beta1CreatePredictionApiKeyRegistrationRequest);
@@ -2801,8 +2814,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1EventDetail();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1EventDetail.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1EventDetail(
           od as api.GoogleCloudRecommendationengineV1beta1EventDetail);
     });
@@ -2812,8 +2826,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1FeatureMap();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1FeatureMap.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1FeatureMap(
           od as api.GoogleCloudRecommendationengineV1beta1FeatureMap);
     });
@@ -2824,8 +2839,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1FeatureMapFloatList();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1FeatureMapFloatList
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1FeatureMapFloatList(
           od as api.GoogleCloudRecommendationengineV1beta1FeatureMapFloatList);
     });
@@ -2836,8 +2852,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1FeatureMapStringList();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1FeatureMapStringList
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1FeatureMapStringList(
           od as api.GoogleCloudRecommendationengineV1beta1FeatureMapStringList);
     });
@@ -2847,8 +2864,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1GcsSource();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1GcsSource.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1GcsSource(
           od as api.GoogleCloudRecommendationengineV1beta1GcsSource);
     });
@@ -2857,8 +2875,9 @@
   unittest.group('obj-schema-GoogleCloudRecommendationengineV1beta1Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1Image();
-      var od =
-          api.GoogleCloudRecommendationengineV1beta1Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleCloudRecommendationengineV1beta1Image.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1Image(
           od as api.GoogleCloudRecommendationengineV1beta1Image);
     });
@@ -2870,9 +2889,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1ImportCatalogItemsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ImportCatalogItemsRequest
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ImportCatalogItemsRequest(od
           as api
               .GoogleCloudRecommendationengineV1beta1ImportCatalogItemsRequest);
@@ -2885,9 +2905,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1ImportCatalogItemsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ImportCatalogItemsResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ImportCatalogItemsResponse(od
           as api
               .GoogleCloudRecommendationengineV1beta1ImportCatalogItemsResponse);
@@ -2899,9 +2920,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1ImportErrorsConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ImportErrorsConfig.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ImportErrorsConfig(
           od as api.GoogleCloudRecommendationengineV1beta1ImportErrorsConfig);
     });
@@ -2911,9 +2933,10 @@
       'obj-schema-GoogleCloudRecommendationengineV1beta1ImportMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1ImportMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ImportMetadata.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ImportMetadata(
           od as api.GoogleCloudRecommendationengineV1beta1ImportMetadata);
     });
@@ -2925,8 +2948,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1ImportUserEventsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1ImportUserEventsRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ImportUserEventsRequest(od
           as api.GoogleCloudRecommendationengineV1beta1ImportUserEventsRequest);
     });
@@ -2938,9 +2962,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1ImportUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ImportUserEventsResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ImportUserEventsResponse(od
           as api
               .GoogleCloudRecommendationengineV1beta1ImportUserEventsResponse);
@@ -2951,8 +2976,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1InputConfig();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1InputConfig.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1InputConfig(
           od as api.GoogleCloudRecommendationengineV1beta1InputConfig);
     });
@@ -2964,9 +2990,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1ListCatalogItemsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ListCatalogItemsResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ListCatalogItemsResponse(od
           as api
               .GoogleCloudRecommendationengineV1beta1ListCatalogItemsResponse);
@@ -2978,8 +3005,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1ListCatalogsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1ListCatalogsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ListCatalogsResponse(
           od as api.GoogleCloudRecommendationengineV1beta1ListCatalogsResponse);
     });
@@ -2991,9 +3019,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1ListPredictionApiKeyRegistrationsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ListPredictionApiKeyRegistrationsResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ListPredictionApiKeyRegistrationsResponse(
           od as api
               .GoogleCloudRecommendationengineV1beta1ListPredictionApiKeyRegistrationsResponse);
@@ -3006,8 +3035,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1ListUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1ListUserEventsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ListUserEventsResponse(od
           as api.GoogleCloudRecommendationengineV1beta1ListUserEventsResponse);
     });
@@ -3017,9 +3047,10 @@
       'obj-schema-GoogleCloudRecommendationengineV1beta1PredictRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1PredictRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1PredictRequest.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1PredictRequest(
           od as api.GoogleCloudRecommendationengineV1beta1PredictRequest);
     });
@@ -3029,9 +3060,10 @@
       'obj-schema-GoogleCloudRecommendationengineV1beta1PredictResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1PredictResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1PredictResponse.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1PredictResponse(
           od as api.GoogleCloudRecommendationengineV1beta1PredictResponse);
     });
@@ -3043,9 +3075,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1PredictResponsePredictionResult();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1PredictResponsePredictionResult
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1PredictResponsePredictionResult(
           od as api
               .GoogleCloudRecommendationengineV1beta1PredictResponsePredictionResult);
@@ -3058,9 +3091,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1PredictionApiKeyRegistration();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1PredictionApiKeyRegistration
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1PredictionApiKeyRegistration(od
           as api
               .GoogleCloudRecommendationengineV1beta1PredictionApiKeyRegistration);
@@ -3072,9 +3106,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1ProductCatalogItem();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ProductCatalogItem.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ProductCatalogItem(
           od as api.GoogleCloudRecommendationengineV1beta1ProductCatalogItem);
     });
@@ -3086,9 +3121,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1ProductCatalogItemExactPrice();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ProductCatalogItemExactPrice
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ProductCatalogItemExactPrice(od
           as api
               .GoogleCloudRecommendationengineV1beta1ProductCatalogItemExactPrice);
@@ -3101,9 +3137,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1ProductCatalogItemPriceRange();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ProductCatalogItemPriceRange
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ProductCatalogItemPriceRange(od
           as api
               .GoogleCloudRecommendationengineV1beta1ProductCatalogItemPriceRange);
@@ -3114,8 +3151,9 @@
       'obj-schema-GoogleCloudRecommendationengineV1beta1ProductDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1ProductDetail();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1ProductDetail.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ProductDetail(
           od as api.GoogleCloudRecommendationengineV1beta1ProductDetail);
     });
@@ -3126,9 +3164,10 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1ProductEventDetail();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1ProductEventDetail.fromJson(
-              o.toJson());
+              oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1ProductEventDetail(
           od as api.GoogleCloudRecommendationengineV1beta1ProductEventDetail);
     });
@@ -3139,8 +3178,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1PurchaseTransaction();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1PurchaseTransaction
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1PurchaseTransaction(
           od as api.GoogleCloudRecommendationengineV1beta1PurchaseTransaction);
     });
@@ -3152,8 +3192,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1PurgeUserEventsMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1PurgeUserEventsMetadata
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1PurgeUserEventsMetadata(od
           as api.GoogleCloudRecommendationengineV1beta1PurgeUserEventsMetadata);
     });
@@ -3165,8 +3206,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1PurgeUserEventsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1PurgeUserEventsRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1PurgeUserEventsRequest(od
           as api.GoogleCloudRecommendationengineV1beta1PurgeUserEventsRequest);
     });
@@ -3178,8 +3220,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1PurgeUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1PurgeUserEventsResponse
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1PurgeUserEventsResponse(od
           as api.GoogleCloudRecommendationengineV1beta1PurgeUserEventsResponse);
     });
@@ -3191,9 +3234,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1RejoinUserEventsMetadata();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1RejoinUserEventsMetadata
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1RejoinUserEventsMetadata(od
           as api
               .GoogleCloudRecommendationengineV1beta1RejoinUserEventsMetadata);
@@ -3206,8 +3250,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1RejoinUserEventsRequest();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1RejoinUserEventsRequest
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1RejoinUserEventsRequest(od
           as api.GoogleCloudRecommendationengineV1beta1RejoinUserEventsRequest);
     });
@@ -3219,9 +3264,10 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1RejoinUserEventsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od =
           api.GoogleCloudRecommendationengineV1beta1RejoinUserEventsResponse
-              .fromJson(o.toJson());
+              .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1RejoinUserEventsResponse(od
           as api
               .GoogleCloudRecommendationengineV1beta1RejoinUserEventsResponse);
@@ -3232,8 +3278,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1UserEvent();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1UserEvent.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1UserEvent(
           od as api.GoogleCloudRecommendationengineV1beta1UserEvent);
     });
@@ -3245,8 +3292,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1UserEventImportSummary();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1UserEventImportSummary
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1UserEventImportSummary(od
           as api.GoogleCloudRecommendationengineV1beta1UserEventImportSummary);
     });
@@ -3258,8 +3306,9 @@
     unittest.test('to-json--from-json', () async {
       var o =
           buildGoogleCloudRecommendationengineV1beta1UserEventInlineSource();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1UserEventInlineSource
-          .fromJson(o.toJson());
+          .fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1UserEventInlineSource(od
           as api.GoogleCloudRecommendationengineV1beta1UserEventInlineSource);
     });
@@ -3269,8 +3318,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleCloudRecommendationengineV1beta1UserInfo();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.GoogleCloudRecommendationengineV1beta1UserInfo.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleCloudRecommendationengineV1beta1UserInfo(
           od as api.GoogleCloudRecommendationengineV1beta1UserInfo);
     });
@@ -3279,7 +3329,9 @@
   unittest.group('obj-schema-GoogleLongrunningListOperationsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningListOperationsResponse();
-      var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningListOperationsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningListOperationsResponse(
           od as api.GoogleLongrunningListOperationsResponse);
     });
@@ -3288,7 +3340,9 @@
   unittest.group('obj-schema-GoogleLongrunningOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleLongrunningOperation();
-      var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleLongrunningOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
@@ -3296,7 +3350,9 @@
   unittest.group('obj-schema-GoogleProtobufEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleProtobufEmpty();
-      var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleProtobufEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
@@ -3304,7 +3360,9 @@
   unittest.group('obj-schema-GoogleRpcStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGoogleRpcStatus();
-      var od = api.GoogleRpcStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GoogleRpcStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
diff --git a/generated/googleapis_beta/test/sasportal/v1alpha1_test.dart b/generated/googleapis_beta/test/sasportal/v1alpha1_test.dart
index e20855e..ae29e76 100644
--- a/generated/googleapis_beta/test/sasportal/v1alpha1_test.dart
+++ b/generated/googleapis_beta/test/sasportal/v1alpha1_test.dart
@@ -1468,7 +1468,9 @@
   unittest.group('obj-schema-SasPortalAssignment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalAssignment();
-      var od = api.SasPortalAssignment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalAssignment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalAssignment(od as api.SasPortalAssignment);
     });
   });
@@ -1476,7 +1478,9 @@
   unittest.group('obj-schema-SasPortalCreateSignedDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalCreateSignedDeviceRequest();
-      var od = api.SasPortalCreateSignedDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalCreateSignedDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalCreateSignedDeviceRequest(
           od as api.SasPortalCreateSignedDeviceRequest);
     });
@@ -1485,7 +1489,9 @@
   unittest.group('obj-schema-SasPortalCustomer', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalCustomer();
-      var od = api.SasPortalCustomer.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalCustomer.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalCustomer(od as api.SasPortalCustomer);
     });
   });
@@ -1493,7 +1499,9 @@
   unittest.group('obj-schema-SasPortalDeployment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeployment();
-      var od = api.SasPortalDeployment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeployment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeployment(od as api.SasPortalDeployment);
     });
   });
@@ -1501,7 +1509,9 @@
   unittest.group('obj-schema-SasPortalDevice', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDevice();
-      var od = api.SasPortalDevice.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDevice.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDevice(od as api.SasPortalDevice);
     });
   });
@@ -1509,7 +1519,9 @@
   unittest.group('obj-schema-SasPortalDeviceAirInterface', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeviceAirInterface();
-      var od = api.SasPortalDeviceAirInterface.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeviceAirInterface.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeviceAirInterface(od as api.SasPortalDeviceAirInterface);
     });
   });
@@ -1517,7 +1529,9 @@
   unittest.group('obj-schema-SasPortalDeviceConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeviceConfig();
-      var od = api.SasPortalDeviceConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeviceConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeviceConfig(od as api.SasPortalDeviceConfig);
     });
   });
@@ -1525,7 +1539,9 @@
   unittest.group('obj-schema-SasPortalDeviceGrant', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeviceGrant();
-      var od = api.SasPortalDeviceGrant.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeviceGrant.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeviceGrant(od as api.SasPortalDeviceGrant);
     });
   });
@@ -1533,7 +1549,9 @@
   unittest.group('obj-schema-SasPortalDeviceMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeviceMetadata();
-      var od = api.SasPortalDeviceMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeviceMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeviceMetadata(od as api.SasPortalDeviceMetadata);
     });
   });
@@ -1541,7 +1559,9 @@
   unittest.group('obj-schema-SasPortalDeviceModel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDeviceModel();
-      var od = api.SasPortalDeviceModel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDeviceModel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDeviceModel(od as api.SasPortalDeviceModel);
     });
   });
@@ -1549,7 +1569,9 @@
   unittest.group('obj-schema-SasPortalDpaMoveList', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalDpaMoveList();
-      var od = api.SasPortalDpaMoveList.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalDpaMoveList.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalDpaMoveList(od as api.SasPortalDpaMoveList);
     });
   });
@@ -1557,7 +1579,9 @@
   unittest.group('obj-schema-SasPortalEmpty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalEmpty();
-      var od = api.SasPortalEmpty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalEmpty.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalEmpty(od as api.SasPortalEmpty);
     });
   });
@@ -1565,7 +1589,9 @@
   unittest.group('obj-schema-SasPortalFrequencyRange', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalFrequencyRange();
-      var od = api.SasPortalFrequencyRange.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalFrequencyRange.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalFrequencyRange(od as api.SasPortalFrequencyRange);
     });
   });
@@ -1573,7 +1599,9 @@
   unittest.group('obj-schema-SasPortalGenerateSecretRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalGenerateSecretRequest();
-      var od = api.SasPortalGenerateSecretRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalGenerateSecretRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalGenerateSecretRequest(
           od as api.SasPortalGenerateSecretRequest);
     });
@@ -1582,7 +1610,9 @@
   unittest.group('obj-schema-SasPortalGenerateSecretResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalGenerateSecretResponse();
-      var od = api.SasPortalGenerateSecretResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalGenerateSecretResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalGenerateSecretResponse(
           od as api.SasPortalGenerateSecretResponse);
     });
@@ -1591,7 +1621,9 @@
   unittest.group('obj-schema-SasPortalGetPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalGetPolicyRequest();
-      var od = api.SasPortalGetPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalGetPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalGetPolicyRequest(od as api.SasPortalGetPolicyRequest);
     });
   });
@@ -1599,7 +1631,9 @@
   unittest.group('obj-schema-SasPortalInstallationParams', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalInstallationParams();
-      var od = api.SasPortalInstallationParams.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalInstallationParams.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalInstallationParams(od as api.SasPortalInstallationParams);
     });
   });
@@ -1607,7 +1641,9 @@
   unittest.group('obj-schema-SasPortalListCustomersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalListCustomersResponse();
-      var od = api.SasPortalListCustomersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalListCustomersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalListCustomersResponse(
           od as api.SasPortalListCustomersResponse);
     });
@@ -1616,7 +1652,9 @@
   unittest.group('obj-schema-SasPortalListDeploymentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalListDeploymentsResponse();
-      var od = api.SasPortalListDeploymentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalListDeploymentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalListDeploymentsResponse(
           od as api.SasPortalListDeploymentsResponse);
     });
@@ -1625,7 +1663,9 @@
   unittest.group('obj-schema-SasPortalListDevicesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalListDevicesResponse();
-      var od = api.SasPortalListDevicesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalListDevicesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalListDevicesResponse(od as api.SasPortalListDevicesResponse);
     });
   });
@@ -1633,7 +1673,9 @@
   unittest.group('obj-schema-SasPortalListNodesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalListNodesResponse();
-      var od = api.SasPortalListNodesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalListNodesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalListNodesResponse(od as api.SasPortalListNodesResponse);
     });
   });
@@ -1641,7 +1683,9 @@
   unittest.group('obj-schema-SasPortalMoveDeploymentRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalMoveDeploymentRequest();
-      var od = api.SasPortalMoveDeploymentRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalMoveDeploymentRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalMoveDeploymentRequest(
           od as api.SasPortalMoveDeploymentRequest);
     });
@@ -1650,7 +1694,9 @@
   unittest.group('obj-schema-SasPortalMoveDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalMoveDeviceRequest();
-      var od = api.SasPortalMoveDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalMoveDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalMoveDeviceRequest(od as api.SasPortalMoveDeviceRequest);
     });
   });
@@ -1658,7 +1704,9 @@
   unittest.group('obj-schema-SasPortalMoveNodeRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalMoveNodeRequest();
-      var od = api.SasPortalMoveNodeRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalMoveNodeRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalMoveNodeRequest(od as api.SasPortalMoveNodeRequest);
     });
   });
@@ -1666,7 +1714,9 @@
   unittest.group('obj-schema-SasPortalNode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalNode();
-      var od = api.SasPortalNode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalNode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalNode(od as api.SasPortalNode);
     });
   });
@@ -1674,7 +1724,9 @@
   unittest.group('obj-schema-SasPortalOperation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalOperation();
-      var od = api.SasPortalOperation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalOperation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalOperation(od as api.SasPortalOperation);
     });
   });
@@ -1682,7 +1734,9 @@
   unittest.group('obj-schema-SasPortalPolicy', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalPolicy();
-      var od = api.SasPortalPolicy.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalPolicy.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalPolicy(od as api.SasPortalPolicy);
     });
   });
@@ -1690,7 +1744,9 @@
   unittest.group('obj-schema-SasPortalSetPolicyRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalSetPolicyRequest();
-      var od = api.SasPortalSetPolicyRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalSetPolicyRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalSetPolicyRequest(od as api.SasPortalSetPolicyRequest);
     });
   });
@@ -1698,7 +1754,9 @@
   unittest.group('obj-schema-SasPortalSignDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalSignDeviceRequest();
-      var od = api.SasPortalSignDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalSignDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalSignDeviceRequest(od as api.SasPortalSignDeviceRequest);
     });
   });
@@ -1706,7 +1764,9 @@
   unittest.group('obj-schema-SasPortalStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalStatus();
-      var od = api.SasPortalStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalStatus(od as api.SasPortalStatus);
     });
   });
@@ -1714,7 +1774,9 @@
   unittest.group('obj-schema-SasPortalTestPermissionsRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalTestPermissionsRequest();
-      var od = api.SasPortalTestPermissionsRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalTestPermissionsRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalTestPermissionsRequest(
           od as api.SasPortalTestPermissionsRequest);
     });
@@ -1723,7 +1785,9 @@
   unittest.group('obj-schema-SasPortalTestPermissionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalTestPermissionsResponse();
-      var od = api.SasPortalTestPermissionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalTestPermissionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalTestPermissionsResponse(
           od as api.SasPortalTestPermissionsResponse);
     });
@@ -1732,7 +1796,9 @@
   unittest.group('obj-schema-SasPortalUpdateSignedDeviceRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalUpdateSignedDeviceRequest();
-      var od = api.SasPortalUpdateSignedDeviceRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalUpdateSignedDeviceRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalUpdateSignedDeviceRequest(
           od as api.SasPortalUpdateSignedDeviceRequest);
     });
@@ -1741,7 +1807,9 @@
   unittest.group('obj-schema-SasPortalValidateInstallerRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalValidateInstallerRequest();
-      var od = api.SasPortalValidateInstallerRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalValidateInstallerRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalValidateInstallerRequest(
           od as api.SasPortalValidateInstallerRequest);
     });
@@ -1750,7 +1818,9 @@
   unittest.group('obj-schema-SasPortalValidateInstallerResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSasPortalValidateInstallerResponse();
-      var od = api.SasPortalValidateInstallerResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SasPortalValidateInstallerResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSasPortalValidateInstallerResponse(
           od as api.SasPortalValidateInstallerResponse);
     });
diff --git a/generated/googleapis_beta/test/sqladmin/v1beta4_test.dart b/generated/googleapis_beta/test/sqladmin/v1beta4_test.dart
index 7af81ac..16dcfff 100644
--- a/generated/googleapis_beta/test/sqladmin/v1beta4_test.dart
+++ b/generated/googleapis_beta/test/sqladmin/v1beta4_test.dart
@@ -3075,7 +3075,9 @@
   unittest.group('obj-schema-AclEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAclEntry();
-      var od = api.AclEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AclEntry.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAclEntry(od as api.AclEntry);
     });
   });
@@ -3083,7 +3085,9 @@
   unittest.group('obj-schema-ApiWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildApiWarning();
-      var od = api.ApiWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.ApiWarning.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkApiWarning(od as api.ApiWarning);
     });
   });
@@ -3091,7 +3095,9 @@
   unittest.group('obj-schema-BackupConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackupConfiguration();
-      var od = api.BackupConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackupConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackupConfiguration(od as api.BackupConfiguration);
     });
   });
@@ -3099,7 +3105,9 @@
   unittest.group('obj-schema-BackupContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackupContext();
-      var od = api.BackupContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackupContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackupContext(od as api.BackupContext);
     });
   });
@@ -3107,7 +3115,9 @@
   unittest.group('obj-schema-BackupRetentionSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackupRetentionSettings();
-      var od = api.BackupRetentionSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackupRetentionSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackupRetentionSettings(od as api.BackupRetentionSettings);
     });
   });
@@ -3115,7 +3125,9 @@
   unittest.group('obj-schema-BackupRun', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackupRun();
-      var od = api.BackupRun.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.BackupRun.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkBackupRun(od as api.BackupRun);
     });
   });
@@ -3123,7 +3135,9 @@
   unittest.group('obj-schema-BackupRunsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBackupRunsListResponse();
-      var od = api.BackupRunsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BackupRunsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBackupRunsListResponse(od as api.BackupRunsListResponse);
     });
   });
@@ -3131,7 +3145,9 @@
   unittest.group('obj-schema-BinLogCoordinates', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBinLogCoordinates();
-      var od = api.BinLogCoordinates.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BinLogCoordinates.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBinLogCoordinates(od as api.BinLogCoordinates);
     });
   });
@@ -3139,7 +3155,9 @@
   unittest.group('obj-schema-CloneContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCloneContext();
-      var od = api.CloneContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CloneContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCloneContext(od as api.CloneContext);
     });
   });
@@ -3147,7 +3165,9 @@
   unittest.group('obj-schema-Database', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabase();
-      var od = api.Database.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Database.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDatabase(od as api.Database);
     });
   });
@@ -3155,7 +3175,9 @@
   unittest.group('obj-schema-DatabaseFlags', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabaseFlags();
-      var od = api.DatabaseFlags.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatabaseFlags.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatabaseFlags(od as api.DatabaseFlags);
     });
   });
@@ -3163,7 +3185,9 @@
   unittest.group('obj-schema-DatabaseInstanceFailoverReplica', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabaseInstanceFailoverReplica();
-      var od = api.DatabaseInstanceFailoverReplica.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatabaseInstanceFailoverReplica.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatabaseInstanceFailoverReplica(
           od as api.DatabaseInstanceFailoverReplica);
     });
@@ -3172,7 +3196,9 @@
   unittest.group('obj-schema-DatabaseInstance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabaseInstance();
-      var od = api.DatabaseInstance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatabaseInstance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatabaseInstance(od as api.DatabaseInstance);
     });
   });
@@ -3180,7 +3206,9 @@
   unittest.group('obj-schema-DatabasesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDatabasesListResponse();
-      var od = api.DatabasesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DatabasesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDatabasesListResponse(od as api.DatabasesListResponse);
     });
   });
@@ -3188,7 +3216,9 @@
   unittest.group('obj-schema-DemoteMasterConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDemoteMasterConfiguration();
-      var od = api.DemoteMasterConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DemoteMasterConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDemoteMasterConfiguration(od as api.DemoteMasterConfiguration);
     });
   });
@@ -3196,7 +3226,9 @@
   unittest.group('obj-schema-DemoteMasterContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDemoteMasterContext();
-      var od = api.DemoteMasterContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DemoteMasterContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDemoteMasterContext(od as api.DemoteMasterContext);
     });
   });
@@ -3204,7 +3236,9 @@
   unittest.group('obj-schema-DemoteMasterMySqlReplicaConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDemoteMasterMySqlReplicaConfiguration();
-      var od = api.DemoteMasterMySqlReplicaConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DemoteMasterMySqlReplicaConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDemoteMasterMySqlReplicaConfiguration(
           od as api.DemoteMasterMySqlReplicaConfiguration);
     });
@@ -3213,7 +3247,9 @@
   unittest.group('obj-schema-DenyMaintenancePeriod', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDenyMaintenancePeriod();
-      var od = api.DenyMaintenancePeriod.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DenyMaintenancePeriod.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDenyMaintenancePeriod(od as api.DenyMaintenancePeriod);
     });
   });
@@ -3221,7 +3257,9 @@
   unittest.group('obj-schema-DiskEncryptionConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskEncryptionConfiguration();
-      var od = api.DiskEncryptionConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskEncryptionConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskEncryptionConfiguration(od as api.DiskEncryptionConfiguration);
     });
   });
@@ -3229,7 +3267,9 @@
   unittest.group('obj-schema-DiskEncryptionStatus', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDiskEncryptionStatus();
-      var od = api.DiskEncryptionStatus.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DiskEncryptionStatus.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDiskEncryptionStatus(od as api.DiskEncryptionStatus);
     });
   });
@@ -3237,7 +3277,9 @@
   unittest.group('obj-schema-ExportContextCsvExportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportContextCsvExportOptions();
-      var od = api.ExportContextCsvExportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportContextCsvExportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportContextCsvExportOptions(
           od as api.ExportContextCsvExportOptions);
     });
@@ -3247,8 +3289,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportContextSqlExportOptionsMysqlExportOptions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ExportContextSqlExportOptionsMysqlExportOptions.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportContextSqlExportOptionsMysqlExportOptions(
           od as api.ExportContextSqlExportOptionsMysqlExportOptions);
     });
@@ -3257,7 +3300,9 @@
   unittest.group('obj-schema-ExportContextSqlExportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportContextSqlExportOptions();
-      var od = api.ExportContextSqlExportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportContextSqlExportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportContextSqlExportOptions(
           od as api.ExportContextSqlExportOptions);
     });
@@ -3266,7 +3311,9 @@
   unittest.group('obj-schema-ExportContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExportContext();
-      var od = api.ExportContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ExportContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkExportContext(od as api.ExportContext);
     });
   });
@@ -3274,7 +3321,9 @@
   unittest.group('obj-schema-FailoverContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFailoverContext();
-      var od = api.FailoverContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FailoverContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFailoverContext(od as api.FailoverContext);
     });
   });
@@ -3282,7 +3331,8 @@
   unittest.group('obj-schema-Flag', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFlag();
-      var od = api.Flag.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Flag.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkFlag(od as api.Flag);
     });
   });
@@ -3290,7 +3340,9 @@
   unittest.group('obj-schema-FlagsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFlagsListResponse();
-      var od = api.FlagsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FlagsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFlagsListResponse(od as api.FlagsListResponse);
     });
   });
@@ -3299,8 +3351,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportContextBakImportOptionsEncryptionOptions();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.ImportContextBakImportOptionsEncryptionOptions.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportContextBakImportOptionsEncryptionOptions(
           od as api.ImportContextBakImportOptionsEncryptionOptions);
     });
@@ -3309,7 +3362,9 @@
   unittest.group('obj-schema-ImportContextBakImportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportContextBakImportOptions();
-      var od = api.ImportContextBakImportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportContextBakImportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportContextBakImportOptions(
           od as api.ImportContextBakImportOptions);
     });
@@ -3318,7 +3373,9 @@
   unittest.group('obj-schema-ImportContextCsvImportOptions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportContextCsvImportOptions();
-      var od = api.ImportContextCsvImportOptions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportContextCsvImportOptions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportContextCsvImportOptions(
           od as api.ImportContextCsvImportOptions);
     });
@@ -3327,7 +3384,9 @@
   unittest.group('obj-schema-ImportContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImportContext();
-      var od = api.ImportContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ImportContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkImportContext(od as api.ImportContext);
     });
   });
@@ -3335,7 +3394,9 @@
   unittest.group('obj-schema-InsightsConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsightsConfig();
-      var od = api.InsightsConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsightsConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsightsConfig(od as api.InsightsConfig);
     });
   });
@@ -3343,7 +3404,9 @@
   unittest.group('obj-schema-InstancesCloneRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesCloneRequest();
-      var od = api.InstancesCloneRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesCloneRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesCloneRequest(od as api.InstancesCloneRequest);
     });
   });
@@ -3351,7 +3414,9 @@
   unittest.group('obj-schema-InstancesDemoteMasterRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesDemoteMasterRequest();
-      var od = api.InstancesDemoteMasterRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesDemoteMasterRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesDemoteMasterRequest(od as api.InstancesDemoteMasterRequest);
     });
   });
@@ -3359,7 +3424,9 @@
   unittest.group('obj-schema-InstancesExportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesExportRequest();
-      var od = api.InstancesExportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesExportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesExportRequest(od as api.InstancesExportRequest);
     });
   });
@@ -3367,7 +3434,9 @@
   unittest.group('obj-schema-InstancesFailoverRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesFailoverRequest();
-      var od = api.InstancesFailoverRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesFailoverRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesFailoverRequest(od as api.InstancesFailoverRequest);
     });
   });
@@ -3375,7 +3444,9 @@
   unittest.group('obj-schema-InstancesImportRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesImportRequest();
-      var od = api.InstancesImportRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesImportRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesImportRequest(od as api.InstancesImportRequest);
     });
   });
@@ -3383,7 +3454,9 @@
   unittest.group('obj-schema-InstancesListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesListResponse();
-      var od = api.InstancesListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesListResponse(od as api.InstancesListResponse);
     });
   });
@@ -3391,7 +3464,9 @@
   unittest.group('obj-schema-InstancesListServerCasResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesListServerCasResponse();
-      var od = api.InstancesListServerCasResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesListServerCasResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesListServerCasResponse(
           od as api.InstancesListServerCasResponse);
     });
@@ -3400,7 +3475,9 @@
   unittest.group('obj-schema-InstancesRestoreBackupRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesRestoreBackupRequest();
-      var od = api.InstancesRestoreBackupRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesRestoreBackupRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesRestoreBackupRequest(
           od as api.InstancesRestoreBackupRequest);
     });
@@ -3409,7 +3486,9 @@
   unittest.group('obj-schema-InstancesRotateServerCaRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesRotateServerCaRequest();
-      var od = api.InstancesRotateServerCaRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesRotateServerCaRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesRotateServerCaRequest(
           od as api.InstancesRotateServerCaRequest);
     });
@@ -3418,7 +3497,9 @@
   unittest.group('obj-schema-InstancesTruncateLogRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInstancesTruncateLogRequest();
-      var od = api.InstancesTruncateLogRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InstancesTruncateLogRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInstancesTruncateLogRequest(od as api.InstancesTruncateLogRequest);
     });
   });
@@ -3426,7 +3507,9 @@
   unittest.group('obj-schema-IpConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIpConfiguration();
-      var od = api.IpConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IpConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIpConfiguration(od as api.IpConfiguration);
     });
   });
@@ -3434,7 +3517,9 @@
   unittest.group('obj-schema-IpMapping', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIpMapping();
-      var od = api.IpMapping.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IpMapping.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIpMapping(od as api.IpMapping);
     });
   });
@@ -3442,7 +3527,9 @@
   unittest.group('obj-schema-LocationPreference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLocationPreference();
-      var od = api.LocationPreference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LocationPreference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLocationPreference(od as api.LocationPreference);
     });
   });
@@ -3450,7 +3537,9 @@
   unittest.group('obj-schema-MaintenanceWindow', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMaintenanceWindow();
-      var od = api.MaintenanceWindow.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MaintenanceWindow.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMaintenanceWindow(od as api.MaintenanceWindow);
     });
   });
@@ -3458,7 +3547,9 @@
   unittest.group('obj-schema-MySqlReplicaConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMySqlReplicaConfiguration();
-      var od = api.MySqlReplicaConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MySqlReplicaConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMySqlReplicaConfiguration(od as api.MySqlReplicaConfiguration);
     });
   });
@@ -3466,7 +3557,9 @@
   unittest.group('obj-schema-OnPremisesConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOnPremisesConfiguration();
-      var od = api.OnPremisesConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OnPremisesConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOnPremisesConfiguration(od as api.OnPremisesConfiguration);
     });
   });
@@ -3474,7 +3567,9 @@
   unittest.group('obj-schema-Operation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperation();
-      var od = api.Operation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Operation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOperation(od as api.Operation);
     });
   });
@@ -3482,7 +3577,9 @@
   unittest.group('obj-schema-OperationError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationError();
-      var od = api.OperationError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationError(od as api.OperationError);
     });
   });
@@ -3490,7 +3587,9 @@
   unittest.group('obj-schema-OperationErrors', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationErrors();
-      var od = api.OperationErrors.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationErrors.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationErrors(od as api.OperationErrors);
     });
   });
@@ -3498,7 +3597,9 @@
   unittest.group('obj-schema-OperationsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationsListResponse();
-      var od = api.OperationsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationsListResponse(od as api.OperationsListResponse);
     });
   });
@@ -3506,7 +3607,9 @@
   unittest.group('obj-schema-ReplicaConfiguration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReplicaConfiguration();
-      var od = api.ReplicaConfiguration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ReplicaConfiguration.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkReplicaConfiguration(od as api.ReplicaConfiguration);
     });
   });
@@ -3514,7 +3617,9 @@
   unittest.group('obj-schema-Reschedule', () {
     unittest.test('to-json--from-json', () async {
       var o = buildReschedule();
-      var od = api.Reschedule.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Reschedule.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkReschedule(od as api.Reschedule);
     });
   });
@@ -3522,7 +3627,9 @@
   unittest.group('obj-schema-RestoreBackupContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRestoreBackupContext();
-      var od = api.RestoreBackupContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RestoreBackupContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRestoreBackupContext(od as api.RestoreBackupContext);
     });
   });
@@ -3530,7 +3637,9 @@
   unittest.group('obj-schema-RotateServerCaContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRotateServerCaContext();
-      var od = api.RotateServerCaContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RotateServerCaContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRotateServerCaContext(od as api.RotateServerCaContext);
     });
   });
@@ -3538,7 +3647,9 @@
   unittest.group('obj-schema-Settings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSettings();
-      var od = api.Settings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Settings.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSettings(od as api.Settings);
     });
   });
@@ -3546,7 +3657,9 @@
   unittest.group('obj-schema-SqlActiveDirectoryConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSqlActiveDirectoryConfig();
-      var od = api.SqlActiveDirectoryConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SqlActiveDirectoryConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSqlActiveDirectoryConfig(od as api.SqlActiveDirectoryConfig);
     });
   });
@@ -3554,7 +3667,9 @@
   unittest.group('obj-schema-SqlExternalSyncSettingError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSqlExternalSyncSettingError();
-      var od = api.SqlExternalSyncSettingError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SqlExternalSyncSettingError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSqlExternalSyncSettingError(od as api.SqlExternalSyncSettingError);
     });
   });
@@ -3562,8 +3677,9 @@
   unittest.group('obj-schema-SqlInstancesRescheduleMaintenanceRequestBody', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSqlInstancesRescheduleMaintenanceRequestBody();
-      var od =
-          api.SqlInstancesRescheduleMaintenanceRequestBody.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SqlInstancesRescheduleMaintenanceRequestBody.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSqlInstancesRescheduleMaintenanceRequestBody(
           od as api.SqlInstancesRescheduleMaintenanceRequestBody);
     });
@@ -3573,8 +3689,9 @@
       () {
     unittest.test('to-json--from-json', () async {
       var o = buildSqlInstancesVerifyExternalSyncSettingsResponse();
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
       var od = api.SqlInstancesVerifyExternalSyncSettingsResponse.fromJson(
-          o.toJson());
+          oJson as core.Map<core.String, core.dynamic>);
       checkSqlInstancesVerifyExternalSyncSettingsResponse(
           od as api.SqlInstancesVerifyExternalSyncSettingsResponse);
     });
@@ -3583,7 +3700,9 @@
   unittest.group('obj-schema-SqlScheduledMaintenance', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSqlScheduledMaintenance();
-      var od = api.SqlScheduledMaintenance.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SqlScheduledMaintenance.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSqlScheduledMaintenance(od as api.SqlScheduledMaintenance);
     });
   });
@@ -3591,7 +3710,9 @@
   unittest.group('obj-schema-SqlServerDatabaseDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSqlServerDatabaseDetails();
-      var od = api.SqlServerDatabaseDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SqlServerDatabaseDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSqlServerDatabaseDetails(od as api.SqlServerDatabaseDetails);
     });
   });
@@ -3599,7 +3720,9 @@
   unittest.group('obj-schema-SqlServerUserDetails', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSqlServerUserDetails();
-      var od = api.SqlServerUserDetails.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SqlServerUserDetails.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSqlServerUserDetails(od as api.SqlServerUserDetails);
     });
   });
@@ -3607,7 +3730,9 @@
   unittest.group('obj-schema-SslCert', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCert();
-      var od = api.SslCert.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.SslCert.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkSslCert(od as api.SslCert);
     });
   });
@@ -3615,7 +3740,9 @@
   unittest.group('obj-schema-SslCertDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertDetail();
-      var od = api.SslCertDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertDetail(od as api.SslCertDetail);
     });
   });
@@ -3623,7 +3750,9 @@
   unittest.group('obj-schema-SslCertsCreateEphemeralRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertsCreateEphemeralRequest();
-      var od = api.SslCertsCreateEphemeralRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertsCreateEphemeralRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertsCreateEphemeralRequest(
           od as api.SslCertsCreateEphemeralRequest);
     });
@@ -3632,7 +3761,9 @@
   unittest.group('obj-schema-SslCertsInsertRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertsInsertRequest();
-      var od = api.SslCertsInsertRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertsInsertRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertsInsertRequest(od as api.SslCertsInsertRequest);
     });
   });
@@ -3640,7 +3771,9 @@
   unittest.group('obj-schema-SslCertsInsertResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertsInsertResponse();
-      var od = api.SslCertsInsertResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertsInsertResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertsInsertResponse(od as api.SslCertsInsertResponse);
     });
   });
@@ -3648,7 +3781,9 @@
   unittest.group('obj-schema-SslCertsListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSslCertsListResponse();
-      var od = api.SslCertsListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SslCertsListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSslCertsListResponse(od as api.SslCertsListResponse);
     });
   });
@@ -3656,7 +3791,8 @@
   unittest.group('obj-schema-Tier', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTier();
-      var od = api.Tier.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Tier.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTier(od as api.Tier);
     });
   });
@@ -3664,7 +3800,9 @@
   unittest.group('obj-schema-TiersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTiersListResponse();
-      var od = api.TiersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TiersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTiersListResponse(od as api.TiersListResponse);
     });
   });
@@ -3672,7 +3810,9 @@
   unittest.group('obj-schema-TruncateLogContext', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTruncateLogContext();
-      var od = api.TruncateLogContext.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TruncateLogContext.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTruncateLogContext(od as api.TruncateLogContext);
     });
   });
@@ -3680,7 +3820,8 @@
   unittest.group('obj-schema-User', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUser();
-      var od = api.User.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.User.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkUser(od as api.User);
     });
   });
@@ -3688,7 +3829,9 @@
   unittest.group('obj-schema-UsersListResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsersListResponse();
-      var od = api.UsersListResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsersListResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsersListResponse(od as api.UsersListResponse);
     });
   });
diff --git a/generated/googleapis_beta/test/toolresults/v1beta3_test.dart b/generated/googleapis_beta/test/toolresults/v1beta3_test.dart
index d9dc334..fdc2f89 100644
--- a/generated/googleapis_beta/test/toolresults/v1beta3_test.dart
+++ b/generated/googleapis_beta/test/toolresults/v1beta3_test.dart
@@ -3665,7 +3665,8 @@
   unittest.group('obj-schema-ANR', () {
     unittest.test('to-json--from-json', () async {
       var o = buildANR();
-      var od = api.ANR.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ANR.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkANR(od as api.ANR);
     });
   });
@@ -3673,7 +3674,9 @@
   unittest.group('obj-schema-AndroidAppInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidAppInfo();
-      var od = api.AndroidAppInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidAppInfo.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidAppInfo(od as api.AndroidAppInfo);
     });
   });
@@ -3681,7 +3684,9 @@
   unittest.group('obj-schema-AndroidInstrumentationTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidInstrumentationTest();
-      var od = api.AndroidInstrumentationTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidInstrumentationTest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidInstrumentationTest(od as api.AndroidInstrumentationTest);
     });
   });
@@ -3689,7 +3694,9 @@
   unittest.group('obj-schema-AndroidRoboTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidRoboTest();
-      var od = api.AndroidRoboTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidRoboTest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidRoboTest(od as api.AndroidRoboTest);
     });
   });
@@ -3697,7 +3704,9 @@
   unittest.group('obj-schema-AndroidTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidTest();
-      var od = api.AndroidTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidTest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidTest(od as api.AndroidTest);
     });
   });
@@ -3705,7 +3714,9 @@
   unittest.group('obj-schema-AndroidTestLoop', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAndroidTestLoop();
-      var od = api.AndroidTestLoop.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AndroidTestLoop.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAndroidTestLoop(od as api.AndroidTestLoop);
     });
   });
@@ -3713,7 +3724,8 @@
   unittest.group('obj-schema-Any', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAny();
-      var od = api.Any.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Any.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAny(od as api.Any);
     });
   });
@@ -3721,7 +3733,9 @@
   unittest.group('obj-schema-AppStartTime', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAppStartTime();
-      var od = api.AppStartTime.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AppStartTime.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAppStartTime(od as api.AppStartTime);
     });
   });
@@ -3729,7 +3743,9 @@
   unittest.group('obj-schema-AvailableDeepLinks', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAvailableDeepLinks();
-      var od = api.AvailableDeepLinks.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AvailableDeepLinks.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAvailableDeepLinks(od as api.AvailableDeepLinks);
     });
   });
@@ -3737,7 +3753,9 @@
   unittest.group('obj-schema-BasicPerfSampleSeries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBasicPerfSampleSeries();
-      var od = api.BasicPerfSampleSeries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BasicPerfSampleSeries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBasicPerfSampleSeries(od as api.BasicPerfSampleSeries);
     });
   });
@@ -3745,7 +3763,9 @@
   unittest.group('obj-schema-BatchCreatePerfSamplesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreatePerfSamplesRequest();
-      var od = api.BatchCreatePerfSamplesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreatePerfSamplesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreatePerfSamplesRequest(
           od as api.BatchCreatePerfSamplesRequest);
     });
@@ -3754,7 +3774,9 @@
   unittest.group('obj-schema-BatchCreatePerfSamplesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBatchCreatePerfSamplesResponse();
-      var od = api.BatchCreatePerfSamplesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BatchCreatePerfSamplesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBatchCreatePerfSamplesResponse(
           od as api.BatchCreatePerfSamplesResponse);
     });
@@ -3763,7 +3785,9 @@
   unittest.group('obj-schema-BlankScreen', () {
     unittest.test('to-json--from-json', () async {
       var o = buildBlankScreen();
-      var od = api.BlankScreen.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.BlankScreen.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkBlankScreen(od as api.BlankScreen);
     });
   });
@@ -3771,7 +3795,9 @@
   unittest.group('obj-schema-CPUInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCPUInfo();
-      var od = api.CPUInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.CPUInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCPUInfo(od as api.CPUInfo);
     });
   });
@@ -3779,7 +3805,9 @@
   unittest.group('obj-schema-CrashDialogError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCrashDialogError();
-      var od = api.CrashDialogError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.CrashDialogError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkCrashDialogError(od as api.CrashDialogError);
     });
   });
@@ -3787,7 +3815,9 @@
   unittest.group('obj-schema-DeviceOutOfMemory', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeviceOutOfMemory();
-      var od = api.DeviceOutOfMemory.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.DeviceOutOfMemory.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkDeviceOutOfMemory(od as api.DeviceOutOfMemory);
     });
   });
@@ -3795,7 +3825,9 @@
   unittest.group('obj-schema-Duration', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDuration();
-      var od = api.Duration.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Duration.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDuration(od as api.Duration);
     });
   });
@@ -3803,7 +3835,9 @@
   unittest.group('obj-schema-EncounteredLoginScreen', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncounteredLoginScreen();
-      var od = api.EncounteredLoginScreen.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EncounteredLoginScreen.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEncounteredLoginScreen(od as api.EncounteredLoginScreen);
     });
   });
@@ -3811,7 +3845,9 @@
   unittest.group('obj-schema-EncounteredNonAndroidUiWidgetScreen', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncounteredNonAndroidUiWidgetScreen();
-      var od = api.EncounteredNonAndroidUiWidgetScreen.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EncounteredNonAndroidUiWidgetScreen.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEncounteredNonAndroidUiWidgetScreen(
           od as api.EncounteredNonAndroidUiWidgetScreen);
     });
@@ -3820,7 +3856,9 @@
   unittest.group('obj-schema-Environment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironment();
-      var od = api.Environment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Environment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironment(od as api.Environment);
     });
   });
@@ -3828,7 +3866,9 @@
   unittest.group('obj-schema-EnvironmentDimensionValueEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEnvironmentDimensionValueEntry();
-      var od = api.EnvironmentDimensionValueEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.EnvironmentDimensionValueEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkEnvironmentDimensionValueEntry(
           od as api.EnvironmentDimensionValueEntry);
     });
@@ -3837,7 +3877,9 @@
   unittest.group('obj-schema-Execution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildExecution();
-      var od = api.Execution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Execution.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkExecution(od as api.Execution);
     });
   });
@@ -3845,7 +3887,9 @@
   unittest.group('obj-schema-FailedToInstall', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFailedToInstall();
-      var od = api.FailedToInstall.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FailedToInstall.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFailedToInstall(od as api.FailedToInstall);
     });
   });
@@ -3853,7 +3897,9 @@
   unittest.group('obj-schema-FailureDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFailureDetail();
-      var od = api.FailureDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FailureDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFailureDetail(od as api.FailureDetail);
     });
   });
@@ -3861,7 +3907,9 @@
   unittest.group('obj-schema-FatalException', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFatalException();
-      var od = api.FatalException.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FatalException.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFatalException(od as api.FatalException);
     });
   });
@@ -3869,7 +3917,9 @@
   unittest.group('obj-schema-FileReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFileReference();
-      var od = api.FileReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FileReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFileReference(od as api.FileReference);
     });
   });
@@ -3877,7 +3927,9 @@
   unittest.group('obj-schema-GraphicsStats', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGraphicsStats();
-      var od = api.GraphicsStats.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GraphicsStats.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGraphicsStats(od as api.GraphicsStats);
     });
   });
@@ -3885,7 +3937,9 @@
   unittest.group('obj-schema-GraphicsStatsBucket', () {
     unittest.test('to-json--from-json', () async {
       var o = buildGraphicsStatsBucket();
-      var od = api.GraphicsStatsBucket.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.GraphicsStatsBucket.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkGraphicsStatsBucket(od as api.GraphicsStatsBucket);
     });
   });
@@ -3893,7 +3947,9 @@
   unittest.group('obj-schema-History', () {
     unittest.test('to-json--from-json', () async {
       var o = buildHistory();
-      var od = api.History.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.History.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkHistory(od as api.History);
     });
   });
@@ -3901,7 +3957,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -3909,7 +3966,9 @@
   unittest.group('obj-schema-InAppPurchasesFound', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInAppPurchasesFound();
-      var od = api.InAppPurchasesFound.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InAppPurchasesFound.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInAppPurchasesFound(od as api.InAppPurchasesFound);
     });
   });
@@ -3917,7 +3976,9 @@
   unittest.group('obj-schema-InconclusiveDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInconclusiveDetail();
-      var od = api.InconclusiveDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InconclusiveDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInconclusiveDetail(od as api.InconclusiveDetail);
     });
   });
@@ -3925,7 +3986,9 @@
   unittest.group('obj-schema-IndividualOutcome', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIndividualOutcome();
-      var od = api.IndividualOutcome.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IndividualOutcome.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIndividualOutcome(od as api.IndividualOutcome);
     });
   });
@@ -3933,7 +3996,9 @@
   unittest.group('obj-schema-InsufficientCoverage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInsufficientCoverage();
-      var od = api.InsufficientCoverage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.InsufficientCoverage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkInsufficientCoverage(od as api.InsufficientCoverage);
     });
   });
@@ -3941,7 +4006,9 @@
   unittest.group('obj-schema-IosAppCrashed', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosAppCrashed();
-      var od = api.IosAppCrashed.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IosAppCrashed.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIosAppCrashed(od as api.IosAppCrashed);
     });
   });
@@ -3949,7 +4016,9 @@
   unittest.group('obj-schema-IosAppInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosAppInfo();
-      var od = api.IosAppInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IosAppInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIosAppInfo(od as api.IosAppInfo);
     });
   });
@@ -3957,7 +4026,9 @@
   unittest.group('obj-schema-IosRoboTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosRoboTest();
-      var od = api.IosRoboTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IosRoboTest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIosRoboTest(od as api.IosRoboTest);
     });
   });
@@ -3965,7 +4036,9 @@
   unittest.group('obj-schema-IosTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosTest();
-      var od = api.IosTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IosTest.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIosTest(od as api.IosTest);
     });
   });
@@ -3973,7 +4046,9 @@
   unittest.group('obj-schema-IosTestLoop', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosTestLoop();
-      var od = api.IosTestLoop.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.IosTestLoop.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkIosTestLoop(od as api.IosTestLoop);
     });
   });
@@ -3981,7 +4056,9 @@
   unittest.group('obj-schema-IosXcTest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildIosXcTest();
-      var od = api.IosXcTest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.IosXcTest.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkIosXcTest(od as api.IosXcTest);
     });
   });
@@ -3989,7 +4066,9 @@
   unittest.group('obj-schema-LauncherActivityNotFound', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLauncherActivityNotFound();
-      var od = api.LauncherActivityNotFound.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LauncherActivityNotFound.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLauncherActivityNotFound(od as api.LauncherActivityNotFound);
     });
   });
@@ -3997,7 +4076,9 @@
   unittest.group('obj-schema-ListEnvironmentsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListEnvironmentsResponse();
-      var od = api.ListEnvironmentsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListEnvironmentsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListEnvironmentsResponse(od as api.ListEnvironmentsResponse);
     });
   });
@@ -4005,7 +4086,9 @@
   unittest.group('obj-schema-ListExecutionsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListExecutionsResponse();
-      var od = api.ListExecutionsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListExecutionsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListExecutionsResponse(od as api.ListExecutionsResponse);
     });
   });
@@ -4013,7 +4096,9 @@
   unittest.group('obj-schema-ListHistoriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListHistoriesResponse();
-      var od = api.ListHistoriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListHistoriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListHistoriesResponse(od as api.ListHistoriesResponse);
     });
   });
@@ -4021,7 +4106,9 @@
   unittest.group('obj-schema-ListPerfSampleSeriesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPerfSampleSeriesResponse();
-      var od = api.ListPerfSampleSeriesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPerfSampleSeriesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPerfSampleSeriesResponse(od as api.ListPerfSampleSeriesResponse);
     });
   });
@@ -4029,7 +4116,9 @@
   unittest.group('obj-schema-ListPerfSamplesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListPerfSamplesResponse();
-      var od = api.ListPerfSamplesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListPerfSamplesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListPerfSamplesResponse(od as api.ListPerfSamplesResponse);
     });
   });
@@ -4037,7 +4126,9 @@
   unittest.group('obj-schema-ListScreenshotClustersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListScreenshotClustersResponse();
-      var od = api.ListScreenshotClustersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListScreenshotClustersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListScreenshotClustersResponse(
           od as api.ListScreenshotClustersResponse);
     });
@@ -4046,7 +4137,9 @@
   unittest.group('obj-schema-ListStepAccessibilityClustersResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListStepAccessibilityClustersResponse();
-      var od = api.ListStepAccessibilityClustersResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListStepAccessibilityClustersResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListStepAccessibilityClustersResponse(
           od as api.ListStepAccessibilityClustersResponse);
     });
@@ -4055,7 +4148,9 @@
   unittest.group('obj-schema-ListStepThumbnailsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListStepThumbnailsResponse();
-      var od = api.ListStepThumbnailsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListStepThumbnailsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListStepThumbnailsResponse(od as api.ListStepThumbnailsResponse);
     });
   });
@@ -4063,7 +4158,9 @@
   unittest.group('obj-schema-ListStepsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListStepsResponse();
-      var od = api.ListStepsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListStepsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListStepsResponse(od as api.ListStepsResponse);
     });
   });
@@ -4071,7 +4168,9 @@
   unittest.group('obj-schema-ListTestCasesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListTestCasesResponse();
-      var od = api.ListTestCasesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListTestCasesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListTestCasesResponse(od as api.ListTestCasesResponse);
     });
   });
@@ -4079,7 +4178,9 @@
   unittest.group('obj-schema-LogcatCollectionError', () {
     unittest.test('to-json--from-json', () async {
       var o = buildLogcatCollectionError();
-      var od = api.LogcatCollectionError.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.LogcatCollectionError.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkLogcatCollectionError(od as api.LogcatCollectionError);
     });
   });
@@ -4087,7 +4188,9 @@
   unittest.group('obj-schema-MatrixDimensionDefinition', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMatrixDimensionDefinition();
-      var od = api.MatrixDimensionDefinition.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MatrixDimensionDefinition.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMatrixDimensionDefinition(od as api.MatrixDimensionDefinition);
     });
   });
@@ -4095,7 +4198,9 @@
   unittest.group('obj-schema-MemoryInfo', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMemoryInfo();
-      var od = api.MemoryInfo.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MemoryInfo.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMemoryInfo(od as api.MemoryInfo);
     });
   });
@@ -4103,7 +4208,9 @@
   unittest.group('obj-schema-MergedResult', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMergedResult();
-      var od = api.MergedResult.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MergedResult.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMergedResult(od as api.MergedResult);
     });
   });
@@ -4111,7 +4218,9 @@
   unittest.group('obj-schema-MultiStep', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMultiStep();
-      var od = api.MultiStep.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MultiStep.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMultiStep(od as api.MultiStep);
     });
   });
@@ -4119,7 +4228,9 @@
   unittest.group('obj-schema-NativeCrash', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNativeCrash();
-      var od = api.NativeCrash.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NativeCrash.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNativeCrash(od as api.NativeCrash);
     });
   });
@@ -4127,7 +4238,9 @@
   unittest.group('obj-schema-NonSdkApi', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNonSdkApi();
-      var od = api.NonSdkApi.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.NonSdkApi.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkNonSdkApi(od as api.NonSdkApi);
     });
   });
@@ -4135,7 +4248,9 @@
   unittest.group('obj-schema-NonSdkApiInsight', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNonSdkApiInsight();
-      var od = api.NonSdkApiInsight.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NonSdkApiInsight.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNonSdkApiInsight(od as api.NonSdkApiInsight);
     });
   });
@@ -4143,7 +4258,9 @@
   unittest.group('obj-schema-NonSdkApiUsageViolation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNonSdkApiUsageViolation();
-      var od = api.NonSdkApiUsageViolation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NonSdkApiUsageViolation.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNonSdkApiUsageViolation(od as api.NonSdkApiUsageViolation);
     });
   });
@@ -4151,7 +4268,9 @@
   unittest.group('obj-schema-NonSdkApiUsageViolationReport', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNonSdkApiUsageViolationReport();
-      var od = api.NonSdkApiUsageViolationReport.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NonSdkApiUsageViolationReport.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNonSdkApiUsageViolationReport(
           od as api.NonSdkApiUsageViolationReport);
     });
@@ -4160,7 +4279,9 @@
   unittest.group('obj-schema-Outcome', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOutcome();
-      var od = api.Outcome.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Outcome.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOutcome(od as api.Outcome);
     });
   });
@@ -4168,7 +4289,9 @@
   unittest.group('obj-schema-OverlappingUIElements', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOverlappingUIElements();
-      var od = api.OverlappingUIElements.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OverlappingUIElements.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOverlappingUIElements(od as api.OverlappingUIElements);
     });
   });
@@ -4176,7 +4299,9 @@
   unittest.group('obj-schema-PendingGoogleUpdateInsight', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPendingGoogleUpdateInsight();
-      var od = api.PendingGoogleUpdateInsight.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PendingGoogleUpdateInsight.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPendingGoogleUpdateInsight(od as api.PendingGoogleUpdateInsight);
     });
   });
@@ -4184,7 +4309,9 @@
   unittest.group('obj-schema-PerfEnvironment', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerfEnvironment();
-      var od = api.PerfEnvironment.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerfEnvironment.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerfEnvironment(od as api.PerfEnvironment);
     });
   });
@@ -4192,7 +4319,9 @@
   unittest.group('obj-schema-PerfMetricsSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerfMetricsSummary();
-      var od = api.PerfMetricsSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerfMetricsSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerfMetricsSummary(od as api.PerfMetricsSummary);
     });
   });
@@ -4200,7 +4329,9 @@
   unittest.group('obj-schema-PerfSample', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerfSample();
-      var od = api.PerfSample.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.PerfSample.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPerfSample(od as api.PerfSample);
     });
   });
@@ -4208,7 +4339,9 @@
   unittest.group('obj-schema-PerfSampleSeries', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerfSampleSeries();
-      var od = api.PerfSampleSeries.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerfSampleSeries.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerfSampleSeries(od as api.PerfSampleSeries);
     });
   });
@@ -4216,7 +4349,9 @@
   unittest.group('obj-schema-PerformedGoogleLogin', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerformedGoogleLogin();
-      var od = api.PerformedGoogleLogin.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerformedGoogleLogin.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerformedGoogleLogin(od as api.PerformedGoogleLogin);
     });
   });
@@ -4224,7 +4359,9 @@
   unittest.group('obj-schema-PerformedMonkeyActions', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPerformedMonkeyActions();
-      var od = api.PerformedMonkeyActions.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PerformedMonkeyActions.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPerformedMonkeyActions(od as api.PerformedMonkeyActions);
     });
   });
@@ -4232,7 +4369,9 @@
   unittest.group('obj-schema-PrimaryStep', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPrimaryStep();
-      var od = api.PrimaryStep.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PrimaryStep.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPrimaryStep(od as api.PrimaryStep);
     });
   });
@@ -4240,7 +4379,9 @@
   unittest.group('obj-schema-ProjectSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProjectSettings();
-      var od = api.ProjectSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ProjectSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkProjectSettings(od as api.ProjectSettings);
     });
   });
@@ -4248,7 +4389,9 @@
   unittest.group('obj-schema-PublishXunitXmlFilesRequest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPublishXunitXmlFilesRequest();
-      var od = api.PublishXunitXmlFilesRequest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PublishXunitXmlFilesRequest.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPublishXunitXmlFilesRequest(od as api.PublishXunitXmlFilesRequest);
     });
   });
@@ -4256,7 +4399,9 @@
   unittest.group('obj-schema-RegionProto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRegionProto();
-      var od = api.RegionProto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RegionProto.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRegionProto(od as api.RegionProto);
     });
   });
@@ -4264,7 +4409,9 @@
   unittest.group('obj-schema-ResultsStorage', () {
     unittest.test('to-json--from-json', () async {
       var o = buildResultsStorage();
-      var od = api.ResultsStorage.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ResultsStorage.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkResultsStorage(od as api.ResultsStorage);
     });
   });
@@ -4272,7 +4419,9 @@
   unittest.group('obj-schema-RoboScriptExecution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildRoboScriptExecution();
-      var od = api.RoboScriptExecution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.RoboScriptExecution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkRoboScriptExecution(od as api.RoboScriptExecution);
     });
   });
@@ -4280,7 +4429,9 @@
   unittest.group('obj-schema-SafeHtmlProto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSafeHtmlProto();
-      var od = api.SafeHtmlProto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SafeHtmlProto.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSafeHtmlProto(od as api.SafeHtmlProto);
     });
   });
@@ -4288,7 +4439,9 @@
   unittest.group('obj-schema-Screen', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScreen();
-      var od = api.Screen.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Screen.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkScreen(od as api.Screen);
     });
   });
@@ -4296,7 +4449,9 @@
   unittest.group('obj-schema-ScreenshotCluster', () {
     unittest.test('to-json--from-json', () async {
       var o = buildScreenshotCluster();
-      var od = api.ScreenshotCluster.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ScreenshotCluster.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkScreenshotCluster(od as api.ScreenshotCluster);
     });
   });
@@ -4304,7 +4459,9 @@
   unittest.group('obj-schema-ShardSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildShardSummary();
-      var od = api.ShardSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ShardSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkShardSummary(od as api.ShardSummary);
     });
   });
@@ -4312,7 +4469,9 @@
   unittest.group('obj-schema-SkippedDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSkippedDetail();
-      var od = api.SkippedDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SkippedDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSkippedDetail(od as api.SkippedDetail);
     });
   });
@@ -4320,7 +4479,9 @@
   unittest.group('obj-schema-Specification', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpecification();
-      var od = api.Specification.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Specification.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpecification(od as api.Specification);
     });
   });
@@ -4328,7 +4489,9 @@
   unittest.group('obj-schema-StackTrace', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStackTrace();
-      var od = api.StackTrace.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.StackTrace.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStackTrace(od as api.StackTrace);
     });
   });
@@ -4336,7 +4499,9 @@
   unittest.group('obj-schema-StartActivityNotFound', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStartActivityNotFound();
-      var od = api.StartActivityNotFound.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StartActivityNotFound.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStartActivityNotFound(od as api.StartActivityNotFound);
     });
   });
@@ -4344,7 +4509,9 @@
   unittest.group('obj-schema-Status', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStatus();
-      var od = api.Status.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Status.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStatus(od as api.Status);
     });
   });
@@ -4352,7 +4519,8 @@
   unittest.group('obj-schema-Step', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStep();
-      var od = api.Step.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Step.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkStep(od as api.Step);
     });
   });
@@ -4360,7 +4528,9 @@
   unittest.group('obj-schema-StepDimensionValueEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStepDimensionValueEntry();
-      var od = api.StepDimensionValueEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StepDimensionValueEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStepDimensionValueEntry(od as api.StepDimensionValueEntry);
     });
   });
@@ -4368,7 +4538,9 @@
   unittest.group('obj-schema-StepLabelsEntry', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStepLabelsEntry();
-      var od = api.StepLabelsEntry.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StepLabelsEntry.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStepLabelsEntry(od as api.StepLabelsEntry);
     });
   });
@@ -4376,7 +4548,9 @@
   unittest.group('obj-schema-StepSummary', () {
     unittest.test('to-json--from-json', () async {
       var o = buildStepSummary();
-      var od = api.StepSummary.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.StepSummary.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkStepSummary(od as api.StepSummary);
     });
   });
@@ -4384,7 +4558,9 @@
   unittest.group('obj-schema-SuccessDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuccessDetail();
-      var od = api.SuccessDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuccessDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuccessDetail(od as api.SuccessDetail);
     });
   });
@@ -4392,7 +4568,9 @@
   unittest.group('obj-schema-SuggestionClusterProto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestionClusterProto();
-      var od = api.SuggestionClusterProto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestionClusterProto.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestionClusterProto(od as api.SuggestionClusterProto);
     });
   });
@@ -4400,7 +4578,9 @@
   unittest.group('obj-schema-SuggestionProto', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSuggestionProto();
-      var od = api.SuggestionProto.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SuggestionProto.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSuggestionProto(od as api.SuggestionProto);
     });
   });
@@ -4408,7 +4588,9 @@
   unittest.group('obj-schema-TestCase', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestCase();
-      var od = api.TestCase.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestCase.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestCase(od as api.TestCase);
     });
   });
@@ -4416,7 +4598,9 @@
   unittest.group('obj-schema-TestCaseReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestCaseReference();
-      var od = api.TestCaseReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestCaseReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestCaseReference(od as api.TestCaseReference);
     });
   });
@@ -4424,7 +4608,9 @@
   unittest.group('obj-schema-TestExecutionStep', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestExecutionStep();
-      var od = api.TestExecutionStep.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestExecutionStep.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestExecutionStep(od as api.TestExecutionStep);
     });
   });
@@ -4432,7 +4618,9 @@
   unittest.group('obj-schema-TestIssue', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestIssue();
-      var od = api.TestIssue.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestIssue.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestIssue(od as api.TestIssue);
     });
   });
@@ -4440,7 +4628,9 @@
   unittest.group('obj-schema-TestSuiteOverview', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestSuiteOverview();
-      var od = api.TestSuiteOverview.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.TestSuiteOverview.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkTestSuiteOverview(od as api.TestSuiteOverview);
     });
   });
@@ -4448,7 +4638,9 @@
   unittest.group('obj-schema-TestTiming', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTestTiming();
-      var od = api.TestTiming.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TestTiming.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTestTiming(od as api.TestTiming);
     });
   });
@@ -4456,7 +4648,9 @@
   unittest.group('obj-schema-Thumbnail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildThumbnail();
-      var od = api.Thumbnail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Thumbnail.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkThumbnail(od as api.Thumbnail);
     });
   });
@@ -4464,7 +4658,9 @@
   unittest.group('obj-schema-Timestamp', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTimestamp();
-      var od = api.Timestamp.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Timestamp.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTimestamp(od as api.Timestamp);
     });
   });
@@ -4472,7 +4668,9 @@
   unittest.group('obj-schema-ToolExecution', () {
     unittest.test('to-json--from-json', () async {
       var o = buildToolExecution();
-      var od = api.ToolExecution.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ToolExecution.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkToolExecution(od as api.ToolExecution);
     });
   });
@@ -4480,7 +4678,9 @@
   unittest.group('obj-schema-ToolExecutionStep', () {
     unittest.test('to-json--from-json', () async {
       var o = buildToolExecutionStep();
-      var od = api.ToolExecutionStep.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ToolExecutionStep.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkToolExecutionStep(od as api.ToolExecutionStep);
     });
   });
@@ -4488,7 +4688,9 @@
   unittest.group('obj-schema-ToolExitCode', () {
     unittest.test('to-json--from-json', () async {
       var o = buildToolExitCode();
-      var od = api.ToolExitCode.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ToolExitCode.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkToolExitCode(od as api.ToolExitCode);
     });
   });
@@ -4496,7 +4698,9 @@
   unittest.group('obj-schema-ToolOutputReference', () {
     unittest.test('to-json--from-json', () async {
       var o = buildToolOutputReference();
-      var od = api.ToolOutputReference.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ToolOutputReference.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkToolOutputReference(od as api.ToolOutputReference);
     });
   });
@@ -4504,7 +4708,9 @@
   unittest.group('obj-schema-UIElementTooDeep', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUIElementTooDeep();
-      var od = api.UIElementTooDeep.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UIElementTooDeep.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUIElementTooDeep(od as api.UIElementTooDeep);
     });
   });
@@ -4512,7 +4718,9 @@
   unittest.group('obj-schema-UnspecifiedWarning', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnspecifiedWarning();
-      var od = api.UnspecifiedWarning.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnspecifiedWarning.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnspecifiedWarning(od as api.UnspecifiedWarning);
     });
   });
@@ -4520,7 +4728,9 @@
   unittest.group('obj-schema-UnusedRoboDirective', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUnusedRoboDirective();
-      var od = api.UnusedRoboDirective.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UnusedRoboDirective.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUnusedRoboDirective(od as api.UnusedRoboDirective);
     });
   });
@@ -4528,7 +4738,9 @@
   unittest.group('obj-schema-UpgradeInsight', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUpgradeInsight();
-      var od = api.UpgradeInsight.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UpgradeInsight.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUpgradeInsight(od as api.UpgradeInsight);
     });
   });
@@ -4536,7 +4748,9 @@
   unittest.group('obj-schema-UsedRoboDirective', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsedRoboDirective();
-      var od = api.UsedRoboDirective.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsedRoboDirective.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsedRoboDirective(od as api.UsedRoboDirective);
     });
   });
@@ -4544,7 +4758,9 @@
   unittest.group('obj-schema-UsedRoboIgnoreDirective', () {
     unittest.test('to-json--from-json', () async {
       var o = buildUsedRoboIgnoreDirective();
-      var od = api.UsedRoboIgnoreDirective.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.UsedRoboIgnoreDirective.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkUsedRoboIgnoreDirective(od as api.UsedRoboIgnoreDirective);
     });
   });
diff --git a/generated/googleapis_beta/test/transcoder/v1beta1_test.dart b/generated/googleapis_beta/test/transcoder/v1beta1_test.dart
index 5b20988..ca61fcb 100644
--- a/generated/googleapis_beta/test/transcoder/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/transcoder/v1beta1_test.dart
@@ -1797,7 +1797,9 @@
   unittest.group('obj-schema-AdBreak', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAdBreak();
-      var od = api.AdBreak.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AdBreak.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAdBreak(od as api.AdBreak);
     });
   });
@@ -1805,7 +1807,9 @@
   unittest.group('obj-schema-Aes128Encryption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAes128Encryption();
-      var od = api.Aes128Encryption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Aes128Encryption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAes128Encryption(od as api.Aes128Encryption);
     });
   });
@@ -1813,7 +1817,9 @@
   unittest.group('obj-schema-Animation', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnimation();
-      var od = api.Animation.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Animation.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAnimation(od as api.Animation);
     });
   });
@@ -1821,7 +1827,9 @@
   unittest.group('obj-schema-AnimationEnd', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnimationEnd();
-      var od = api.AnimationEnd.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnimationEnd.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnimationEnd(od as api.AnimationEnd);
     });
   });
@@ -1829,7 +1837,9 @@
   unittest.group('obj-schema-AnimationFade', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnimationFade();
-      var od = api.AnimationFade.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnimationFade.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnimationFade(od as api.AnimationFade);
     });
   });
@@ -1837,7 +1847,9 @@
   unittest.group('obj-schema-AnimationStatic', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAnimationStatic();
-      var od = api.AnimationStatic.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AnimationStatic.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAnimationStatic(od as api.AnimationStatic);
     });
   });
@@ -1845,7 +1857,8 @@
   unittest.group('obj-schema-Audio', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAudio();
-      var od = api.Audio.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Audio.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAudio(od as api.Audio);
     });
   });
@@ -1853,7 +1866,9 @@
   unittest.group('obj-schema-AudioAtom', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAudioAtom();
-      var od = api.AudioAtom.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.AudioAtom.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkAudioAtom(od as api.AudioAtom);
     });
   });
@@ -1861,7 +1876,9 @@
   unittest.group('obj-schema-AudioChannel', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAudioChannel();
-      var od = api.AudioChannel.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AudioChannel.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAudioChannel(od as api.AudioChannel);
     });
   });
@@ -1869,7 +1886,9 @@
   unittest.group('obj-schema-AudioChannelInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAudioChannelInput();
-      var od = api.AudioChannelInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AudioChannelInput.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAudioChannelInput(od as api.AudioChannelInput);
     });
   });
@@ -1877,7 +1896,9 @@
   unittest.group('obj-schema-AudioStream', () {
     unittest.test('to-json--from-json', () async {
       var o = buildAudioStream();
-      var od = api.AudioStream.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.AudioStream.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkAudioStream(od as api.AudioStream);
     });
   });
@@ -1885,7 +1906,8 @@
   unittest.group('obj-schema-Color', () {
     unittest.test('to-json--from-json', () async {
       var o = buildColor();
-      var od = api.Color.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Color.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkColor(od as api.Color);
     });
   });
@@ -1893,7 +1915,8 @@
   unittest.group('obj-schema-Crop', () {
     unittest.test('to-json--from-json', () async {
       var o = buildCrop();
-      var od = api.Crop.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Crop.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkCrop(od as api.Crop);
     });
   });
@@ -1901,7 +1924,9 @@
   unittest.group('obj-schema-Deblock', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDeblock();
-      var od = api.Deblock.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Deblock.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDeblock(od as api.Deblock);
     });
   });
@@ -1909,7 +1934,9 @@
   unittest.group('obj-schema-Denoise', () {
     unittest.test('to-json--from-json', () async {
       var o = buildDenoise();
-      var od = api.Denoise.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Denoise.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkDenoise(od as api.Denoise);
     });
   });
@@ -1917,7 +1944,9 @@
   unittest.group('obj-schema-EditAtom', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEditAtom();
-      var od = api.EditAtom.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.EditAtom.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEditAtom(od as api.EditAtom);
     });
   });
@@ -1925,7 +1954,9 @@
   unittest.group('obj-schema-ElementaryStream', () {
     unittest.test('to-json--from-json', () async {
       var o = buildElementaryStream();
-      var od = api.ElementaryStream.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ElementaryStream.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkElementaryStream(od as api.ElementaryStream);
     });
   });
@@ -1933,7 +1964,8 @@
   unittest.group('obj-schema-Empty', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEmpty();
-      var od = api.Empty.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Empty.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEmpty(od as api.Empty);
     });
   });
@@ -1941,7 +1973,9 @@
   unittest.group('obj-schema-Encryption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildEncryption();
-      var od = api.Encryption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Encryption.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkEncryption(od as api.Encryption);
     });
   });
@@ -1949,7 +1983,9 @@
   unittest.group('obj-schema-FailureDetail', () {
     unittest.test('to-json--from-json', () async {
       var o = buildFailureDetail();
-      var od = api.FailureDetail.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.FailureDetail.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkFailureDetail(od as api.FailureDetail);
     });
   });
@@ -1957,7 +1993,8 @@
   unittest.group('obj-schema-Image', () {
     unittest.test('to-json--from-json', () async {
       var o = buildImage();
-      var od = api.Image.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Image.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkImage(od as api.Image);
     });
   });
@@ -1965,7 +2002,8 @@
   unittest.group('obj-schema-Input', () {
     unittest.test('to-json--from-json', () async {
       var o = buildInput();
-      var od = api.Input.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Input.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkInput(od as api.Input);
     });
   });
@@ -1973,7 +2011,8 @@
   unittest.group('obj-schema-Job', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJob();
-      var od = api.Job.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Job.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJob(od as api.Job);
     });
   });
@@ -1981,7 +2020,9 @@
   unittest.group('obj-schema-JobConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobConfig();
-      var od = api.JobConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.JobConfig.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkJobConfig(od as api.JobConfig);
     });
   });
@@ -1989,7 +2030,9 @@
   unittest.group('obj-schema-JobTemplate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildJobTemplate();
-      var od = api.JobTemplate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.JobTemplate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkJobTemplate(od as api.JobTemplate);
     });
   });
@@ -1997,7 +2040,9 @@
   unittest.group('obj-schema-ListJobTemplatesResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListJobTemplatesResponse();
-      var od = api.ListJobTemplatesResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListJobTemplatesResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListJobTemplatesResponse(od as api.ListJobTemplatesResponse);
     });
   });
@@ -2005,7 +2050,9 @@
   unittest.group('obj-schema-ListJobsResponse', () {
     unittest.test('to-json--from-json', () async {
       var o = buildListJobsResponse();
-      var od = api.ListJobsResponse.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.ListJobsResponse.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
@@ -2013,7 +2060,9 @@
   unittest.group('obj-schema-Manifest', () {
     unittest.test('to-json--from-json', () async {
       var o = buildManifest();
-      var od = api.Manifest.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Manifest.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkManifest(od as api.Manifest);
     });
   });
@@ -2021,7 +2070,9 @@
   unittest.group('obj-schema-MpegCommonEncryption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMpegCommonEncryption();
-      var od = api.MpegCommonEncryption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.MpegCommonEncryption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkMpegCommonEncryption(od as api.MpegCommonEncryption);
     });
   });
@@ -2029,7 +2080,9 @@
   unittest.group('obj-schema-MuxStream', () {
     unittest.test('to-json--from-json', () async {
       var o = buildMuxStream();
-      var od = api.MuxStream.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.MuxStream.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkMuxStream(od as api.MuxStream);
     });
   });
@@ -2037,7 +2090,9 @@
   unittest.group('obj-schema-NormalizedCoordinate', () {
     unittest.test('to-json--from-json', () async {
       var o = buildNormalizedCoordinate();
-      var od = api.NormalizedCoordinate.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.NormalizedCoordinate.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkNormalizedCoordinate(od as api.NormalizedCoordinate);
     });
   });
@@ -2045,7 +2100,9 @@
   unittest.group('obj-schema-OperationMetadata', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOperationMetadata();
-      var od = api.OperationMetadata.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.OperationMetadata.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkOperationMetadata(od as api.OperationMetadata);
     });
   });
@@ -2053,7 +2110,9 @@
   unittest.group('obj-schema-OriginUri', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOriginUri();
-      var od = api.OriginUri.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.OriginUri.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOriginUri(od as api.OriginUri);
     });
   });
@@ -2061,7 +2120,9 @@
   unittest.group('obj-schema-Output', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOutput();
-      var od = api.Output.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Output.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOutput(od as api.Output);
     });
   });
@@ -2069,7 +2130,9 @@
   unittest.group('obj-schema-Overlay', () {
     unittest.test('to-json--from-json', () async {
       var o = buildOverlay();
-      var od = api.Overlay.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Overlay.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkOverlay(od as api.Overlay);
     });
   });
@@ -2077,7 +2140,8 @@
   unittest.group('obj-schema-Pad', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPad();
-      var od = api.Pad.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.Pad.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkPad(od as api.Pad);
     });
   });
@@ -2085,7 +2149,9 @@
   unittest.group('obj-schema-PreprocessingConfig', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPreprocessingConfig();
-      var od = api.PreprocessingConfig.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PreprocessingConfig.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPreprocessingConfig(od as api.PreprocessingConfig);
     });
   });
@@ -2093,7 +2159,9 @@
   unittest.group('obj-schema-Progress', () {
     unittest.test('to-json--from-json', () async {
       var o = buildProgress();
-      var od = api.Progress.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.Progress.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkProgress(od as api.Progress);
     });
   });
@@ -2101,7 +2169,9 @@
   unittest.group('obj-schema-PubsubDestination', () {
     unittest.test('to-json--from-json', () async {
       var o = buildPubsubDestination();
-      var od = api.PubsubDestination.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.PubsubDestination.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkPubsubDestination(od as api.PubsubDestination);
     });
   });
@@ -2109,7 +2179,9 @@
   unittest.group('obj-schema-SampleAesEncryption', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSampleAesEncryption();
-      var od = api.SampleAesEncryption.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SampleAesEncryption.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSampleAesEncryption(od as api.SampleAesEncryption);
     });
   });
@@ -2117,7 +2189,9 @@
   unittest.group('obj-schema-SegmentSettings', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSegmentSettings();
-      var od = api.SegmentSettings.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SegmentSettings.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSegmentSettings(od as api.SegmentSettings);
     });
   });
@@ -2125,7 +2199,9 @@
   unittest.group('obj-schema-SpriteSheet', () {
     unittest.test('to-json--from-json', () async {
       var o = buildSpriteSheet();
-      var od = api.SpriteSheet.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.SpriteSheet.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkSpriteSheet(od as api.SpriteSheet);
     });
   });
@@ -2133,7 +2209,9 @@
   unittest.group('obj-schema-TextAtom', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextAtom();
-      var od = api.TextAtom.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextAtom.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextAtom(od as api.TextAtom);
     });
   });
@@ -2141,7 +2219,9 @@
   unittest.group('obj-schema-TextInput', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextInput();
-      var od = api.TextInput.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextInput.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextInput(od as api.TextInput);
     });
   });
@@ -2149,7 +2229,9 @@
   unittest.group('obj-schema-TextStream', () {
     unittest.test('to-json--from-json', () async {
       var o = buildTextStream();
-      var od = api.TextStream.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od =
+          api.TextStream.fromJson(oJson as core.Map<core.String, core.dynamic>);
       checkTextStream(od as api.TextStream);
     });
   });
@@ -2157,7 +2239,9 @@
   unittest.group('obj-schema-VideoStream', () {
     unittest.test('to-json--from-json', () async {
       var o = buildVideoStream();
-      var od = api.VideoStream.fromJson(o.toJson());
+      var oJson = convert.jsonDecode(convert.jsonEncode(o));
+      var od = api.VideoStream.fromJson(
+          oJson as core.Map<core.String, core.dynamic>);
       checkVideoStream(od as api.VideoStream);
     });
   });
